Hive1Hive2整合

Posted 一木呈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive1Hive2整合相关的知识,希望对你有一定的参考价值。

1 需求

背景生产环境平滑升级,同一台主机部署两套版本的Hive服务,平滑切割。采用不同Hive命令(hive1hive2)进行Cli交互保证hive老版本正常使用,hive2新特性正常使用。处理方案元数据隔离、环境变量(CLASSPATH)隔离、hdfs文件存储隔离。

Hive两个版本分别是1.2.22.3.2;测试环境已存在hive1直接部署hive2



2 实施步骤

Hive1.2.2已存在hadoop001主机中配置保持不变直接部署hive2.3.2控制环境变量和相关配置进行隔离

2.1 环境变量隔离

我们只对外暴露HIVE_HOMEHIVE2_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_HOMEhive1.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.2hive-site.xml

<property>

   <name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://hadoop001:3306/hive1?useUnicode=true&amp;characterEncoding=UTF8&amp;createDatabaseIfNotExist=true&amp;useSSL=false</value>

</property>

 

Hive2.3.2hive-site.xml

<property>

     <name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://hadoop002:3306/hive?useUnicode=true&amp;characterEncoding=UTF8&amp;createDatabaseIfNotExist=true&amp;useSSL=false</value>

</property>

 

2.3 Hdfs底层存储隔离

避免建相同库名或者defaut库下相同表产生不必要的冲突,hive1hive2存储的根目录配置:

Hive1.2.2hive-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.2hive-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)

SpringBoot:Mybatis整合PostgreSQL

SSM整合:Spring整合Mybatis

[SpringBoot系列]SpringBoot如何整合SSMP