java.io.IOException:不是数据文件

时间:2015-11-01 19:08:00

标签: hadoop apache-spark avro

我正在处理一堆avro文件,这些文件存储在HDFS的嵌套目录结构中。文件以年/月/日/小时格式目录结构存储。

我写了这个简单的代码来处理

sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive","true")
val rootDir = "/user/cloudera/rootDir"
val rdd1 = sc.newAPIHadoopFile[AvroKey[GenericRecord], NullWritable, AvroKeyInputFormat[GenericRecord]](rootDir)
rdd1.count()

我得到了一个我在下面粘贴的例外。我面临的最大问题是它没有告诉我哪个文件不是数据文件。因此,我将不得不进入HDFS并扫描1000个文件,以查看哪个文件不是数据文件。

有更有效的方法来调试/解决这个问题吗?

5/11/01 19:01:49 WARN TaskSetManager: Lost task 1084.0 in stage 14.0 (TID 11562, datanode): java.io.IOException: Not a data file.
    at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:102)
    at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:97)
    at org.apache.avro.mapreduce.AvroRecordReaderBase.createAvroFileReader(AvroRecordReaderBase.java:183)
    at org.apache.avro.mapreduce.AvroRecordReaderBase.initialize(AvroRecordReaderBase.java:94)
    at org.apache.spark.rdd.NewHadoopRDD$$anon$1.<init>(NewHadoopRDD.scala:133)
    at org.apache.spark.rdd.NewHadoopRDD.compute(NewHadoopRDD.scala:104)
    at org.apache.spark.rdd.NewHadoopRDD.compute(NewHadoopRDD.scala:66)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:68)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
    at org.apache.spark.scheduler.Task.run(Task.scala:64)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

3 个答案:

答案 0 :(得分:2)

群集中位于其中的一个节点已关闭。因此没有找到数据,这会产生错误。解决方案是修复并启动集群中的所有节点。

我使用avro输入的Java map reduce程序得到了下面的确切错误。以下是该问题的概述。

Error: java.io.IOException: Not a data file.    at
org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:102)
at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:97)
at org.apache.avro.mapreduce.AvroRecordReaderBase.createAvroFileReader(AvroRecordReaderBase.java:183)   at
org.apache.avro.mapreduce.AvroRecordReaderBase.initialize(AvroRecordReaderBase.java:94) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:548)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:786)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)   at
org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)    at
 java.security.AccessController.doPrivileged(Native Method)     at javax.security.auth.Subject.doAs(Subject.java:422)   at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

我决定捕获该文件,因为我能够在HDFS的同一文件夹中的另一个文件上运行程序并接收以下内容。

INFO hdfs.DFSClient: No node available for <Block location in your
cluster> from any node: java.io.IOException: No live nodes contain
 block BP-6168826450-10.1.10.123-1457116155679:blk_1073853378_112574
 after checking nodes = [], ignoredNodes = null No live nodes contain
 current block Block locations: Dead nodes: . Will get new block
 locations from namenode and retry...

我们的群集遇到了一些问题,不幸的是有些节点出现问题。解决问题后,此错误已解决

答案 1 :(得分:0)

我在地图缩减工作中阅读avro文件时遇到了同样的错误。稍微研究一下,我发现MapTasks失败的avro文件都是零字节avro文件。看起来MapReduce无法处理零字节文件。

答案 2 :(得分:0)

在我的情况下,我试图使用DataFileReader读取数据,该数据期望数据采用某种格式(使用DataFileWriter编写),但是我的数据文件是手工制作的,因此我得到了错误。

我通过使用JsonDecoder解决了这个问题,该方法将模式和Avro记录作为参数并返回一个解码器。然后可以将此解码器与GenericDatumReader一起使用来读取GenericRecord。这是Scala代码供您参考。

    val avroJson = Source.fromURL(getClass.getResource("/record.avro")).mkString
    val decoderFactory: DecoderFactory = new DecoderFactory
    val decoder: Decoder = decoderFactory.jsonDecoder(schema, avroJson)

    val datumReader = new GenericDatumReader[GenericRecord](schema)
    var avroRecord: GenericRecord = datumReader.read(null, decoder)

HTH。