Spark中Data skew(数据倾斜)Java+Python+Scala三种接口完整代码
起因
代碼中shuffle的算子存在的地方,groupByKey、countByKey、reduceByKey、join等
判斷一個(gè)算子是shuffle算子可以通過(guò)[20]
?
出現(xiàn)的問(wèn)題有兩種
①大部分task執(zhí)行的很快,剩下幾個(gè)task執(zhí)行的特別特別慢
②JVM Out Of Memory
?
數(shù)據(jù)傾斜發(fā)生的原理[2]
數(shù)據(jù)傾斜的原理很簡(jiǎn)單:在進(jìn)行shuffle的時(shí)候,
必須將各個(gè)節(jié)點(diǎn)上相同的key拉取到某個(gè)節(jié)點(diǎn)上的一個(gè)task來(lái)進(jìn)行處理,
比如按照key進(jìn)行聚合或join等操作。
此時(shí)如果某個(gè)key對(duì)應(yīng)的數(shù)據(jù)量特別大的話,就會(huì)發(fā)生數(shù)據(jù)傾斜。
比如大部分key對(duì)應(yīng)10條數(shù)據(jù),但是個(gè)別key卻對(duì)應(yīng)了100萬(wàn)條數(shù)據(jù),
那么大部分task可能就只會(huì)分配到10條數(shù)據(jù),然后1秒鐘就運(yùn)行完了;
但是個(gè)別task可能分配到了100萬(wàn)數(shù)據(jù),要運(yùn)行一兩個(gè)小時(shí)。因此,整個(gè)Spark作業(yè)的運(yùn)行進(jìn)度是由運(yùn)行時(shí)間最長(zhǎng)的那個(gè)task決定的。
(自己總結(jié):每個(gè)key負(fù)責(zé)處理的數(shù)據(jù)不一樣,導(dǎo)致了木桶效應(yīng))
找出異常的key[3]
如果任務(wù)長(zhǎng)時(shí)間卡在最后最后1個(gè)(幾個(gè))任務(wù),首先要對(duì)key進(jìn)行抽樣分析,判斷是哪些key造成的。
某個(gè)task執(zhí)行特別慢的情況[2]
首先要看的,就是數(shù)據(jù)傾斜發(fā)生在第幾個(gè)stage中。
如果是用yarn-client模式提交,那么本地是直接可以看到log的,可以在log中找到當(dāng)前運(yùn)行到了第幾個(gè)stage;如果是用yarn-cluster模式提交,則可以通過(guò)Spark Web UI來(lái)查看當(dāng)前運(yùn)行到了第幾個(gè)stage。
此外,無(wú)論是使用yarn-client模式還是yarn-cluster模式,我們都可以在Spark Web UI上深入看一下當(dāng)前這個(gè)stage各個(gè)task分配的數(shù)據(jù)量,從而進(jìn)一步確定是不是task分配的數(shù)據(jù)不均勻?qū)е铝藬?shù)據(jù)傾斜。
比如下圖中,倒數(shù)第三列顯示了每個(gè)task的運(yùn)行時(shí)間。
明顯可以看到,有的task運(yùn)行特別快,只需要幾秒鐘就可以運(yùn)行完;而有的task運(yùn)行特別慢,需要幾分鐘才能運(yùn)行完,
此時(shí)單從運(yùn)行時(shí)間上看就已經(jīng)能夠確定發(fā)生數(shù)據(jù)傾斜了。
此外,倒數(shù)第一列顯示了每個(gè)task處理的數(shù)據(jù)量,明顯可以看到,運(yùn)行時(shí)間特別短的task只需要處理幾百KB的數(shù)據(jù)即可,而運(yùn)行時(shí)間特別長(zhǎng)的task需要處理幾千KB的數(shù)據(jù),處理的數(shù)據(jù)量差了10倍。此時(shí)更加能夠確定是發(fā)生了數(shù)據(jù)傾斜。
?
數(shù)據(jù)傾斜解決方案代碼匯總
https://github.com/appleyuchi/spark_data_skew
Reference
[1]Spark項(xiàng)目實(shí)戰(zhàn)-數(shù)據(jù)傾斜解決方案之原理以及現(xiàn)象分析(已經(jīng)閱讀)
[2]Spark性能優(yōu)化指南——高級(jí)篇(代碼不完整,Java的,[2]中內(nèi)容已經(jīng)涵蓋[11])
[3]解決spark中遇到的數(shù)據(jù)傾斜問(wèn)題(代碼不完整)
[4]spark處理數(shù)據(jù)傾斜的案例(圖示很清楚,但是代碼非常不詳細(xì))
[5]Spark如何處理數(shù)據(jù)傾斜(代碼完整,scala版本,可以美團(tuán)的java版本弄完后再回來(lái)看)
[6]Spark--聚合性數(shù)據(jù)傾斜解決方案實(shí)例說(shuō)明(代碼很詳細(xì),但是沒(méi)有數(shù)據(jù)集,主要技術(shù)就是key salting)
[7]解決spark數(shù)據(jù)傾斜(代碼完整,scala版本)
[8]spark調(diào)優(yōu)之?dāng)?shù)據(jù)傾斜(scala版本,部分參考美團(tuán)的)
[9]最完整的數(shù)據(jù)傾斜解決方案(spark)
[10]Spark性能優(yōu)化之道——解決Spark數(shù)據(jù)傾斜(Data Skew)的N種姿勢(shì)
[11]面試必問(wèn)&數(shù)據(jù)傾斜(已經(jīng)閱讀)
[12]Spark Shuffle Write 和Read(spark底層源碼分析)
[13]Spark shuffle-write 和 shuffle-read 中對(duì)數(shù)據(jù)傾斜情況的處理(開(kāi)頭概念很清晰)
[14]徹底搞懂spark的shuffle過(guò)程(shuffle write)(講解shuffle過(guò)程)
[15]Spark中RDD 持久化操作 cache與persist區(qū)別(cache與persist的區(qū)別)
[16]Spark性能優(yōu)化:數(shù)據(jù)傾斜調(diào)優(yōu)(轉(zhuǎn)載的[2])
[17]Spark map-side-join 關(guān)聯(lián)優(yōu)化(代碼完整,scala版本)
[18]spark join broadcast優(yōu)化(代碼不完整,scala版本)
[19]What are the Spark transformations that causes a Shuffle?
[20]判斷一個(gè)算子是否會(huì)導(dǎo)致shuffle的方法
[21]Spark性能優(yōu)化之道——解決Spark數(shù)據(jù)傾斜(Data Skew)的N種姿勢(shì)
?
?
總結(jié)
以上是生活随笔為你收集整理的Spark中Data skew(数据倾斜)Java+Python+Scala三种接口完整代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: qq邮箱app怎么回复别人的邮件(登录Q
- 下一篇: python基于happybase对hb