hive/spark写入保存出现小文件过多的解决

数据倾斜与小文件问题。在pyspark 中直接以 spark.sql(insert into tableNew ..partition(...).select ...from tableOld)的方式写入数据时,默认未开启动态分区会报错。开启动态分区后容易造成小文件过多从而磁盘报警。

目录

如何解决小文件问题

1、distribute by

2、repartition/coalesce


如何解决小文件问题

1、distribute by

少用动态分区,如果场景下必须使用时,那么记得在SQL语句最后添加上distribute by

假设现在有3个分区,我们可以将dt(分区键)相同的数据放到同一个Reduce处理,这样最多也就产生3个文件,dt相同的数据放到同一个Reduce可以使用DISTRIBUTE BY dt实现,所以修改之后的SQL如下:

spark.sql(""""
    insert into tableNew ..partition(...).
    select ...from tableOld 
    distribute by columnName如dt  cast(rand() * 3 as int)
""")

使用 distribute by cast( rand * N as int) 这里的N是指具体最后落地生成多少个文件数,那么最终就是每个分区目录下生成20个 文件大小基本一致的文件。

2、repartition/coalesce

对于已有的可以使用动态分区重刷数据,或者使用Spark程序重新读取小文件的table得到DataFrame,然后再重新写入,如果Spark的版本>=2.4那么推荐使用 repartition或者coalesce 如: 

df_data_out.coalesce(3).write.orc(path = file_path, mode = 'overwrite')
或者
df_data_out.repartition(3).write.orc(path = file_path, mode = 'overwrite')

coalesce 减少了分区数,它仅合并分区 ,因此最大程度地减少了数据移动,但须注意内存不足容易OOM。

repartition 可以增加或减少分区数量,它执行数据的完全shuffle,并确保数据平均分配。

参考: 

Hive/Spark小文件解决方案(企业级实战) - 腾讯云开发者社区-腾讯云

Spark | SparkSql Insert Overwrite 小文件过多_点滴笔记的博客

如何避免Spark SQL做数据导入时产生大量小文件_过往记忆的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值