1. 程式人生 > >調優 | Apache Hudi應用調優指南

調優 | Apache Hudi應用調優指南

通過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變更日誌,可調整預設配置。另一類非常流行的資料是時間序列/事件/日誌資料,它往往更加龐大,每個分割槽的記錄更多。在這種情況下,請考慮通過`.bloomFilterFPP()/bloomFilterNumEntries()`來調整Bloom過濾器的精度,以加速目標索引查詢時間,另外可考慮一個以事件時間為字首的鍵,這將使用範圍修剪並顯著加快索引查詢的速度。 **GC調優:**請確保遵循Spark調優指南中的垃圾收集調優技巧,以避免OutOfMemory錯誤。**[必須]**使用G1 / CMS收集器,其中新增到spark.executor.extraJavaOptions的示例如下: ```shell -XX:NewSize=1g -XX:SurvivorRatio=2 -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/hoodie-heapdump.hprof ``` **OutOfMemory錯誤:**如果出現OOM錯誤,則可嘗試通過如下配置處理:`spark.memory.fraction = 0.2,spark.memory.storageFraction = 0.2`允許其溢位而不是OOM(速度變慢與間歇性崩潰相比)。 以下是完整的生產配置 ```yaml spark.driver.extraClassPath /etc/hive/conf spark.driver.extraJavaOptions -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/hoodie-heapdump.hprof spark.driver.maxResultSize 2g spark.driver.memory 4g spark.executor.cores 1 spark.executor.extraJavaOptions -XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/hoodie-heapdump.hprof spark.executor.id driver spark.executor.instances 300 spark.executor.memory 6g spark.rdd.compress true spark.kryoserializer.buffer.max 512m spark.serializer org.apache.spark.serializer.KryoSerializer spark.shuffle.service.enabled true spark.sql.hive.convertMetastoreParquet false spark.submit.deployMode cluster spark.task.cpus 1 spark.task.maxFailures 4 spark.yarn.driver.memoryOverhead 1024 spark.yarn.executor.memoryOverhead 3072 spark.yarn.max.executor.failures