【原創】經驗分享(20)spark job之間會停頓幾分鐘
阿新 • • 發佈:2018-12-27
今天遇到一個問題,spark應用中在一個迴圈裡執行sql,每個sql都會向一張表寫入資料,比如
insert overwrite table test_table partition(dt) select * from test_table_another;
除了執行sql沒有其他邏輯,每個sql都會對應1個job,在spark web ui上看到job和job之間會停頓幾分鐘,並且非常有規律,任何兩個job之間都會停頓,是不是很神奇?
答案揭曉:
spark在執行insert overwrite table partition的時候,分為兩個部分,一個是執行select(讀資料),一個是執行load partition(寫資料),具體詳見執行計劃;
每個sql對應1個job,這個job執行的select部分(讀資料),不包含load partition部分(寫資料),因為spark為了相容hive,直接使用hive的元資料庫,所有ddl操作都是通過反射直接呼叫hive的程式碼(spark2.1依賴的是hive1.2),這個過程並不包含在spark job中,所以看起來job執行完之後停頓了幾分鐘才執行下個job,這裡停頓的幾分鐘其實是在做load partition操作(寫資料);
這裡還有另外一個問題,hive1.2在loadPartition刪除檔案時是序列操作,非常慢,這個問題在hive2時改為執行緒池解決,具體程式碼及問題解析詳見: https://www.cnblogs.com/barneywill/p/10154922.html