NoSuchMethodError使用Builder将Avro对象写入HDFS

jim*_*rra 6 java hadoop scala hdfs avro

在将对象写入HDFS时,我遇到了这个异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.avro.Schema$Parser.parse(Ljava/lang/String;[Ljava/lang/String;)Lorg/apache/avro/Schema;
        at com.blah.SomeType.<clinit>(SomeType.java:10)
Run Code Online (Sandbox Code Playgroud)

它在生成的代码中引用的行是这样的:

public class SomeType extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse ..........
Run Code Online (Sandbox Code Playgroud)

我的代码中的调用是这样的:

val someTypeBuilder = SomeType.newBuilder()
      .setSomeField("some value")
      // set a whole load of other fields
Run Code Online (Sandbox Code Playgroud)

调用newBuilder()测试代码不会导致任何问题.

使用该hadoop jar命令在HDFS节点上运行jar .

有什么想法可能会出错吗?

hee*_*nee 5

org.apache.avroSchema.Parser.parse(String s, String... more)直到 Avro 1.7.5 才被引入。请注意它在1.7.4 Schema.Parser 文档中的缺失。要么更新您的 HDFS 节点以使用更新版本的 Avro,要么像当前 1.7 版本的 Schema一样自己加入字符串,并使用采用单个字符串的方法:

public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse(String.join("", prevArg1, prevArg2));
Run Code Online (Sandbox Code Playgroud)

编辑:我从来没有尝试过在 Hadoop 安装上升级 Avro,但我猜你可能只需找到 j​​ars 并手动替换它们,如果它是一个小版本升级。

~/dev/hadoop/hadoop-2.7.1$ find . -name '*avro*.jar'
./share/hadoop/tools/lib/avro-1.7.4.jar
./share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/avro-1.7.4.jar
./share/hadoop/common/lib/avro-1.7.4.jar
./share/hadoop/mapreduce/lib/avro-1.7.4.jar
./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/avro-1.7.4.jar
Run Code Online (Sandbox Code Playgroud)

尝试下载Avro 1.7.7并用下载的 jar 替换所有找到的 jar。我还会备份 Hadoop 安装,以防它出错。