如何合并 sparksql 保存在 hive 上的小文件?
Posted
技术标签:
【中文标题】如何合并 sparksql 保存在 hive 上的小文件?【英文标题】:How to merge small files saved on hive by sparksql? 【发布时间】:2016-08-29 09:12:52 【问题描述】:像下面的代码一样,将数据框插入配置单元表中。 hive的输出hdfs文件小文件太多。保存在蜂巢上时如何合并它们?
myDf.write.format("orc").partitionBy("datestr").insertInto("myHiveTable")
当有 100 个任务时,它会产生 100 个小文件。
在数据框上使用coalesce
是个好主意吗?
myDf.coalesce(3).write.format("orc").partitionBy("datestr").insertInto("myHiveTable")
为什么 hive 配置如下不起作用?
sqlContext.sql("set hive.merge.mapfiles=true")
sqlContext.sql("set hive.merge.sparkfiles=false")
sqlContext.sql("set hive.merge.smallfiles.avgsize=16000000")
sqlContext.sql("set hive.merge.size.per.task=256000000")
非常感谢您的帮助。
【问题讨论】:
创建的 100 个小文件平均有多大? 【参考方案1】:遇到这个问题,找到issue-24940
在 spark sql 查询中使用/*+ COALESCE(numPartitions) */
或/*+ REPARTITION(numPartitions) */
将控制输出文件编号。
在我的文章中,我向用户推荐第二个参数,因为它会生成一个新的阶段来完成这项工作,而第一个参数不会,因为最后一个阶段的任务较少,这可能会导致工作死亡。
【讨论】:
【参考方案2】:这是因为 SparkSQL 返回与 spark 分区数相对应的文件数。即使动态分区配置已打开。
我遇到了同样的问题。在我看来,上述配置仅适用于 MapReduce 引擎上的 Hive:在我的情况下,HiveQL 命令运行良好(正在合并小文件)。
更多详情请参阅Hive architecture。
【讨论】:
以上是关于如何合并 sparksql 保存在 hive 上的小文件?的主要内容,如果未能解决你的问题,请参考以下文章