我们运行了多个连接到不同数据源(kafka,oracle,mysql ..)的火花作业,并通过火花批次卸载/导入数据。
作业读取源添加了一些信息,然后将信息添加到分区(YYYY-MM-DD)hive-parquet表(df ... saveAsTable(....))。 这些工作每5分钟运行一次。 到目前为止,一切都很顺利。
"问题"现在我们发现,如果我们合并每日分区中的小文件,那么性能会有很大提升。
现在我们只使用"插入覆盖表"用相同的数据覆盖分区,通过该过程将数据合并为更大的文件。 但是这个过程是手动的,并且感觉不是真的像#34; BestPractice"。
你们是如何处理的?必须是一个非常普遍的问题吗?
提前致谢。
答案 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")
希望,这有帮助。