Google Bigtable导出失败报java.lang.NoSuchMethodError,如何解决?
解决Bigtable导出Sequence Files时的Java NoSuchMethodError问题
你遇到的这个NoSuchMethodError确实是Java版本兼容性问题,根源在于java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer;这个方法是Java 9及以上才引入的——在Java 8中,ByteBuffer.position(int)方法的返回值是void,而不是ByteBuffer(Java 9+改成了链式调用的设计)。Bigtable Beam导出工具依赖的Hadoop相关类是基于Java 9+的API编译的,所以在Java 8环境下运行就会抛出这个错误。
针对Debian Stretch(9.4)环境下apt源没有高版本JRE的情况,你可以通过手动安装OpenJDK 11(长期支持版本)来解决,步骤如下:
步骤1:手动下载并解压OpenJDK 11二进制包
# 下载OpenJDK 11的Linux x64压缩包(长期支持版本) wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20%2B8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz # 解压到系统目录/usr/local下 sudo tar -xzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz -C /usr/local/ # 创建软链接,方便后续调用 sudo ln -s /usr/local/jdk-11.0.20+8 /usr/local/java11
步骤2:配置系统默认Java版本
使用update-alternatives工具将OpenJDK 11设置为系统默认Java:
# 添加Java可执行文件到备选列表 sudo update-alternatives --install /usr/bin/java java /usr/local/java11/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java11/bin/javac 100 # 选择默认Java版本 sudo update-alternatives --config java
在弹出的选项界面中,输入对应OpenJDK 11的编号(通常是2),按回车确认即可。
步骤3:验证版本切换成功
运行以下命令确认当前Java版本:
java -version
输出应该显示类似openjdk version "11.0.20" 2023-07-18的内容,说明切换成功。
步骤4:重新执行导出命令
现在你可以重新运行之前的Bigtable导出命令,应该就能正常执行,不会再抛出NoSuchMethodError了:
java -jar bigtable-beam-import-1.3.0-shaded.jar export \ --runner=dataflow \ --project=xx-may23 \ --bigtableInstanceId=xx0523\ --bigtableTableId=test1 \ --destinationPath=gs://xx0523/test1 \ --tempLocation=gs://xx0523/tmp2 \ --maxNumWorkers=3 \ --zone=us-east4-a
备选方案:用Dataflow容器镜像运行
如果不想修改系统的Java版本,也可以借助Google Cloud官方提供的Dataflow兼容容器来运行导出命令,完全规避本地Java版本冲突:
docker run --rm -v $HOME/.config/gcloud:/root/.config/gcloud \ gcr.io/cloud-dataflow/v1beta3/java-template-launcher:latest \ java -jar bigtable-beam-import-1.3.0-shaded.jar export \ --runner=dataflow \ --project=xx-may23 \ --bigtableInstanceId=xx0523\ --bigtableTableId=test1 \ --destinationPath=gs://xx0523/test1 \ --tempLocation=gs://xx0523/tmp2 \ --maxNumWorkers=3 \ --zone=us-east4-a
内容的提问来源于stack exchange,提问作者Norbert Kremer
相关产品推荐
相关产品推荐

