Hive-2.1.1使用MySQL作为metastore配置过程
1. 上传apache-hive-2.1.1-bin.tar.gz并解压
# mkdir /root/Hive
# cd /root/Hive
# rz
通过弹出的“打开”对话框从宿主机上选择已经下载好的apache-hive-2.1.1-bin.tar.gz
# tar -xzvf apache-hive-2.1.1-bin.tar.gz
2. 配置profile
# vim /etc/profile
在文件最后添加如下配置
export HIVE_HOME=/root/Hive/hive-2.1.1
export PATH=$PATH:$ HIVE_HOME/bin:$HIVE_HOME/conf
# source /etc/profile
3. 拷贝配置文件
# cd /root/Hive/hive-2.1.1/conf
# cp hive-env.sh.template hive-env.sh
# cp hive-default.xml.template hive-site.xml
# cp hive-log4j2.properties.templatehive-log4j2.properties
# cp hive-exec-log4j2.properties.templatehive-exec-log4j2.properties
4. 为Hive创建HDFS目录
在Hive中创建表之前需要使用以下 HDFS 命令创建 /user/hive/tmp 和 /user/hive/warehouse(hive-site.xml 配置文件中属性项hive.exec.scratchdir和hive.metastore.warehouse.dir的默认值分别为/tmp和/user/hive/warehouse,对其进行修改)目录并给它们赋写权限。
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod g+w /user/hive/warehouse
hdfs dfs -chmod g+w /user/hive/tmp
hdfs dfs -chmod g+w /user/hive/log
5. 配置hive-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_112 ##Java路径
export HADOOP_HOME=/root/Hadoop/hadoop-2.7.3 ##Hadoop安装路径
export HIVE_HOME=/root/Hive/hive-2.1.1 ##Hive安装路径
export HIVE_CONF_DIR=/root/Hive/hive-2.1.1/conf ##Hive配置文件路径
6. 配置hive-site.xml
# mkdir /root/Hive/hive-2.1.1/tmp
# vim /root/Hive/hive-2.1.1/conf/hive-site.xml
替换hive-site.xml文件中的 ${system:java.io.tmpdir} 和 ${system:user.name}
全局替换命令先按Esc键,再同时按 shift+: 把以下替换命令粘贴按回车即可全局替换:
%s#${system:java.io.tmpdir}#/root/Hive/hive-2.1.1/tmp#g
%s#${system:user.name}#root#g
对hive-site.xml的如下配置进行修改
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
<!--用于存储不同 map/reduce 阶段的执行计划和这些阶段的中间输出结果-->
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
7. 执行初始化命令
由于Hive默认内嵌的是derby数据库,先使用默认的数据库运行
执行schematool-dbType derby -initSchema进行初始化
执行结果如下图:
如果出现如下错误
解决方法为 进入hive目录后rm -rfmetastore_db/
8. 执行命令hive
# hive
执行结果如下图:
如果出现如下错误
则解决方法为,执行第7步。
如果出现如下多重绑定警告
则解决办法为:
[[email protected] lib]# mv log4j-slf4j-impl-2.4.1.jarlog4j-slf4j-impl-2.4.1.jar-bac
9. Hive使用MySQL作为metastore
Hive的元数据存储有三种方式:内嵌式、本地式、远程式。三者的区别参考:http://f.dataguru.cn/thread-32711-1-1.html
按照之前的步骤配置使用的是内嵌式,接下来配置远程式。参考:http://www.cnblogs.com/linbingdong/p/5829369.html
9.1 创建hive元数据库和hive用户
以root用户进入mysql命令行:mysql -uroot -p(提示输入密码)
创建hive的元数据库:create database metahive【元数据库名metahive】
创建hive用户:create user [email protected]'localhost'identified by '××××'【创建的用户名为:userhive,密码为:××××】
赋予权限:grant allprivileges on metahive.* to userhive;
flush privileges;
登出root用户:quit;
使用hive用户登录mysql:mysql -uuserhive -p(提示输入密码)
登录后,showdatabases;可以看到有metahive这一数据库,OK!
9.2 为Hive创建HDFS目录
在Hive中创建表之前需要使用以下 HDFS 命令创建 /usr/hive/tmp 和 /usr/hive/warehouse (hive-site.xml配置文件中属性项hive.exec.scratchdir和hive.metastore.warehouse.dir的默认值分别为/tmp和/user/hive/warehouse,对其进行修改)目录并给它们赋写权限。
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
9.3 编辑hive-site.xml
# vim conf/hive-site.xml
9.3.1 metastore服务器配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/metahive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false</value>
<!--&是html中对&的转义字符-->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>userhive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mysql中用户userhive 密码</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/usr/hive/tmp</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive/warehouse</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<!--为true时,beeline和python通过hiveserver2访问hive执行SQL会报错-->
<!--N个月后,我把它改回了true,beeline和python依旧能访问,谁能告诉我why?-->
</property>
9.4 下载并拷贝MySQL的jar库到lib目录下
a) 下载地址https://dev.mysql.com/downloads/connector/j/
我是将mysql-connector-java-5.1.41.tar.gz下载到了windows上,所以需要执行rz命令,将其上传到master上
#rz
b) 解压
#tar –zxvf mysql-connector-java-5.1.41.tar.gz
c) 将解压后目录中的mysql-connector-java-5.1.41-bin.jar拷贝到hive的lib目录下
#cp mysql-connector-java-5.1.41/mysql-connector-java-5.1.41-bin.jarhive/lib
d) 删除mysql-connector-java-5.1.41.tar.gz和mysql-connector-java-5.1.41
#rm mysql-connector-java-5.1.41.tar.gz
#rm mysql-connector-java-5.1.41
e) 最后需要执行命令:# schematool -dbType mysql -initSchema
9.5 终端中执行命令hive
Hive元数据库使用远程模式,需要先启动metastore服务,在如上的配置中,master既为metastore服务器,又为hive客户端。
metastore服务器上输入:hive --servicemetastore &或nohup hive --service metastore > metastore.log 2>&1 &
后面的metastore启动命令与前面的相比优点是,当你关闭执行命令的终端后,metastore不关闭。
hive客户端上输入: hive
正确结果如下
9.6 Hive与HBase整合
如下命令实在hie中创建名为hbase_database的数据库:
hive> create database IF NOT EXISTShbase_database;
使用创建的数据库:
hive> use hbase_database;
如下命令是在hive中创建名称为 fileinfo的表,表中有四个字段:key、missionid、equipmentid、path,这四个字段的值分别来自于HBase中bigdata表的":key,labels:missionid,labels:equipmentid,labels:path"列。
CREATE EXTERNAL TABLE fileinfo(key string comment'行键', missionidstring comment'任务ID', equipmentid string comment '设备ID', path string comment '路径') comment '文件信息表'
STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" =":key,labels:fileinfo_missionid,labels:fileinfo_equipmentid,labels:path")
TBLPROPERTIES("hbase.table.name" ="bigdata", "hbase.mapred.output.outputtable" ="bigdata");
参考1:http://www.cnblogs.com/MOBIN/p/5704001.html
参考2:http://blog.****.net/hguisu/article/details/7256833
参考3:http://blog.****.net/lifuxiangcaohui/article/details/40588929
10. 将Master上安装的hive拷贝到所有的slave上,进行如下配置,那么所有的节点都可以执行hive命令了
$ vi ~/.bashrc 或 $ vi ~/etc/profile
添加如下内容:
export HIVE_HOME=/home/cloud/cloud/apache-hive-2.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
$ vi $HIVE_HOME/conf/hive-site.xml
进行如下修改:
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
如上配置虽然MySQL和Hive是安装在master上的,但是使用的远程模式。远程元存储的metastore服务和hive运行在不同的进程里。
我把slave3上的hive/conf/hive-site.xml中元数据库信息:javax.jdo.option.ConnectionURL、javax.jdo.option.ConnectionDriverName、javax.jdo.option.ConnectionPassword、javax.jdo.option.ConnectionUserName删除,那么slave3就是一个纯粹的hive客户端。因为hive.metastore.uris配置项的ip只有master,并且master上配置了完整的元数据库信息,所以master是metastore服务器。
这里MySQL提供元数据存储服务,master提供metastore服务,客户端执行hive命令。
11. 远程客户端使用Beeline通过hiveserver2访问hive
11.1 设置代理用户
修改hadoop 配置文件$HADOOP_HOME/etc/hadoop/core-site.xml,加入如下配置项
<property>
<name>hadoop.proxyuser.$SERVER_USER.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.$SERVER_USER.groups</name>
<value>*</value>
</property>
其中$SERVER_USER需要替换成拥有Hadoop权限的用户名,这里是root
否则远程客户端beeline会报如下错误:
图中最后一行报错,rootis not allowed to impersonate root (state=08S01,code=0),这句话中第一个root是Hadoop所有者用户,第二个root是在同种倒数第6行输入的hive metastore服务器上的mysql中的可以访问hive元数据的用户。
再看一张图,这是在另一个集群上没有设置代理时启动beeline连接hive的报错:
图中最后一行报错,cloudis not allowed to impersonate userhive (state=08S01,code=0),这句话中cloud是Hadoop所有者用户,userhive是hive metastore服务器上的mysql中的可以访问hive元数据的用户。对于这个集群修改core-site.xml 时$SERVER_USER就应该替换为cloud。
该错误参考:http://blog.****.net/fz1989/article/details/51489498
11.2 修改hive-site.xml
修改hive配置文件$HIVE_HOME/conf/hive-site.xml,添加如下配置
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
doAs为true表示以登录hiveserver2的用户身份执行hadoop job。
为false表示以启动hiveserver2进程的用户身份去执行hadoop job。
否则远程客户端通过beeline访问hive执行SQL回报如下错误
参考自:http://blog.zhaishidan.cn/2015/05/15/jie-jue-beelinelian-jie-hiveserver2zhi-xing-sqlbao-cuo-de-wen-ti/
N个月后,我把它改回了true,beeline和python依旧能访问,谁能告诉我why?
12. 遇到的困难及解决办法
12.1 执行hive,报错如下图:
原因:没有执行schematool-dbType mysql –initSchema
12.2 执行schematool -dbType mysql-initSchema报错如下:
解决办法参考http://www.cnblogs.com/xing901022/p/5775954.html
cd $HIVE_HOME/scripts/metastore/upgrade/derby
vim hive-schema-2.1.0.derby.sql
12.3 解决hive创建表时,字段的中文注释为乱码的bug
# vim conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/metahive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useUnicode=true&useSSL=false</value>
<description>JDBCconnect string for a JDBC metastore</description>
</property>
省略N步骤,详细见参考:
参考:https://my.oschina.net/jackieyeah/blog/742088
参考:http://lvxin1986.blog.51cto.com/4953500/1316747
12.4 执行hive --service metastore &出现如下警告:
解决办法:
# vim $HIVE_HOME/conf/hive-site.xml
查找javax.jdo.option.ConnectionURL,修改value为如下:
<value>jdbc:mysql://master:3306/metahive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useUnicode=true&useSSL=false</value>
其中红色部分为解决该警告的内容
12.5 执行hive,出现如下图The root scratch dir: /usr/hive/tmp on HDFS should be writable的错误
解决办法:hadoop fs-chmod 777 /usr/hive/tmp目录
12.6 客户端使用python通过impyla访问hive无法执行SQL,如下图
vim $HIVE_HOME/conf/hive-site.xml
修改如下:
4062 <property>
4063 <name>hive.server2.enable.doAs</name>
4064 <value>false</value>
4065 <description>
4066 Setting this property to true will have HiveServer2 execute
4067 Hive operations as the user making the calls to it.
4068 </description>
4069 </property>