我有一个火花工作,管理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
时真正附加的内容吗?
答案 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)
}
再次感谢你!