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

Posted 旺仔的算法coding笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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博客

以上是关于hive/spark写入保存出现小文件过多的解决的主要内容,如果未能解决你的问题,请参考以下文章

将数据写入 Hive Spark SQL 时出现 ArrayIndexOutOfBoundsException 异常

Hive:Spark中如何实现将rdd结果插入到hive1.3.1表中

[大数据]Hive:Spark,我发现你有小秘密啊~

微信小程序审核 出现85085 提交审核数量过多问题

关于安装了git或者小乌龟(TortoiseGit)使用之后出现红色! 绿色√ 蓝色?的解决办法:

Ubuntu文件写入内容时出现错误 E121:无法打开并写入文件解决方案