改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

cdh611的hive升级到CDH632的hive

ckckck2025年1月10日36 浏览

1. 在Hive创建数据库的情况下,Impala无法自动刷新元数据

1.1 发现问题

在CDH 6.1版本下创建数据库,例如在Hive中执行create database test_db;,然后在Impala中执行show databases;,发现test_db并未显示,说明test_db没有刷新到Impala的Catalog中。通过查找Impala Catalog的role log,发现以下异常日志:

复制代码
Unexpected exception received while processing event  
Java exception follows:  
org.apache.impala.catalog.events.MetastoreNotificationException: EventId: 591869 EventType: CREATE_DATABASE Database object is null in the event. This could be a metastore configuration problem. Check if hive.metastore.notifications.add.thrift.objects is set to true in metastore configuration  
    at org.apache.impala.catalog.events.MetastoreEvents$CreateDatabaseEvent.<init>(MetastoreEvents.java:1108)  
    at org.apache.impala.catalog.events.MetastoreEvents$CreateDatabaseEvent.<init>(MetastoreEvents.java:1089)  
    at org.apache.impala.catalog.events.MetastoreEvents$MetastoreEventFactory.get(MetastoreEvents.java:168)  
    at org.apache.impala.catalog.events.MetastoreEvents$MetastoreEventFactory.getFilteredEvents(MetastoreEvents.java:205)  
    at org.apache.impala.catalog.events.MetastoreEventsProcessor.processEvents(MetastoreEventsProcessor.java:601)  
    at org.apache.impala.catalog.events.MetastoreEventsProcessor.processEvents(MetastoreEventsProcessor.java:513)  
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)  
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)  
    at java.lang.Thread.run(Thread.java:748)  
Caused by: java.lang.NullPointerException  
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)  
    at org.apache.impala.catalog.events.MetastoreEvents$CreateDatabaseEvent.<init>(MetastoreEvents.java:1106)  
    ... 12 more

重要部分在于:CREATE_DATABASE Database object is null in the event. This could be a metastore configuration problem. Check if hive.metastore.notifications.add.thrift.objects is set to true in metastore configuration。虽然我们已经配置了这个参数,但并未生效。在元数据库metastore的notification_log中查到这个event的message:

复制代码
{"server":"","servicePrincipal":"","db":"test_db","timestamp":1622247221,"location":"hdfs://nameservice1/user/hive/warehouse/test_db.db","ownerType":"USER","ownerName":"admin"}

由于参考资料[2]是在CDH 6.3.2环境下搭建的,我在测试环境搭建了一台单节点的CDH 6.3.2,启动后,同样的在新的CDH 6.3.2环境中配置自动刷新元数据功能,发现创建database的message为:

复制代码
{"server":"","servicePrincipal":"","db":"test_db","dbJson":"{"1":{"str":"davie_test"},"3":{"str":"hdfs://nameservice1/user/hive/warehouse/test_db.db"},"6":{"str":"admin"},"7":{"i32":1},"9":{"i32":1622248258}}","timestamp":1622248259,"location":"hdfs://nameservice1/user/hive/warehouse/davie_test.db","ownerType":"USER","ownerName":"admin"};

两者对比发现,在CDH 6.1.0的Hive中,message中缺少了dbJson字段。在IDEA中查找代码发现,确实是少了这个字段。

缺少dbJson字段

想要解锁Impala元数据自动刷新功能,只能再升级一下Hive了。

2. Hive升级到2.1.1-cdh6.3.2版本

2.1 编译打包

具体步骤是下载Cloudera Hive代码,然后编译打包:

bash 复制代码
git clone --single-branch --branch cdh6.3.2-release https://github.com/cloudera/hive.git hive  
mvn clean package -DskipTests -Pdist

在编译过程中,发现有些Cloudera的包下载不下来,需要添加mirror:

xml 复制代码
<repository>  
  <id>nexus-aliyun</id>  
  <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
  <name>nexus-aliyun</name>  
  <snapshots>  
    <enabled>false</enabled>  
  </snapshots>  
</repository>  
<repository>  
  <id>cloudera-repos</id>  
  <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>  
  <name>CDH Releases Repository</name>  
  <snapshots>  
    <enabled>false</enabled>  
  </snapshots>  
</repository>

Maven下载依赖的过程中,发现Hbase的依赖javax.el一直下载不下来,报以下错误:

复制代码
Could not find artifact org.glassfish:javax.el:pom:3.0.1-b06-SNAPSHOT

pom.xml文件中添加javax.el的dependency并指定版本,重新运行maven命令即可:

xml 复制代码
<glassfish.el.version>3.0.1-b06</glassfish.el.version>  
<dependency>  
    <groupId>org.glassfish</groupId>  
    <artifactId>javax.el</artifactId>  
    <version>${glassfish.el.version}</version>  
</dependency>

正常编译好后,可以在hive/packaging/target目录下看到apache-hive-2.1.1-cdh6.3.2-bin.tar.gz文件。

编译结果

2.2 元数据备份

将该文件拷贝到CDH集群,解压,对元数据进行升级,升级前进行元数据备份:

bash 复制代码
mysqldump -uroot -ptest metastore > ./metastore.sql

2.3 元数据升级

备份完成后登录metastore元数据库,运行以下命令对CDH 6.1.0的元数据进行升级:

sql 复制代码
source $HIVE_6.3.2/scripts/metastore/upgrade/mysql/upgrade-2.1.1-cdh6.1.0-to-2.1.1-cdh6.2.0.mysql.sql

查看upgrade-2.1.1-cdh6.1.0-to-2.1.1-cdh6.2.0.mysql.sql脚本,发现只是对DBS表新增了一个CREATE_TIME字段,并更新了一些CDH_VERSIONSCHEMA_VERSION信息,没有重大变更。

2.4 更新Hivelib目录

/opt/cloudera/parcels/CDH/lib/hive/目录下新建lib632目录:

bash 复制代码
mkdir /opt/cloudera/parcels/CDH/lib/hive/lib632
新建lib632目录

将CDH 6.3.2的Hive的lib下的文件拷贝到lib632目录下:

bash 复制代码
cp -r /root/cdh-hive-cdh6.3.2-release/packaging/target/apache-hive-2.1.1-cdh6.3.2-bin/apache-hive-2.1.1-cdh6.3.2-bin/lib/* /opt/cloudera/parcels/CDH-6.1.1-1.cdh6.1.1.p0.875250/lib/hive/lib632/

修改Hive脚本指定的lib目录:

bash 复制代码
vim /opt/cloudera/parcels/CDH-6.1.1-1.cdh6.1.1.p0.875250/lib/hive/bin/hive

在第94行,将HIVE_LIB=${HIVE_HOME}/lib改为HIVE_LIB=${HIVE_HOME}/lib632

修改Hive脚本

完成之后,在CM上重启Hive相关的服务。

2.5 Hive升级验证

对Hive的功能进行验证,包括Hive SQL执行、Hive UDF测试、Hive相关的组件(HBase、Impala、Sqoop)测试等。

2.6 升级后的版本查看

升级后的版本

3. 问题解决

升级后,计算引擎切换到Spark的跑任务使用count或其他函数时,报错处理Remote Spark Driver to HiveServer2 Connection,错误信息如下:

复制代码
Received error message: io.netty.handler.codec.DecoderException: org.apache.hive.com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException: Index: 109, Size: 6
Serialization trace:
错误信息

主要是因为Spark引入的还是CDH 6.1.1的Hive的exec包。

CDH 6.1.1的Hive包

只需要将CDH 6.1.1的Hive包exec在Spark的Hive文件夹中更新为CDH 6.3.2的即可。

更新Hive包

end