java.lang.VerifyError 将 S3 连接器与 Cloud Dataproc 结合使用时

java.lang.VerifyError when using S3 connector with Cloud Dataproc

我正在尝试使用 S3 connector with Google Cloud Dataproc,但遇到 java.lang.VerifyError。这似乎发生在我没有修改过的全新集群上。这是一个例子:

$ hadoop fs -ls s3://<my-bucket>/
Exception in thread "main" java.lang.VerifyError: Cannot inherit from final class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access0(URLClassLoader.java:73)
    ... (truncated stack trace) ...
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at org.apache.hadoop.fs.FsShell.main(FsShell.java:340)

如何解决此问题并将 S3 连接器与 Cloud Dataproc 结合使用?

出现此问题是因为 S3 连接器和 Google BigQuery Hadoop connector 之间存在 Apache HttpComponents 版本冲突。这是应该使用 Google BigQuery 连接器修复的问题。

同时,您可以删除 BigQuery 连接器作为修复。这将启用 使用 S3 连接器,但也会禁用 将 BigQuery 与 Cloud Dataproc 结合使用。要删除 BigQuery 连接器,请在创建 Cloud Dataproc 集群时使用 initialization action。下面是一个示例初始化操作,它将删除 BigQuery 连接器。

#!/bin/bash
"rm /usr/lib/hadoop/lib/bigquery-connector-0.7.2-hadoop2.jar"