並行度的影響
合理的並行度,不能太小也不要過大。
並行度較小:
併發度小,執行效率低;(失去分佈式計算的意義)
並行度過大:
資源申請上的劣勢。導致ApplicationMaster在向yarn提交資源申請時不能做到數據本地化(分配執行任務的機器不是數據所在機器,yarn resourcemanager在分配資源時選擇 數據本地、同機架、集羣隨機三種方式,優先級從前到後),甚至由於集羣剩餘資源不足而處於排隊等待狀態,申請資源時間成爲整個任務執行時間的瓶頸;
每個task的初始化時間拖了任務執行時間的後腿(一個數據量小、處理邏輯簡單的任務本身執行時間已經比大量task初始化所消耗時間小);
合理的並行度
任務的合理並行度取決於
集羣的資源
一個合理的並行度,肯定是需要考慮到現有集羣的可用資源,這個決定了你申請資源的上限。
集羣的資源可以劃分爲兩種:1、整個集羣的資源;2、hdfs數據所在機器的資源情況。
任務處理的數據量、文件數
你要處理的數據量是你任務並行度大小的關鍵。
查看hdfs文件信息:
hadoop fsck /xxx/xxx/your_path
可以加 -files -blocks -racks參數查看目錄下每個文件的明細信息:files:文件數;blocks:數據塊數;racks:機架地址
blocks決定了讀取數據時的並行度(一般讀取task數等於block數)
數據處理的業務邏輯
io密集型 or cpu密集型
io密集型 —— 較小的並行度,可以儘可能保證數據的本地化或同機架,避免數據的網絡傳輸;
cpu密集型 —— 偏向於更大的並行度(spark任務可以通過DAG、數據緩存等輔助優化手段)
總之,任務的並行度取決因素有很多,並且這些因素不是一成不變的,在任務調優的過程中,可以通過控制變量來多次嘗試,選擇出最理想的一個資源大小、任務的並行度大小
並行度的設置
spark並行度強轉操作:
reparation/coalesce 兩者區別參考:https://blog.csdn.net/zx_blog/article/details/100168367
hdfs文件數據讀取時的並行度:
文件所佔block數(一個block對應一個task)。
通過spark參數進行調整:
spark參數:spark.default.parallelism(可設置在sparkhome中全局配置文件中,或在代碼sparkconf中進行設置)
spark sql的參數:spark.sql.shuffle.partition(spark sql中shuffle操作的並行度,如sql中join,group by等操作,默認爲200)
spark shuffle算子中設置並行度: rdd.groupByKey(100)、rdd.leftjoin(secondRdd, 50)
mr任務,FileInputFormat的並行度:
並行度=fileSize / Math.max(minSize, Math.min(maxSize, blockSize)),默認minSize爲1,maxSize爲Long.MAXValue,所以默認並行度等於fileSize / blockSize
minSize和maxSize可通過mapreduce.input.fileinputformat.split.minsize、mapreduce.input.fileinputformat.split.maxsize進行調整;blockSize即hdfs的blockSize,可以通過
hdfs-site.xml中dfs.blocksize進行配置