星環hive on spark執行速度慢
因為task的啟動數量是根據hdfs底層的block數量來定,在 block 資料量偏少的情況下,單個任務執行的時間就少,那麼任務開啟的開銷很可能佔據總開銷的大量比例。現在因為block檔案數量龐大,導致task啟動數量巨大,過多的執行緒將導致排隊延時的增加,嚴重影響sql的執行效率,所以對 block 有效的合併處理有助於促進語句執行的高效性 於是開啟automerge開關: set ngmr.partition.automerge=true; 它兩種配置合併後Task任務量方法
“ngmr.partition.mergesize = n”,表示將 n 個 block 安排給單個執行緒處理。 “ngmr.partition.mergesize.mb = m”,表示一個 task 負責處理大小為 m 的資料量(單位 為 MBytes)可以根據需要僅設定這兩個引數其中之一,預設使用方法 2 來控制,如果需要使用方法 1,需要將 mergesize.mb 設為-1。
如果已知資料來源中小檔案過多,最好在向新表匯入資料之前就開啟automerge 開關,使一個 Task 處理多個 block。因為同屬一個 Task 的結果將被返回在同一 個檔案中,因此匯入資料時做任務的合併處理可達到小檔案合併效果。然後關閉automerge 開關,今後都不用再對該表開啟。 除了檢查 block 的大小,還可以通過在 4040 埠檢視任務第一階段 Tasks 的數量和每Task 的執行時間判斷是否需要 automerge。第一階段的 Task 負責 Map 端任務,預設每個Task 對應一個 block,所以如果第一階段 Task 過多而且單個執行時間短,表示小體積 block 多,Task 執行效率低,需要啟用 automerge