nosuchmethoderror使用builder将avro对象写入hdfs

mi7gmzs6  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(799)

在将对象写入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() 在测试代码中根本不会导致任何问题。
jar正在hdfs节点上使用 hadoop jar 命令。
你知道这里出了什么问题吗?

p1tboqfb

p1tboqfb1#

parser.parse(字符串s,字符串。。。更多)直到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));

编辑:我从来没有尝试过在hadoop安装上升级avro,但是我想如果只是一个小版本的升级,你可以找到jar并手动替换它们。

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

尝试下载avro1.7.7并用下载的jar替换所有找到的jar。我也会备份hadoop安装,以防出错。

相关问题