Java 加载avro架构时出现EOFEException
我正在尝试使用maven加载一个avro模式文件。我已经将avsc文件保存在我的类路径中,但是在运行它时我得到了EOFECTION。我知道问题是找不到模式文件,因为当我在代码中编写模式时,它运行得非常好。我需要一些帮助。提前谢谢 以下是跟踪:Java 加载avro架构时出现EOFEException,java,maven,hadoop,mapreduce,avro,Java,Maven,Hadoop,Mapreduce,Avro,我正在尝试使用maven加载一个avro模式文件。我已经将avsc文件保存在我的类路径中,但是在运行它时我得到了EOFECTION。我知道问题是找不到模式文件,因为当我在代码中编写模式时,它运行得非常好。我需要一些帮助。提前谢谢 以下是跟踪: [root@dev MapReduce]# hadoop jar target/MapReduce-0.0.1-SNAPSHOT.jar com.hadoop.bi.MapReduce.AvroScTest StringPair.avsc Exce
[root@dev MapReduce]# hadoop jar target/MapReduce-0.0.1-SNAPSHOT.jar com.hadoop.bi.MapReduce.AvroScTest StringPair.avsc
Exception in thread "main" java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2444)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2377)
at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1234)
at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1209)
at org.apache.avro.Schema$Parser.parse(Schema.java:931)
at org.apache.avro.Schema$Parser.parse(Schema.java:914)
at com.hadoop.bi.MapReduce.AvroScTest.main(AvroScTest.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
下面是我尝试加载模式的代码:
Schema.Parser parser = new Schema.Parser();
Schema schema =parser.parse(AvroScTest.class.getResourceAsStream(args[0]));
以下是项目的结构:
MapReduce
src
main
test
target
classes
MapReduce-0.0.1-SNAPSHOT.jar
pom.xml
StringPair.avsc
架构内容:
{
"type": "record",
"name": "StringPair",
"doc": "A pair of strings.",
"fields": [
{"name": "left", "type": "string"},
{"name": "right", "type": "string"}
]
}
您可以通过以下方式确定
StringPair.avsc
文件是否在您的jar中:
mvn tf MapReduce-0.0.1-SNAPSHOT.jar
(如果没有列出,maven可以将它简单地构建到jar中,如果您将它放在src/main/resources/StringPair.avsc
)
对于“由于输入结束而没有内容映射到对象”错误消息,我的神奇之处在于在文件名之前放一个斜杠,因为它位于jar的根目录中
Schema.Parser parser = new Schema.Parser();
Schema schema =parser.parse(AvroScTest.class.getResourceAsStream("/StringPair.avsc"));
从堆栈跟踪中,我看到json解析失败,您可以发布您的“StringPair.avsc”文件吗?它是否位于正确的位置?架构看起来是正确的,当您将其分配给作业时,是否可以尝试指定完整的文件路径?抱歉,我不知道问题出在哪里,但我会在您的代码中打印它:
新文件(args[0])。isFile()
。这将有助于缩小issuethanks@RomanI的范围,但我测试了它,这不是问题,因为它通过了测试。