spark spark.yarn.executor.memoryOverhead 太小錯誤?
02-07
在用spark處理大數據比如80TB數據時,假設 executor-memory = 6g, spark.yarn.executor.memoryOverhead = 3g, partiton為15000, 在做ReducyByKey操作時會報錯:
ExecutorLostFailure (executor 252 exited caused by one of the running
tasks) Reason: Container killed by YARN for exceeding memory limits. 9.1
GB of 9 GB physical memory used. Consider boosting
spark.yarn.executor.memoryOverhead. 問題是, 如何在現有的內存下完成運算,我也曾嘗試用更多partition,結果會出現task lost錯誤,請問有誰知道在有限內存下處理大數據的spark配置方案嗎?
80TB的數據,partition數量為15000,理論上平均每個節點是5-6G的數據,但是實際上根據key-value在存儲時,很有可能因為某個key的數量特別多,導致數據傾斜。這樣就會出現超過物理內存限制的報錯。偶爾重試可能會通過,但是會比較不穩定;
目前我們這邊的兩種解決辦法是,如果傾斜的key值比較少,那麼過濾出來,對其進行單獨處理;另一種就是數量比較多,那麼將key值 map成 key_01到key_100,join的另一邊map成key_1~100的隨機數,那麼這樣join之後,原本同樣的key值會落到同一個partition,現在變成隨機落到了100個節點上,使得數據分布更加平均。推薦閱讀:
※Spark Streaming容錯性和零數據丟失
※hadoop 和spark如何系統的學習?
※關於Spark有哪些大牛們的博客?
※Scala 究竟好在那裡?
※Spark從1.4.x升級到1.6的喜人效果