Zeppelin Phoenix 与 Trino jdk 版本不兼容问题

内容分享1天前发布
0 0 0

1 问题

Zeppelin 部署 Trino 解释器,升级了 jdk 11,升级后 phoenix 解释器查询报错.
查看 Zeppelin phoenix interpreter 日志,显示 Unexpected version format: 11.0.12

Zeppelin Phoenix 与 Trino jdk 版本不兼容问题

2 问题分析

现象看是升级 jkd 11后带来的问题,异常栈显示 org.apache.hadoop.hbase.util.ClassSize 这个类在初始化的时候,提示当前 jdk 11.0.12 的版本号 Unexpected。
查看源码这个类所在的包为:hbase-common.jar,可能在两个地方引入:

  • $HBASE_HOME/lib 下
  • Zeppelin Phoenix 解释器 UI 上配置的依赖包: /data/cdh/phoenix-client.jar

通过反编译工具分别查看这两个 jar,发现里面都有一段 jdk 版本号的检查代码,只匹配 1.x.x 的版本号,不能匹配 11.x.x

 Verify String looks like this: 1.6.0_29
    if (!version.matches("\d\.\d\..*")) {
      throw new RuntimeException("Unexpected version format: " + version);
    }

后来查到这是一个 issue HBASE-17944,patch 内容是直接删除了这段校验代码。修复版本有:1.4.0, 1.2.6, 1.3.2, 1.1.11, 2.0.0

经过查询,Phoenix Client 直接把 hbase common 打进 jar 了,所以应该直接更新 Phoenix Client 这个包即可。

3 解决

无需重新编译源码,直接替换 phoenix-client.jar 中的 ClassSize.class:

  1. 依据 issue 提议,下载修复版本的 hbase-common.jar。 使用的版本是 1.1.11,由于当前 hbase 大版本是 1.x
  2. 解压下载的 jar : jar -xvf hbase-common-1.1.11.jar
  3. 删除 phoenix-client.jar 中的 ClassSize.class:zip -d phoenix-client.jar org/apache/hadoop/hbase/util/ClassSize.class
  4. 把修复的 class文件打入 jar:zip phoenix-client.jar org/apache/hadoop/hbase/util/ClassSize.class
  5. 重启 phoenix interpreter

4 Java 相关小技巧

Java jar class 反编译工具

  • 静态 class 文件,可以通过一个国外大神写的小工具反编译
    使用方法参考
    java -jar cfr-0.152.jar --extraclasspath hbase-common.jar org/apache/hadoop/hbase/util/ClassSize.class

  • 运行时加载的 class,可以通过 althas 反编译,教程参考 althas 文档

jar 中配置文件修改
可以直接 vim jar,通过 enter 选中问题件,直接 vim 编辑 jar 里面的文件

jar 如何解压
直接 jar -xvf xx.jar

jar 中更新(删除,新增)文件方法
1 先删除 zip -d xx.jar todeletefile1 todeletefile2
2 把新的文件打进去 zip xx.jar newfile1 newfile2

© 版权声明

相关文章

暂无评论

none
暂无评论...