Spark批处理作业后合并文件的最佳实践

时间:2018-01-11 08:16:34

标签: hadoop apache-spark hive impala

我们运行了多个连接到不同数据源(kafka,oracle,mysql ..)的火花作业,并通过火花批次卸载/导入数据。

作业读取源添加了一些信息,然后将信息添加到分区(YYYY-MM-DD)hive-parquet表(df ... saveAsTable(....))。 这些工作每5分钟运行一次。 到目前为止,一切都很顺利。

"问题"现在我们发现,如果我们合并每日分区中的小文件,那么性能会有很大提升。

现在我们只使用"插入覆盖表"用相同的数据覆盖分区,通过该过程将数据合并为更大的文件。 但是这个过程是手动的,并且感觉不是真的像#34; BestPractice"。

你们是如何处理的?必须是一个非常普遍的问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以使用以下分区生成perquet文件。

/user/hive/warehouse/table/date=2015-01-01/nameloadfile1/file.parq
/user/hive/warehouse/table/date=2015-01-01/nameloadfile1/file2.parq
/user/hive/warehouse/table/date=2015-01-01/nameloadfile1/file3.parq
/user/hive/warehouse/table/date=2015-01-01/nameloadfile1/file4.parq

现在,您手动手动合并这些文件。而不是你可以这样做,可以自动完成。

df.coalesce(1).write.mode(SaveMode.Overwrite).partitionBy(<partitioncolumn>).perquet(<HIVEtbl>)

以下属性也可以派上用场。看看这些。

spark.sql("SET hive.merge.sparkfiles = true")  
spark.sql("SET hive.merge.mapredfiles = true")
spark.sql("SET hive.merge.mapfiles = true")
spark.sql("set hive.merge.smallfiles.avgsize = 128000000")
spark.sql("set hive.merge.size.per.task = 128000000")

希望,这有帮助。