首先明確下定義:計算時間是指計算機實際執行的時間,不是人等待的時間,因為等待時間依賴于有多少資源可以調度。
首先我們不考慮資源問題,討論時間的預估。執行時間依賴于執行引擎是Spark還是MapReduce。
Spark任務
Spark任務的總執行時間可以看SparkUI,以下圖為例
Spark任務是分多個PhysicalStage執行的,每個stage下有很多個task,task的時間也有大致的預估,如下圖
Task個數依賴于Hive表的文件數,每個task的執行時間依賴于UDF是怎么實現的,需要具體問題具體分析。
MapReduce任務
MapReduce任務的執行時間,也需要參考hadoopwebui
整體執行時間=map_time*map_number+reduce_time*reduce_number;
map個數一般情況下是hive表的分區數;
map執行時間取決于每個分區里的數據量和udf的邏輯;
不管是Spark還是MapReduce,計算時間都依賴于:
- 數據源分區數
- 每個分區里的文件數
- 每個文件的大小
- udf邏輯
- sql邏輯(groupby、filter、distinctcount)
實際場景下資源是有限的,我們也不關心計算時間,反而是更關心一個數據集需要多久能處理完,比如一個1T的Hive表大概需要幾個小時跑完MapReduce。這時候我們需要做實驗,觀察一個分區大概需要多久跑完,數據有沒有skew,從經驗上給出一個合理的時間,進而保證任務交付。