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步。

如果出现如下多重绑定警告

则解决办法为:

[root@master 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 userhive@'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&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>

       <!--&amp;是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.csdn.net/hguisu/article/details/7256833

参考3:http://blog.csdn.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.csdn.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&amp;characterEncoding=UTF-8&amp;useUnicode=true&amp;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&amp;characterEncoding=UTF-8&amp;useUnicode=true&amp;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>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值