Java 加载avro架构时出现EOFEException

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

我正在尝试使用maven加载一个avro模式文件。我已经将avsc文件保存在我的类路径中,但是在运行它时我得到了EOFECTION。我知道问题是找不到模式文件,因为当我在代码中编写模式时,它运行得非常好。我需要一些帮助。提前谢谢

以下是跟踪:

    [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的范围,但我测试了它,这不是问题,因为它通过了测试。