coalesce不会减少输出文件的数量

时间:2015-03-04 10:02:47

标签: output apache-spark avro coalesce rdd

我有一个火花工作,管理RDD[SpecificRecordBase]上的HDFS

我的问题是它会生成大量文件,包括95%的空avro文件。 我尝试使用coalesce来减少RDD上的分区数量,以及输出文件的数量,但它没有效果。

 def write(data: RDD[SpecificRecordBase]) = {
   data.coalesce(1, false)    //has no effect
   val conf = new Configuration()
   val job = new org.apache.hadoop.mapreduce.Job(conf)

   AvroJob.setOutputKeySchema(job, schema)
   val pair = new PairRDDFunctions(rdd)
   pair.saveAsNewAPIHadoopFile(
     outputAvroDataPath,
     classOf[AvroKey[SpecificRecordBase]],
     classOf[org.apache.hadoop.io.NullWritable],
     classOf[AvroKeyOutputFormat[SpecificRecordBase]],
     job.getConfiguration)
}

我认为rdd分区配置和HDFS分区之间丢失了一些内容,saveAsNewAPIHadoopFile可能没有考虑到这一点,但我不确定。< / p>

我错过了什么吗?

有人可以解释根据rdd分区调用saveAsNewAPIHadoopFile时真正附加的内容吗?

1 个答案:

答案 0 :(得分:1)

感谢@ 0x0FFF回答我自己的问题,正确的代码应该是:

    def write(data: RDD[SpecificRecordBase]) = {
           val rdd = data.map(t => (new AvroKey(t), org.apache.hadoop.io.NullWritable.get))
           val rdd1Partition = rdd.coalesce(1, false)  //change nb of partitions to 1

           val conf = new Configuration()
           val job = new org.apache.hadoop.mapreduce.Job(conf)

           AvroJob.setOutputKeySchema(job, schema)
           val pair = new PairRDDFunctions(rdd1Partition) //so only one file will be in output
           pair.saveAsNewAPIHadoopFile(
             outputAvroDataPath,
             classOf[AvroKey[SpecificRecordBase]],
             classOf[org.apache.hadoop.io.NullWritable],
             classOf[AvroKeyOutputFormat[SpecificRecordBase]],
             job.getConfiguration)
        }

再次感谢你!