您的位置:首页 > 运维架构

学习日志---hive的搭建与配置以及应用

2015-10-02 19:55 441 查看
Hive:数据仓库,其实就是写一些脚本代码(HQL),通过hive转换为java代码,在hadoop上运行。操作的是hdfs上的数据,写的HQL脚本转为mapreduce程序处理hdfs上的数据。
Hive:解释器,编译器,优化器等。解释HQL为java代码,然后编译,优化后放在hadoop上运行。

hive不是关系型数据库,不是后台的服务,它相当于是一个hadoop的客户端。

Hive:支持类似sql的查找,如果需要更改删除等操作,需要使用select语句查询出原始数据并且对源文件进行覆盖即可。

CLi
CLi是hive的指令,常用如下:
可通过 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli 去查看
To get help, run "
hive -H
" or "
hive --help
".
Usage (as it is in Hive 0.9.0):
usage: hive
-d,--define <key=value>          Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
-e <quoted-query-string>         SQL from command line
这个是在hive中执行一条sql指令
-f <filename>                    SQL from files
文件中存放的sql脚本,可执行
-H,--help                        Print help information
-h <hostname>                    Connecting to Hive Server on remote host
--hiveconf <property=value>   Use value for given property
--hivevar <key=value>         Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename>                    Initialization SQL file
设置hive的一些属性值等
-p <port>                        Connecting to Hive Server on port number
-S,--silent                      Silent mode in interactive shell
-v,--verbose                     Verbose mode (echo executed SQL to the
console)
注意:
第一:
配置hive的临时目录:因为hive运行时需要很多的临时目录,因此需要统一配置,否则会出错
[root@hadoop1 hive]# ls
bin  conf  examples  hcatalog  iotmp  lib  LICENSE  NOTICE  README.txt  RELEASE_NOTES.txt  scripts
如上,在hive下建iotmp目录,并把hive的配置文件hive-site.xml的${system:user...}的配置改为如下:
<property>
<name>hive.exec.local.scratchdir</name>
<value>/root/hive/iotmp/</value>
<description>Local scratch space for Hive jobs</description>
</property>
第二:
因为hive是运行在hadoop上的,因此jline的版本要匹配一致,hive1.2.1使用的是jline-2.12.jar,hadoop2.5使用的是0.9的版本,分别在:

/root/hadoop/share/hadoop/yarn/lib hadoop中
/root/hive/lib hive中
因此需要把hive的jline拷贝到hadoop的相应目录下。
再运行即可。

DDL(Hive Data Definition Language)+DML
DDL是hive的语句,例如创建表,修改表等。。
Hive创建的数据库,不是真正意义上的数据库,它是把hdfs上的文件转为关系型数据库的结构,这里需要一个映射关系,这种hdfs上文件与关系型结构之间的映射关系,称为元数据,这种映射关系在hive运行时,存储在一个关系型数据库中(Hive自带有),因此也可以说元数据存储在关系型数据库里。一般不要Hive自带的数据库(derby数据库),非常不稳定。
hive自带的数据库配置:(不使用)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>


安装mysql数据库:
在配好yum的基础上
yum install mysql-server  //安装
service mysqld start   //启动
netstat -nplt | grep 3306  //可以监听mysql的3306端口


mysql中可以对IP,用户名和密码进行设置,也就是设置远程登陆,要use mysql,这句的意思是进入mysql数据库,使用数据库的意思,在操作时,要选选择使用哪个数据库
例如:
grant all on *.* to root@'hadoop1' identified by '123456';
允许hadoop1这个ip用户登陆进行数据库的操作。

mysql-connector-jdbc.tar.gz解压后把jar包拷贝到hive的lib目录下,供hive使用。
因为hive要连接mysql数据库,因此需要更改hive-site.xml的配置:
connectionURL:连接mysql
connectionDriver:驱动类
username和password。

这样配置完成后,hive的作用是把HQL脚本转为mapreduce程序在hadoop上运行,其映射关系数据存在mysql中,真正的数据文件还是在hdfs上。
hive写sql,把hdfs上的文件数据映射到mysql的数据库中,mysql里有hive自己需要的tables。
在hive的bin目录下启动 ./hive
下面具体下DDL语言的使用:
基本的Hive操作流程:
通过hive见表,用hive的load去连接数据,hive会根据建立的表的结构拆分数据,把元数据存在mysql中,load的数据会传入到hdfs中,在hdfs中会见一个hive目录,里面有库和表的名字,里面有数据。映射关系也就是元数据存在mysql中。hive中的表结构与hdfs文件的映射关系存在mysql中。元数据是为hive工作时用的,hive有表名等,找映射关系,从而找文件内容。
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
操作hive时一定要先开启hadoop服务和mysql服务
在hive中建表,并且在load进去数据即可,load的数据可在hdfs中查到。
然后hive中运行HQL就能自动创建mapreduce程序对指定文件进行操作,如下:
//建表,建立表结构
hive> create table table_person (
> id int,
> name string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ',';
//导入数据,实际文件存入hdfs,映射关系存在mysql中
hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_person;
//执行HQL,转为mapreduce程序,在hadoop上运行
hive> select count(*) from table_person;
hive> desc table_person  //查看表结构
建表时,有partition功能,也就是分区,可以使得导入的文件按照指定的分区进行导入,也就是在hdfs上更具分区建立文件夹,文件夹下放的是文件。分区也就是在导入文件时可以多一层文件夹目录,方便分类。在hive中使用drop删除table时,对应的hdfs上的文件也就删除了,hive中的表和hdfs中的文件是对应关系的。hive就是建立一个表,通过表去导入数据进入hdfs,再操作表即可。
通过hive插入或者导入的数据,会在hdfs的对应文件夹下建立新的文件,除非使用overwrite。
hive> insert into table table_person values (5,'lanpishu');
在已有的表中插入数据,会在hdfs的相应文件夹下建立新的文件,存放新的数据。
hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_test PARTITION (time='20151002');
Loading data to table default.table_test partition (time=20151002)
Partition default.table_test{time=20151002} stats: [numFiles=1, numRows=0, totalSize=40, rawDataSize=0]
OK
Time taken: 1.21 seconds
hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_test PARTITION (time='20151003');
Loading data to table default.table_test partition (time=20151003)
Partition default.table_test{time=20151003} stats: [numFiles=1, numRows=0, totalSize=40, rawDataSize=0]
OK
Time taken: 0.461 seconds
根据同一个表导入两次数据,更具分区分别建立文件夹。
插入数据时,可在后面用select操作,把其他表中的数据提取出插入到新的表中,在hdfs中也就是把一个文件的某些数据提取出放入到新的文件中,提取过程就是mapreduce操作。如果建立表时有分区操作,在导入时要按区来导入。插入时也要指明区。

export和import操作:
这里的export是把hive中一个表对应的数据导出到hdfs中,一般hive操作把mapreduce的结果会存在另一个表中,继而可以导出到一个文件中。
EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])]
TO 'export_target_path'
https://cwiki.apache.org/confluence/display/Hive/LanguageManual

链接的Data Manipulation Statements,全是对应的操作。
group by 是分组,把整个表分成几组,可用于计数;
order by 是按某个特征来排序;
Limit 是指查询多少条,用于分页的, limit 0,2,从0开始查两条。

Hive执行HQL有三种方式:
hive -e 也就是在hive->命令行中操作,测试用;
hive -f 也就是在hive中执行HQL的脚本文件,里面有多条指令;
java代码去HQL。

使用hive作为服务端去运行(供外界java客户端直接访问,和访问mysql很像):

使用客户端去访问HIVE时,要把hive作为服务器上的服务来看待
./hive --service hiveserver2
启动hive作为服务。
启动的服务会默认监听10000端口,但是需要配置服务器监听的ip,如下:
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop1</value>
<description>Bind host on which to run the HiveServer2 Thrift service.</description>
</property>
及使用hadoop1这个ip,也就是网络接口去监听端口,这样外界才会访问。
[root@hadoop1 lib]# netstat -nplt | grep 10000
tcp        0      0 192.168.1.191:10000         0.0.0.0:*                   LISTEN      3324/java
这个可以查看端口。
可以使用hive自带的客户端beeline先测试访问:
[root@hadoop1 bin]# ./beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop1:10000/default
Connecting to jdbc:hive2://hadoop1:10000/default
Enter username for jdbc:hive2://hadoop1:10000/default: root
Enter password for jdbc:hive2://hadoop1:10000/default:
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000/default> show tables;
+---------------+--+
|   tab_name    |
+---------------+--+
| table_one     |
| table_person  |
| table_test    |
+---------------+--+
3 rows selected (2.145 seconds)
如果hive在运行时缺少jar包,可以在hive中使用add jar ..添加jar包。
在eclipse中运行时,导入hive的包和hadoop的common包以及log包即可。

HQL里可以自定义函数,例如count()就是一个函数;
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

hive有两种函数:UDF和UDAF
UDF:输入数据为一条数据,输出为一条数据;
UDAF:输入为多条数据,无输出限制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop