相关文章推荐
近视的菠萝  ·  connecting wireless ...·  2 月前    · 
不拘小节的冲锋衣  ·  Err object | ...·  1 年前    · 
灰常酷的杯子  ·  调用free()时死机·  1 年前    · 
5. hive的安装配置
下载: apache-hive-2.0.0-bin.tar.gz
[root@db96 local]# tar -zxvf apache-hive-2.0.0-bin.tar.gz  -C /usr/local/
[root@db96 local]# cd /usr/local/
[root@db96 local]# ln -s /usr/local/ apache-hive-2.0.0-bin / hive
ln用于建立硬连接
ln -s 用于建立符号连接(又称软连接)
进入解压后的hive目录,进入conf
[root@db96 conf]# cp hive-env.sh.template hive-env.sh
[root@db96 conf]# cp hive-default.xml.template hive-site.xml
Hive的配置:
配置hive-env.sh  添加hadoop_home路径:
将export HADOOP_HOME前面的‘#’号去掉,
并让它指向您所安装hadoop的目录 (就是切换到这个目录下有hadoop的conf,lib,bin 等文件夹的目录),
export HADOOP_HOME=/root/hadoop/hadoop-2.6.4
其实在安装hive时需要指定HADOOP_HOME的原理基本上与
在安装Hadoop时需要指定JAVA_HOME的原理是相类似的。
Hadoop需要java作支撑,而hive需要hadoop作为支撑。
将export HIVE_CONF_DIR=/usr/hive/conf,并且把‘#’号去掉
将export HIVE_AUX_JARS_PATH=/usr/hive/lib
export HADOOP_HOME=/root/hadoop/hadoop-2.6.4
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
esc(键)
source  hive-env.sh(生效文件)
[root@db96 conf]# vim hive-env.sh
HADOOP_HOME=/usr/local/hadoop/
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
----------------------------------------------------------finish hive-env.sh
在修改之前,要相应的创建目录,以便与配置文件中的
路径相对应,否则在运行hive时会报错的。
mkdir -p /usr/hive/warehouse
mkdir -p /usr/hive/tmp
mkdir -p /usr/hive/log
进入hive安装目录下的conf文件夹下:
cp  hive-default.xml.template  hive-default.xml
这个文件中的配置项很多,篇幅也很长,所以要有耐心看。
当然也可以使用搜索匹配字符串的方式进行查找:
键入‘/hive.metastore.warehouse.dir’(回车)
就会锁定到所需要的字符串上。
其中有三处需要修改:
hive.metastore.warehouse.dir
/usr/hive/warehouse
这个是设定数据目录
-------------------------------------
hive.exec.scratdir
/usr/hive/tmp
这个是设定临时文件目录
--------------------------------------
//这个在笔者的文件中没有可以自己添加
hive.querylog.location
/usr/hive/log
这个是用于存放hive相关日志的目录
${system:java.io.tmpdir}/${system:user.name}
修改为 /usr/hive/log
其余的不用修改。
--------------------------------------finish hive-site.xml
cp hive-log4j.properties.template  hive-log4j.proprties
vi hive-log4j.properties
hive.log.dir=
这个是当hive运行时,相应的日志文档存储到什么地方
(mine:hive.log.dir=/usr/hive/log/${user.name})
hive.log.file=hive.log
property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name}
property. hive.log.dir=/usr/hive/log/${user.name}
这个是hive日志文件的名字是什么
默认的就可以,只要您能认出是日志就好,
只有一个比较重要的需要修改一下,否则会报错。
log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter
如果没有修改的话会出现:
WARNING: org.apache.hadoop.metrics.EventCounter is deprecated.
please use org.apache.hadoop.log.metrics.EventCounter  in all the  log4j.properties files.
(只要按照警告提示修改即可)。
-------------------------------------------------------finish all
接下来要配置的是以mysql作为存储元数据l数据库的hive的安装
要使用Hadoop来创建相应的文件路径,
并且要为它们设定权限:
hdfs dfs -mkdir -p  /usr/hive/warehouse
hdfs dfs -mkdir -p /usr/hive/tmp
hdfs dfs -mkdir -p /usr/hive/log
hdfs dfs -chmod g+w /usr/hive/warehouse
hdfs dfs -chmod g+w /usr/hive/tmp
hdfs dfs -chmod g+w /usr/hive/log
此种模式下是将hive的metadata存储在Mysql中,
Mysql的运行环境支撑双向同步或是集群工作环境,
这样的话,至少两台数据库服务器上会备份hive的元数据。
既然在derby模式下的hive已经能够成功运行,
这就说明在系统中关于hive配置文件中的参数是正确的,
即hive-env.sh 和 hive-env.sh这两个文件中的配置是对的。
继续配置hive-site.xml文件:
/user/hive/warehouse
hdfs://node0:9000/usr/hive/warehouse
hive.metastore.warehouse.dir
hdfs://node0:9000/usr/hive/warehouse
(这里就与前面的hdfs dfs -mkdir -p /usr/hive/warehouse相对应)
其中node0指的是笔者的NameNode的hostname;
hive.exec.scratchdir
hdfs://node0:9000/usr/hive/warehouse
/tmp/hive
hdfs://node0:9000/usr/hive/warehouse
//这个没有变化与derby配置时相同
hive.querylog.location
/usr/hive/log
${system:java.io.tmpdir}/${system:user.name}
/usr/hive/log
-------------------------------------
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNoExist=true
javax.jdo.option.ConnectionURL
这个参数使用来设置元数据连接字串
-------------------------------------
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionDriverName
关于在hive中用java来开发与mysql进行交互时,
需要用到一个关于mysql的connector,
这个可以将java语言描述的对database进行的操作,
转化为mysql可以理解的语句。
connector是一个用java语言描述的jar文件。
而这个connector可在官方网站上下载得到。
经证实即便connector与mysql的版本号不一致,
也可以实现相应的功能。
connector是要copy到/usr/hive/lib目录下面的。
cp  mysql-connector-java-5.1.1.18-bin  /usr/hive/lib
-------------------------------------
javax.jdo.option.ConnectorUserName
这个javax.jdo.option.ConnectionUserName
是用来设置hive存放的元数据的数据库(这里是mysql数据库)的用户名称的。
而这个‘hive‘可以根据用户自己的需要来自行设置
--------------------------------------
javax.jdo.option.ConnectionPassword
这个javax.jdo.option.ConnetionPassword是用来设置,
用户登录数据库的时候需要输入的密码的。
而这个‘hive’同样可以根据用户自己的需要来进行设置。
---------------------------------------- 到此原理介绍完毕,下面是我的具体操作:
[root@db96 conf]# vim hive-site.xml
hive.metastore.warehouse.dir
hdfs://db96:9000/hive/warehousedir
hive.exec.scratchdir
hdfs://db96:9000/hive/scratchdir
hive.querylog.location
/usr/local/hive/logs
javax.jdo.option.ConnectionURL
jdbc:mysql://192.168.8.96:3306/hive?createDatabaseIfNotExist=true
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
javax.jdo.option.ConnectionPassword
123456
hive.aux.jars.path
file:///usr/local/hive/lib/hive-hbase-handler-0.13.1.jar,file:///usr/local/hive/lib/protobuf-java-2.5.0.jar,file:///us
r/local/hive/lib/hbase-client-0.96.0-hadoop2.jar,file:///usr/local/hive/lib/hbase-common-0.96.0-hadoop2.jar,file:///usr/local
/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/guava-11.0.2.jar
hive.metastore.uris
thrift://192.168.8.96:9083
上面的配置中用到的jar包均在hbase/lib下,
[root@db96 lib]# pwd    //发现hive的lib目录下没有该文件。去hbase的lib下找到下面4个文件拷贝
//到hive的lib目录下。
/usr/local/hive/lib
[root@db96 lib]# ll protobuf-java-2.5.0.jar hbase-client-0.96.2-hadoop2.jar hbase-common-0.96.2-hadoop2.jar  guava-12.0.1.jar
ls: 无法访问protobuf-java-2.5.0.jar: 没有那个文件或目录
ls: 无法访问hbase-client-0.96.2-hadoop2.jar: 没有那个文件或目录
ls: 无法访问hbase-common-0.96.2-hadoop2.jar: 没有那个文件或目录
ls: 无法访问guava-12.0.1.jar: 没有那个文件或目录
[root@db96 lib]# pwd
/usr/local/hbase/lib
[root@db96 lib]# ll protobuf-java-2.5.0.jar hbase-client-0.96.2-hadoop2.jar hbase-common-0.96.2-hadoop2.jar  guava-12.0.1.jar
-rw-r--r-- 1 root root 1795932 12月 11 2013 guava-12.0.1.jar
-rw-r--r-- 1 root root  826678 3月  25 07:03 hbase-client-0.96.2-hadoop2.jar
-rw-r--r-- 1 root root  371546 3月  25 07:03 hbase-common-0.96.2-hadoop2.jar
-rw-r--r-- 1 root root  533455 12月 11 2013 protobuf-java-2.5.0.jar
[root@db96 lib]# cp protobuf-java-2.5.0.jar hbase-client-0.96.2-hadoop2.jar hbase-common-0.96.2-hadoop2.jar  guava-12.0.1.jar /usr/local/hive/lib
说明,其中的部分是配置与mysql连接的,因为hive需要用到关系型数据库来存储元信息,
目前只支持mysql,所以我们需要提前装好一个mysql,创建mysql时记得设置字符集为latin1,
否则后期建表会出问题。具体hive关联mysql的配置如下:
另外如果我们将来需要通过jdbc/odbc的方式来连接hive,需要启动metastore shfift,
因此必须配置hive.metastore.uris。而hive.aux.jars.path是与hbase整合的时候需要用到的jar包,必须加上。
启动之前先要创建hive元数据存放的路径文件:
[root@db96 ~]# hadoop fs -mkdir -p /hive/scratchdir
[root@db96 ~]# hadoop fs -mkdir /tmp
[root@db96 ~]# hadoop fs -ls /hive
[root@db96 ~]# hadoop fs -chmod -R g+w /hive/
[root@db96 ~]# hadoop fs -chmod -R g+w /tmp
基本配置完成后,接下来启动hive
hive 启动:
这个又可以分为启动metastore和hiveserver,其中metastore用于和mysql之间的表结构创建或更新时通讯,
hiveserver用于客户端连接,这两个都要启动,
启动MySQL:
创建hive连接的用户,和hive存放元数据的数据库,如下:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' IDENTIFIED BY '123456' ;
Query OK, 0 rows affected (0.09 sec)
mysql> create database hive default character set latin1;     //字符集必须是latian1,如果是utf8则很多hive元数据表无法创建。
Query OK, 1 row affected (0.01 sec)
具体的启动命令:
启动metastore:(远程mysql需要启动)
hive --service metastore -hiveconf hbase.zookeeper.quorum=db96,db98,db99
-hiveconf hbase.zookeeper.property.clientPort=2181
启动hiveservice:
hive --service hiveserver -hiveconf hbase.zookeeper.quorum=db96,db98,db99
-hiveconf hbase.zookeeper.property.clientPort=2181 //(启动服务,这样jdbc:hive就能连上,默认10000端口,后面的部分一定要带上,否则用eclipse连接不上的)
hive运行测试:
进入hive客户端,运行show table;查看表的情况。
create table test3(time string,amount string) row format delimited fields
terminated by '\t' lines terminated by '\n' stored as textfile;   创建本地表,非hbase对应表
CREATE TABLE hivetest(key int, val string) STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hivetest");来创建于hbase关联的表,
这样在hbase shell下也能看到,两笔新增数据都能实时看到。
hive> show tables;
Time taken: 0.696 seconds
hive> create table test(time string,amount string) row format delimited
fields terminated by '\t' lines terminated by '\n' stored as textfile;
Time taken: 0.672 seconds
hive> show tables;
test3
Time taken: 0.019 seconds, Fetched: 1 row(s)
hive> CREATE TABLE hivetest(key int, val string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hivetest");
Time taken: 2.264 seconds
hive> show tables;
hivetest
test3
Time taken: 0.034 seconds, Fetched: 2 row(s)
此时去hbase中我们已经能看到,我们刚才在hive中创建的表hivetest在hbase中能看到:
hbase(main):001:0> list
TABLE
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase-0.96.2-hadoop2/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop2/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See for an explanation.
hivetest
student
3 row(s) in 1.7040 seconds
=> ["hivetest", "student", "test"]
hbase(main):002:0>
到此,整个整合过程都完成了,你可以在linux用各种shell来测试,也可以通过eclipse连接到hive来测试,
和通过jdbc连接普通数据库一致,不过有一些注意分享给大家:
1.如果要insert与hbase整合的表,不能像本地表一样load,需要利用已有的表进行,
如insert overwrite table hivetest select * from test;
其中test的语句(create table test4(key int,val string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile; ),
注意类型要一致,否则用insert overwrite table hivetest select * from test; 导不进去数据
2.在hive中的 修改能同步反应到hbase中,但是如果在hbase中对新的列做了数据修改,
则不会反应到hive中,因为hive的原数据文件并没有更新。

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员