hive/spark写入保存出现小文件过多的解决
Posted 旺仔的算法coding笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive/spark写入保存出现小文件过多的解决相关的知识,希望对你有一定的参考价值。
数据倾斜与小文件问题。在pyspark 中直接以 spark.sql(insert into tableNew ..partition(...).select ...from tableOld)的方式写入数据时,默认未开启动态分区会报错。开启动态分区后容易造成小文件过多从而磁盘报警。
目录
如何解决小文件问题
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表中