通过Spark作业将数据写入Hudi时,Spark应用的调优技巧也适用于此。如果要提高性能或可靠性,请牢记以下几点。
**输入并行性:**Hudi对输入进行分区默认并发度为1500,以确保每个Spark分区都在2GB的限制内(在Spark2.4.0版本之后去除了该限制),如果有更大的输入,则相应地进行调整。我们建议设置shuffle的并发度,配置项为hoodie.[insert|upsert|bulkinsert].shuffle.parallelism
,以使其至少达到input_data_size/500MB。
**Off-heap(堆外)内存:**Hudi写入parquet文件,需要使用一定的堆外内存,如果遇到此类故障,请考虑设置类似spark.yarn.executor.memoryOverhead
或spark.yarn.driver.memoryOverhead
的值。
**Spark 内存:**通常Hudi需要能够将单个文件读入内存以执行合并或压缩操作,因此执行程序的内存应足以容纳此文件。另外,Hudi会缓存输入数据以便能够智能地放置数据,因此预留一些spark.memory.storageFraction
通常有助于提高性能。
**调整文件大小:**设置limitFileSize
以平衡接收/写入延迟与文件数量,并平衡与文件数据相关的元数据开销。
**时间序列/日志数据:**对于单条记录较大的数据库/ nosql变更日志,可调整默认配置。另一类非常流行的数据是时间序列/事件/日志数据,它往往更加庞大,每个分区的记录更多。在这种情况下,请考虑通过.bloomFilte