Hive1Hive2整合
Posted 一木呈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive1Hive2整合相关的知识,希望对你有一定的参考价值。
1 需求
背景生产环境平滑升级,同一台主机部署两套版本的Hive服务,平滑切割。采用不同Hive命令(hive1、hive2)进行Cli交互保证hive老版本正常使用,hive2新特性正常使用。处理方案元数据隔离、环境变量(CLASSPATH)隔离、hdfs文件存储隔离。
Hive两个版本分别是1.2.2、2.3.2;测试环境已存在hive1直接部署hive2
2 实施步骤
Hive1.2.2已存在hadoop001主机中配置保持不变直接部署hive2.3.2控制环境变量和相关配置进行隔离
2.1 环境变量隔离
我们只对外暴露HIVE_HOME和HIVE2_HOME两个环境变量,其他CLASSPATH依赖的环境变量由脚本控制加载。Hive1.2.2的环境变量保持不变
目录环境:
[hadoop@hadoop-1 core]$ pwd /opt/beh/core [hadoop@hadoop-1 core]$ ls hadoop hive1 hive2 jdk8 zookeeper [hadoop@hadoop-1 core]$echo $HIVE_HOME /opt/beh/core/hive1 |
Hive启动加载环境变量过程:
. $bin/hive-config.sh
if [[ -z $HIVE_HOME ]] ; then
export HIVE_HOME=`dirname"$bin"`
fi
exportHIVE_CONF_DIR="${HIVE_CONF_DIR:-$HIVE_HOME/conf}"
exportHIVE_AUX_JARS_PATH=$HIVE_AUX_JARS_PATH
exportHADOOP_HEAPSIZE=${HADOOP_HEAPSIZE:-256}
.${HIVE_CONF_DIR}/hive-env.sh
export HADOOP_HEAPSIZE=2048
export HADOOP_HOME=/opt/beh/core/hadoop
export HIVE_CONF_DIR=${HIVE_HOME}/conf
CLASSPATH="${HIVE_CONF_DIR}"
HIVE_LIB=${HIVE_HOME}/lib
for f in ${HIVE_LIB}/*.jar;do
CLASSPATH=${CLASSPATH}:$f;
done
for f in${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-distcp-*.jar; do
exportHADOOP_CLASSPATH=${HADOOP_CLASSPATH}:$f;
done
~
针对hive2.3.2添加HIVE2_HOME,修改其启动脚本${HIVE2_HOME}/bin/hive(hive的相关服务启动都是以此脚本为入口):
Hadoop可以公用可以忽略,HIVE_HOME由$bin/hive-config.sh此脚本加载,根据脚本位置可以推出HIVE_HOME也就是配置PATH就可以了,但是HIVE_HOME被hive1.2.2占用,在此脚本前加上。
HIVE_HOME=${HIVE2_HOME}
unsetCLASSPATH(hive1.2.2$bin/hive-config.sh也加上此语句)
修改命令:
[hadoop@hadoop-1 dirs]$more hive1 hive2 :::::::::::::: hive1 :::::::::::::: #!/usr/bin/env bash #HIVE VERSION export HIVE_VERSION=1.2.2 exportHIVE_HOME=$BEH_HOME/core/hive1 exportPATH=$HIVE_HOME/bin:$PATH :::::::::::::: hive2 :::::::::::::: #!/usr/bin/env bash #HIVE VERSION export HIVE2_VERSION=2.3.2 exportHIVE2_HOME=$BEH_HOME/core/hive2 exportPATH=$HIVE2_HOME/bin:$PATH
[hadoop@hadoop-1 ~]$ echo$PATH /opt/beh/core/hive2/bin:/opt/beh/core/hive1/bin:/opt/beh/core/hadoop/bin:/opt/beh/core/hadoop/sbin:/opt/beh/core/zookeeper/bin:/opt/beh/core/jdk8/bin:/opt/beh/core/jdk8/jre/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hadoop/.local/bin:/home/hadoop/bin:/home/mysql/bin |
Hive($HIVE_HOME/bin/hive)对应修改成hive1 和hive2 同时对应修改beelinehiveserver2 hplsql metatool schematool等服务脚本
2.2 元数据隔离
Hive的元数据选择存储在mysql数据库中,隔离方式可以是同一个mysql数据库指定不同的库或者部署两套mysql服务。我们这里是选择部署两套mysql数据库进行隔离。
Hive1.2.2的hive-site.xml
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop001:3306/hive1?useUnicode=true&characterEncoding=UTF8&createDatabaseIfNotExist=true&useSSL=false</value> </property> |
Hive2.3.2的hive-site.xml
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop002:3306/hive?useUnicode=true&characterEncoding=UTF8&createDatabaseIfNotExist=true&useSSL=false</value> </property> |
2.3 Hdfs底层存储隔离
避免建相同库名或者defaut库下相同表产生不必要的冲突,hive1和hive2存储的根目录配置:
Hive1.2.2的hive-site.xml
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive1/warehouse</value> <description>location of defaultdatabase for the warehouse</description> </property> |
Hive2.3.2的hive-site.xml
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive2/warehouse</value> <description>location of defaultdatabase for the warehouse</description> </property> |
2.4 日志文件隔离
修改hive-log4j.properties hive-exec-log4j.properties
hive.log.dir=/opt/beh/logs/hive1/${user.name}
hive.log.file=${user.name}-hive.log
3 测试
3.1 Hive2的hiveserver2服务
nohup hive --servicemetastore >> sm.log &
nohup hive --servicehiveserver2 >> sh.log &
3.2 Hive2的beeline连接
[hadoop@hadoop-1 cdy]$beeline -u "jdbc:hive2://hadoop001:10000/test" -n hadoop -pbonchadoop --color true --headerInterval=1000 --maxColumnWidth=50 SLF4J: Class path containsmultiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/beh/core/hive2/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in[jar:file:/opt/beh/core/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Seehttp://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is oftype [org.apache.logging.slf4j.Log4jLoggerFactory] Connecting tojdbc:hive2://hadoop001:10000/test Connected to: Apache Hive(version 2.3.2) Driver: Hive JDBC (version2.3.2) Transaction isolation:TRANSACTION_REPEATABLE_READ Beeline version 2.3.2 byApache Hive 0:jdbc:hive2://hadoop001:10000/test> |
3.3 Hive1测试关联查询
4 问题
4.1 Hive2服务依赖service metastore守护进程
hive (default)> showdatabases; FAILED: SemanticExceptionorg.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException:Unable to instantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient |
处理启动metastore服务:nohup hive2 --servicemetastore >> sm.log &
4.2 Hive Authorization认证失败
Unknown HS2 problem whencommunicating with Thrift server. Error: Could not openclient transport with JDBC Uri: jdbc:hive2://hadoop001:10000/test: Peerindicated failure: Error validating the login (state=08S01,code=0) Caused by: java.io.FileNotFoundException: /opt/beh/core/hive/conf/hive.server2.users.conf |
修改hive-site.xml文件修改至正确路径:
<property>
<name>hive.server2.custom.authentication.file</name>
<value>/opt/beh/core/hive2/conf/hive.server2.users.conf</value>
</property>
修改hiveserver2的相关属性主机端口
以上是关于Hive1Hive2整合的主要内容,如果未能解决你的问题,请参考以下文章
SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)
SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQSpringBoot 整合 RabbitMQSpringBoot 整合 Kafka)
SpringBoot——整合SSM(主要整合MyBatis)