Spark寫Redis Spark資源配置總結

2021-09-28 18:04:17 字數 2589 閱讀 4950

19/10/16 11:22:06 error yarnclusterscheduler: lost executor 28 on **********: container marked as failed: container_********** on host: **********. exit status: 137. diagnostics: container killed on request. exit code is 137 killed by external signal

19/10/16 11:32:59 error yarnclusterscheduler: lost executor 38 on 100.76.80.197: container marked as failed: container_********** on host: **********. exit status: 137. diagnostics: container killed on request. exit code is 137 killed by external signal

19/10/16 11:40:27 error yarnclusterscheduler: lost executor 39 on **********: container marked as failed: container_1567762627991_1638740_01_000343 on host: **********. exit status: 137. diagnostics: container killed on request. exit code is 137 killed by external signal

19/10/16 11:49:29 error yarnclusterscheduler: lost executor 40 on **********: container marked as failed: container********** on host: **********. exit status: 137. diagnostics: container killed on request. exit code is 137 killed by external signal

19/10/16 11:49:29 error tasksetmanager: task 51 in stage 4.0 failed 4 times; aborting job

driver stack trace:

org.apache.spark.sparkexception: job aborted due to stage failure: task 51 in stage 4.0 failed 4 times, most recent failure: lost task 51.3 in stage 4.0 (tid 160, **********, executor 40): executor lost failure (executor 40 exited caused by one of the running tasks) reason: container marked as failed: container_********** on host: 100.76.26.136. exit status: 137. diagnostics: container killed on request. exit code is 137 killed by external signal

這種問題,最大的可能就是資料寫入redis的資源配置不合理,資料量太大,超過了redis能承受的。

幾個關鍵的spark資源配置如下:

由報錯資訊可以看出,yarn丟失了executor,極有可能還是因為executor被關閉了,所以還是要檢查一下自己的driver-memory和executor-memory是不是夠大。

使用spark 2.0的scala api,使用jedis客戶端api,dependency如下:

redis.clients

jedis

2.9.0

jar

資料寫入redis**如下:

sampledata.repartition(500).foreachpartition(

rows => )

pipe.sync()

})

推薦使用了pipe進行批量插入,批量插入效率與逐條插入效率差異非常大。但是批量插入有個非常大的坑。上面的**中,如果一次性批量插入了整個partition的資料,恰巧單個partition的資料量非常大(超過了redis pipline 的寫入速度  或者 timeout),會導致redis記憶體溢位(或者timeout),導致服務不可用!

解決方法是在foreachpartition之前,repartition整個dateset,確保每個分割槽的資料不要太大。推薦控制在1k~20k左右。如上,將sampledata分為500個分割槽,每個分割槽10000條,那麼sampledata的總數為500萬左右。但是,如果資料總量太大,單個分割槽過小,會導致分割槽數過大,這樣需要提高driver的記憶體,否則會導致driver記憶體溢位

。觀察在不同數量executor下,併發寫入redis的qps,直到qps達到乙個可以接受的範圍。

spark寫sql語句範例

建立乙個sparksession物件 val sparksession sparksession.builder createdf2 master local getorcreate val rdd sparksession.sparkcontext.textfile c data person.t...

使用Python寫spark 示例

python寫spark我認為唯一的理由就是 你要做資料探勘,ai相關的工作。因為很多做數挖的他們的基礎語言都是python,他們如果重新學scala比較耗時,而且,python他的強大類庫是他的優勢,很多演算法庫只有python有。python的安裝 解壓python包,在環境變數裡面配上bin的...

Spark(六) Spark計算模型

整個spark框架都是基於rdd運算元來進行計算的。what is rdd?resilient distributed dataset rdd 分布式彈性資料集,是spark上的乙個核心抽象 表示用於平行計算的,不可修改的,對資料集合進行分片的資料結構 簡單地,可以將rdd看成是spark平台上的通...