**:
核心調優引數如下:
num-executors
executor-memory
executor-cores
driver-memory
spark.default.parallelizm
spark.storage.memoryfraction
spark.shuffle.memoryfraction
executor-memory:這個定義了每個 executor 的記憶體,它與 jvm oom 緊密相關,很多時候甚至決定了 spark 執行的效能。實際生產環境下建義是 8g 左右,很多時候 spark 執行在 yarn 上,記憶體佔用量不要超過 yarn 的記憶體資源的 50%。
executor-cores:決定了在 executors 中能夠並行執行的 tasks 的個數。實際生產環境下應該分配4個左右,一般情況下不要超過 yarn 佇列中 cores 總數量的 50%。
driver-memory:默應是 1g
spark.default.parallelizm:並行度問題,如果不設定這個引數,spark 會跟據 hdfs 中 block 的個數去設定這乙個數量,原理是默應每個 block 會對應乙個 task,默應情況下,如果資料量不是太多就不可以充份利用 executor 設定的資源,就會浪費了資源。建義設定為 100個,最好 700個左右。spark官方的建義是每乙個 core 負責 2-3 個 task。
spark.storage.memoryfraction:默應占用 60%,如果計算比較依賴於歷史資料則可以調高該引數,當如果計算比較依賴 shuffle 的話則需要降低該比例。
spark.shuffle.memoryfraction:默應占用 20%,如果計算比較依賴 shuffle 的話則需要調高該比例。
採用 map 端的 join (rdd1 + rdd2 )先把乙個 rdd1的資料收集過來,然後再通過sc.broadcast( )把資料廣播到 executor 上;
如果進行批量插入資料到資料庫的話,建義採用foreachpartition( )。
因為我們不希望有太多的資料碎片,所以能批量處理就盡量批量處理,你可以呼叫coalesce( ),把乙個更多的並行度的分片變得更少,假設有一萬個資料分片,想把它變得一百個,就可以使用 coalesce( )方法,一般在 filter( ) 運算元之後就會用 coalesce( ),這樣可以節省資源。
官方建義使用repartitionandsortwithpartitions( );
資料進行復用時一般都會進行持久化persisit( );
也建義使用 tree 開頭的運算元,比如說treereduce( )和treeaggregrate( );
大資料必然要思考的核心效能問題不外乎 cpu 計算、記憶體管理、磁碟和網路io操作,這是無可避免的,但是可以基於這個基礎上進行優化,思考如何最優化的使用計算資源,思考如何在優化**,在**層面上防避墜入效能弱點;思考如何減少網路傳輸和思考如何最大程度的實現資料分布均衡。
在資源管理調優方面可以設定一些引數,比如num-executors、executor-memory、executor-cores、driver-memory、spark.default.parallelizm、spark.storage.memoryfraction、spark.shuffle.memoryfraction
Spark效能調優
日常工作使用spark處理業務問題中不可避免的都會碰到需要對spark的效能進行調優的情況,這裡就介紹一下對spark的效能調優。1.調節記憶體分配 因為在spark中堆記憶體被劃分為兩塊,一塊是給rdd的cache和persist操作rdd資料快取使用的,另一塊是給spark運算元函式使用的,函式...
Spark效能調優 JVM調優
通過一張圖讓你明白以下四個問題 1.jvm gc機制,堆記憶體的組成 2.spark的調優為什麼會和jvm的調優會有關聯?因為scala也是基於jvm執行的語言 3.spark中oom產生的原因 4.如何在jvm這個層面上來對spark進行調優 補充 spark程式執行時 jvm堆記憶體分配比例 r...
七 Spark效能調優 Shuffle 調優
目錄 一 調節 map 端緩衝區大小 二 調節 reduce 端拉取資料緩衝區大小 三 調節 reduce 端拉取資料重試次數 四 調節 reduce 端拉取資料等待間隔 五 調節 sortshuffle 排序操作閾值 val conf new sparkconf set spark.shuffle...