草庐IT

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

咬尘归 2023-03-28 原文

1 问题

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

image.png

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

有关Zeppelin Phoenix 与 Trino jdk 版本不兼容问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  8. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  9. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐