CDH6.1 升级Impala到3.4版本启用auto refresh metadata功能的问题及解决方法

1 篇文章 0 订阅
1 篇文章 0 订阅

我们尝试在CDH6.1版本中本中对Impala进行升级并启用自动刷新元数据的功能,期间碰到了一些问题,通过查看日志,源码,Google等方式最终解决了,用这篇文章稍作整理,以回馈社区。

主要参考的文档是:

[1]在CDH6.3中单独升级Impala到Apache Impala 3.4

[2]0757-6.3.3-如何配置impala自动同步HMS元数据

1.Impala编译过程中报 hadoop-lzo找不到

查看编译的脚本bin/bootstrap_system.sh 发现下面这条注释

#LZO is not needed to compile or run Impala, but it is needed for the data load

且由于我们环境中并没有使用到hadoop-lzo,把下面一段脚本注释掉,重新运行即可正常编译完成

echo ">>> Checking out Impala-lzo"
: ${IMPALA_LZO_HOME:="${IMPALA_HOME}/../Impala-lzo"}
if ! [[ -d "$IMPALA_LZO_HOME" ]]
then
  git clone --branch master https://github.com/cloudera/impala-lzo.git "$IMPALA_LZO_HOME"
fi

echo ">>> Checking out and building hadoop-lzo"

: ${HADOOP_LZO_HOME:="${IMPALA_HOME}/../hadoop-lzo"}
if ! [[ -d "$HADOOP_LZO_HOME" ]]
then
  git clone https://github.com/cloudera/hadoop-lzo.git "$HADOOP_LZO_HOME"
fi
cd "$HADOOP_LZO_HOME"
time -p ant package
cd "$IMPALA_HOME"

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

2.1 发现问题

在CDH6.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.3环境下搭建的,我在测试环境搭了一台单节点的CDH6.3.1, 起来后,同样的在新的CDH6.3.1环境中配置自动刷新元数据功能,发现了创建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"};

两者一对比,发现在CDH6.1.0的Hive中,message中缺少了dbJson这个字段

在IDEA中查找代码发现,确实是少了这个字段.

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

2.2 Hive升级到 2.1.1-cdh6.3.1版本

2.2.1 编译打包

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

git clone --single-branch --branch cdh6.3.1-release https://github.com/cloudera/hive.git hive

mvn clean package -DskipTests -Pdist

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

<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命令即可

<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.1-bin.tar.gz 文件

2.2.2 元数据备份

然后把这个文件拷贝到CDH集群,解压,对元数据进行升级,升级前进行元数据备份。

mysqldump -uroot  -ptest metastore > ./metastore.sql  

2.2.3 元数据升级

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

source $HIVE_6.3.1/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_VERSION的SCHEMA_VERSION信息,没有重大的变更。

2.2.4 更新Hive lib目录

再在 /opt/cloudera/parcels/CDH/lib/hive/目录下新建 lib631目录

mkdir /opt/cloudera/parcels/CDH/lib/hive/lib631

将CDH6.3.1的Hive的lib下的文件拷贝到lib631目录下

cp $HIVE_6.3.1/lib/* lib631/.

再修改hive脚本指定的lib目录

在94行,将 HIVE_LIB=${HIVE_HOME}/lib 改成 HIVE_LIB=${HIVE_HOME}/lib631

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

2.2.5 Hive升级验证

对Hive的功能进行验证,包括hive sql执行,hive udf测试, hive相关的组件(hbase impala sqoop)测试等

详细的可以参考如何在CDH集群中安装Hive2.3.3 及 0671-6.2.0-如何将CDH5.12的Hive元数据迁移到CDH6.2

2.3 Impala auto refresh metadata 功能验证

在完成上述一系列步骤后,最终验证一下 Impala auto refresh metadata功能是否是OK了。

由于Catalog收到了CREATE_DATBASE的异常,就停止了事件监听,需要重启下Impala相关的服务。

重启后执行以下的命令对impala auto refresh功能进行验证:

在hive 中执行

create database test_db2;

在impala 中执行

show databases;

若正常的显示,说明问题2已经解决。

3.总结

经过一番折腾,终于在CDH6.1环境中使用到了Impala 3.4,且启用了auto refresh metadata功能,其效果是显著的,不用我们再使用invalidate metadata定时的去刷新元数据了,减少了资源消耗,提高了Impala的稳定性。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值