NoSuchMethodError 使用 Builder 将 Avro 对象写入 HDFS
NoSuchMethodError writing Avro object to HDFS using Builder
我在将对象写入 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。
知道这里可能出了什么问题吗?
org.apache.avroSchema.Parser.parse(String s, String... more) was not introduced until Avro 1.7.5. Notice its absence in the 1.7.4 Schema.Parser documentation. Either update your HDFS node to use a more recent version of Avro, or join the Strings yourself like how the 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,但我想如果是次要版本升级,您可能只能找到 jars 并手动替换它们。
~/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 安装以防它出错。
我在将对象写入 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。
知道这里可能出了什么问题吗?
org.apache.avroSchema.Parser.parse(String s, String... more) was not introduced until Avro 1.7.5. Notice its absence in the 1.7.4 Schema.Parser documentation. Either update your HDFS node to use a more recent version of Avro, or join the Strings yourself like how the 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,但我想如果是次要版本升级,您可能只能找到 jars 并手动替换它们。
~/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 安装以防它出错。