hadoop - java.io.IOException : Not a data file 异常

标签 hadoop apache-spark avro

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

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

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)

最佳答案

block 所在的集群中的一个节点已关闭。因此找不到数据,这会导致错误。解决方案是修复并启动集群中的所有节点。

我在使用 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)

我决定对该文件进行 cat,因为我能够在 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...

我们的集群一直存在一些问题,不幸的是一些节点已关闭。解决问题后,此错误已解决

关于hadoop - java.io.IOException : Not a data file 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466055/

相关文章:

python - DataFrame - 值错误 : Unexpected tuple with StructType

java - 如何通过更改架构和添加其他属性将 DataFrame 从 Spark 保存到 Cassandra 表

java - Avro 工具运行用 Java 编写的方法的 Scala 类加载器

hadoop - Mahout 0.9使用哪个Hadoop

elasticsearch - 由于 Guava 库版本不同,Spark on YARN与Elasticsearch TransportClient发生冲突

hadoop - Apache Giraph的数组顶点值

apache-kafka - 在模式注册表中,消费者的模式可能与生产者的模式不同,这实际上意味着什么

java - Avro 字段名称以数字/整数开头

hadoop - Hadoop映射减少与 Guava 不兼容

java - Hadoop - 如何发射 TwoDArrayWritable