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 .
有什么想法可能会出错吗?
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,但我猜你可能只需找到 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
Run Code Online (Sandbox Code Playgroud)
尝试下载Avro 1.7.7并用下载的 jar 替换所有找到的 jar。我还会备份 Hadoop 安装,以防它出错。
| 归档时间: |
|
| 查看次数: |
2398 次 |
| 最近记录: |