spark sql 执行完毕后,落地小文件太多

qq_36584537 2017-12-15 05:46:11
执行 insert overwrite 语句,产生了200个小文件。 试过配置参数:spark.sql.shuffle.partitions=1, 但这个导致所有reduce阶段均只有一个并行度,影响了执行效率。
大家,有没有什么办法能解决这个问题呢?
...全文
3350 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
并行度决定了产生多少个文件, 要么在文件数量和并行度之间找个平衡, 要么尝试一下adaptive
  • 打赏
  • 举报
回复
coalesce(1) 望采纳
mamba10 2019-06-19
  • 打赏
  • 举报
回复
对计算完成之后的rdd,再coalesce一下
LinkSe7en 2019-05-31
  • 打赏
  • 举报
回复
如果每个文件都小于HDFS BlockSize,那还是有调整的必要,否则没必要在写入前reparation。 因为一个是会增加一次shuffle,二个如果数据集已经排序,shuffle会把顺序打乱。 所以如果真有调整的必要,建议是在写入前一个步骤插入reparation(n)。 例如 rdd.map(xxx).filter(xxx).sortBy(xxx).write(xxx) 在sortBy前进行reparation
郭小白0 2019-05-31
  • 打赏
  • 举报
回复
你不妨在进行写入之前进行coalesce(num)这样试试,我试了一下,至少小数据量还是可以的,像这样:
specialDaysInMall.toDF("name", "age", "address").coalesce(3)
.registerTempTable("inMall")
hqx.sql("insert overwrite table t1 select name,age,address from inMall")
这样之后,在使用sql进行insert或者overwrite形式进行写入hive表,这样结果应该就只会生成3个parquet文件,不妨一试
张某码 2018-01-19
  • 打赏
  • 举报
回复
200是Spark sql的默认并行度。别人都嫌弃他太慢了要调高并行度,你居然要降低它的并行度,你如果真的嫌弃他太多了,你可以适当降低它的并行度,调节参数 spark.sql.shuffle.partitions
guostong 2017-12-18
  • 打赏
  • 举报
回复
repartition(1)

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧