我在将对象写入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。
任何想法可能会出现问题吗?
答案 0 :(得分:4)
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安装,以防它出错。