最近在做用户画像相关的数据开发,在hive中做行转列的过程中,每个标签即tag在写入hive表时,有大量的小文件生成,通过增加参数解决了小文件过多的问题,但是在完成特殊要求--(因后续需要同步ck,ck也有个为解决的问题,超过200M可能会丢失数据,故需要将hive在行转列的时候,合并的小文件在200M一下,方便后续ck数据同步)时,又产生了新的问题,通过hive合并小文件的参数,总是有些tag的数据生成的文件在200M以上;最终使用hive sql
repartition的方式 ,重新打散数据最终实现了数据文件200M一下的目标;
1.hive on spark 中,开始以为是通过spark合并小文件的参数,结果spark的相关参数不熟悉,也不生效,还是一堆小文件产生
2.增加hive合并小文件的相关参数
SET hive.exec.dynamic.partition=true; set hive.stats.column.autogather=false; set hive.exec.dynamic.partition.mode=nonstrict; SET hive.merge.mapfiles=true; SET hive.merge.sparkfiles=true; SET hive.merge.size.per.task=180000000; SET hive.merge.smallfiles.avgsize=180000000; SET hive.exec.max.dynamic.partitions=3000; SET hive.exec.max.dynamic.partitions.pernode=100; set spark.executor.instances=8; set spark.executor.memory=2g; set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
特别需要指出的是,hive.merge.sparkfiles=true; 增加此参数,才会在hive on spark模式中进行小文件合并。
3.增加小文件后,解决个别tag数据扔不满足200M以下的情况
了解相关 hive sql repartition 的使用,在语句中增加 cluster by ,即重新打散数据
(distribute by 个别tag报错,原因待定)
关于hive on spark 合并小文件参考
关于较大规模hadoop集群的小文件问题-腾讯云开发者社区-腾讯云
【Hive任务优化】—— 小文件合并相关参数_hive.merge.sparkfiles-CSDN博客
关于 hive sql repartition 参考
Hive SORT BY vs ORDER BY vs DISTRIBUTE BY vs CLUSTER BY-腾讯云开发者社区-腾讯云
加cluster by之前
加cluster by之后,发现重新打散之后,块文件大小很均匀