当前位置: 首页 > 知识库问答 >
问题:

合并不会减少输出文件的数量

籍永安
2023-03-14

我有一个火花作业,它管理HDFS上的RDD[专业记录库]

我的问题是它会生成很多文件,包括 95% 的空 avro 文件。我尝试使用合并来减少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没有考虑到它,但我不确定。

我错过了什么吗?

有人能解释一下根据rdd分区调用SaveAsNewAPIHadoopFile时真正附加的内容吗?

共有1个答案

彭硕
2023-03-14

感谢@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)
        }

再次感谢!

 类似资料:
  • 本文向大家介绍Mysql单文件存储删除数据文件容量不会减少的bug与解决方法,包括了Mysql单文件存储删除数据文件容量不会减少的bug与解决方法的使用技巧和注意事项,需要的朋友参考一下 MySQL的Bug之一:InnoDB ibdata1 never shrinks after data is removed 问题描述 当innodb引擎使用单个文件进行存储的时候,当对数据库中数据进行删除的时候

  • 我利用的功能如下: < li >将< code>MySQL表读入< code>DataFrame < li >改造他们 < li >合并它们 < li >写给< code>HDFS 在的整个生命周期中,没有对其执行s。它曾经像预期的那样工作,但最近我遇到了问题。由于的延迟求值,导致读取操作的并行性降低。 因此,如果我读取使用与,然后

  • MapReduce传递和发出键值对的基本信息。我需要弄清楚我们通过什么和发出什么。以下是我的关注点:MapReduce输入和输出: 1.Map() 方法 - 它是否采用单个或列表的键值对并发出什么?2.对于每个输入键值对,发出什么映射器?相同类型还是不同类型 ?3.对于每个中间键,减速器会发出什么?类型是否有任何限制?4.减速机接收所有具有相同键的值。值将如何排序,如排序或轨道排序?该顺序是否因运

  • 问题内容: 有什么办法可以减少jar文件的大小? 我想要一个减少未使用依赖性的工具。 我使用Maven进行依赖管理。 问题答案: 从Maven的角度来看,JAR文件通常不包含依赖项。因此,您必须在谈论: WAR或EAR或类似文件, 通过合并大量JAR文件而产生的所谓的UberJAR文件;例如使用Maven阴影插件,或 依赖比Maven模块更精细。 在前两种情况下,可以通过在依赖关系规范或war或s

  • 我正在使用一个聚合函数,我已经在我的工作中使用了很长时间了。其思想是,如果传递给函数的序列长度为1(即组只有一个观察值),则返回该观察值。如果传递的序列长度大于1,则在列表中返回观察值。 对一些人来说,这可能看起来很奇怪,但这不是一个X,Y问题,我有充分的理由想做这个与这个问题无关的事情。 这是我一直在使用的函数: 现在由于某种原因,在我正在处理的当前数据集中,我得到了一个值错误,声明函数不减少。