NoSuchMethodError使用Builder将Avro对象写入HDFS

时间:2015-07-28 21:36:13

标签: java scala hadoop 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)

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

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 ..........

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

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

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

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

任何想法可能会出现问题吗?

1 个答案:

答案 0 :(得分:4)

直到Avro 1.7.5才引入

org.apache.avroSchema.Parser.parse(String s, String... more)。注意它在1.7.4 Schema.Parser documentation中的缺席。更新您的HDFS节点以使用更新版本的Avro,或者像current 1.7 version of Schema一样自己加入字符串,并使用采用单个字符串的方法:

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

编辑: 我从来没有尝试过在Hadoop安装上升级Avro,但我猜你可能只是找到罐子并手动更换它们,如果它是次要的版本升级。

~/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

尝试下载Avro 1.7.7并将所有已发现的jar替换为已下载的jar。我也会备份Hadoop安装,以防它出错。

相关问题