Spark調(diào)優(yōu)之RDD算子調(diào)優(yōu)(面試常問,建議收藏)
Spark調(diào)優(yōu)之RDD算子調(diào)優(yōu)
不廢話,直接進(jìn)入正題!
1. RDD復(fù)用
在對(duì)RDD進(jìn)行算子時(shí),要避免相同的算子和計(jì)算邏輯之下對(duì)RDD進(jìn)行重復(fù)的計(jì)算,如下圖所示:

RDD的重復(fù)計(jì)算
對(duì)上圖中的RDD計(jì)算架構(gòu)進(jìn)行修改,得到如下圖所示的優(yōu)化結(jié)果:

RDD架構(gòu)優(yōu)化
2. 盡早filter
獲取到初始RDD后,應(yīng)該考慮盡早地過濾掉不需要的數(shù)據(jù),進(jìn)而減少對(duì)內(nèi)存的占用,從而提升Spark作業(yè)的運(yùn)行效率。
3. 讀取大量小文件-用wholeTextFiles
當(dāng)我們將一個(gè)文本文件讀取為 RDD 時(shí),輸入的每一行都會(huì)成為RDD的一個(gè)元素。
也可以將多個(gè)完整的文本文件一次性讀取為一個(gè)pairRDD,其中鍵是文件名,值是文件內(nèi)容。
val input:RDD[String] = sc.textFile("dir.log")
如果傳遞目錄,則將目錄下的所有文件讀取作為RDD。文件路徑支持通配符。
但是這樣對(duì)于大量的小文件讀取效率并不高,應(yīng)該使用 wholeTextFiles
返回值為RDD[(String, String)],其中Key是文件的名稱,Value是文件的內(nèi)容。
def wholeTextFiles(path: String, minPartitions: Int = defaultMinPartitions): RDD[(String, String)])
wholeTextFiles讀取小文件:
val filesRDD: RDD[(String, String)] =
sc.wholeTextFiles("D:\data\files", minPartitions = 3)
val linesRDD: RDD[String] = filesRDD.flatMap(_._2.split("\r\n"))
val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(" "))
wordsRDD.map((_, 1)).reduceByKey(_ + _).collect().foreach(println)
4. mapPartition和foreachPartition
mapPartitions
map(_….) 表示每一個(gè)元素
mapPartitions(_….) 表示每個(gè)分區(qū)的數(shù)據(jù)組成的迭代器
普通的map算子對(duì)RDD中的每一個(gè)元素進(jìn)行操作,而mapPartitions算子對(duì)RDD中每一個(gè)分區(qū)進(jìn)行操作。
如果是普通的map算子,假設(shè)一個(gè)partition有1萬條數(shù)據(jù),那么map算子中的function要執(zhí)行1萬次,也就是對(duì)每個(gè)元素進(jìn)行操作。

map 算子
如果是mapPartition算子,由于一個(gè)task處理一個(gè)RDD的partition,那么一個(gè)task只會(huì)執(zhí)行一次function,function一次接收所有的partition數(shù)據(jù),效率比較高。

mapPartition 算子
比如,當(dāng)要把RDD中的所有數(shù)據(jù)通過JDBC寫入數(shù)據(jù),如果使用map算子,那么需要對(duì)RDD中的每一個(gè)元素都創(chuàng)建一個(gè)數(shù)據(jù)庫連接,這樣對(duì)資源的消耗很大,如果使用mapPartitions算子,那么針對(duì)一個(gè)分區(qū)的數(shù)據(jù),只需要建立一個(gè)數(shù)據(jù)庫連接。
mapPartitions算子也存在一些缺點(diǎn):對(duì)于普通的map操作,一次處理一條數(shù)據(jù),如果在處理了2000條數(shù)據(jù)后內(nèi)存不足,那么可以將已經(jīng)處理完的2000條數(shù)據(jù)從內(nèi)存中垃圾回收掉;但是如果使用mapPartitions算子,但數(shù)據(jù)量非常大時(shí),function一次處理一個(gè)分區(qū)的數(shù)據(jù),如果一旦內(nèi)存不足,此時(shí)無法回收內(nèi)存,就可能會(huì)OOM,即內(nèi)存溢出。
因此,mapPartitions算子適用于數(shù)據(jù)量不是特別大的時(shí)候,此時(shí)使用mapPartitions算子對(duì)性能的提升效果還是不錯(cuò)的。(當(dāng)數(shù)據(jù)量很大的時(shí)候,一旦使用mapPartitions算子,就會(huì)直接OOM)
在項(xiàng)目中,應(yīng)該首先估算一下RDD的數(shù)據(jù)量、每個(gè)partition的數(shù)據(jù)量,以及分配給每個(gè)Executor的內(nèi)存資源,如果資源允許,可以考慮使用mapPartitions算子代替map。
foreachPartition
rrd.foreache(_….) 表示每一個(gè)元素
rrd.forPartitions(_….) 表示每個(gè)分區(qū)的數(shù)據(jù)組成的迭代器
在生產(chǎn)環(huán)境中,通常使用foreachPartition算子來完成數(shù)據(jù)庫的寫入,通過foreachPartition算子的特性,可以優(yōu)化寫數(shù)據(jù)庫的性能。
如果使用foreach算子完成數(shù)據(jù)庫的操作,由于foreach算子是遍歷RDD的每條數(shù)據(jù),因此,每條數(shù)據(jù)都會(huì)建立一個(gè)數(shù)據(jù)庫連接,這是對(duì)資源的極大浪費(fèi),因此,對(duì)于寫數(shù)據(jù)庫操作,我們應(yīng)當(dāng)使用foreachPartition算子。
與mapPartitions算子非常相似,foreachPartition是將RDD的每個(gè)分區(qū)作為遍歷對(duì)象,一次處理一個(gè)分區(qū)的數(shù)據(jù),也就是說,如果涉及數(shù)據(jù)庫的相關(guān)操作,一個(gè)分區(qū)的數(shù)據(jù)只需要?jiǎng)?chuàng)建一次數(shù)據(jù)庫連接,如下圖所示:

foreachPartition 算子
使用了foreachPartition 算子后,可以獲得以下的性能提升:
對(duì)于我們寫的function函數(shù),一次處理一整個(gè)分區(qū)的數(shù)據(jù);
對(duì)于一個(gè)分區(qū)內(nèi)的數(shù)據(jù),創(chuàng)建唯一的數(shù)據(jù)庫連接;
只需要向數(shù)據(jù)庫發(fā)送一次SQL語句和多組參數(shù);
在生產(chǎn)環(huán)境中,全部都會(huì)使用foreachPartition算子完成數(shù)據(jù)庫操作。foreachPartition算子存在一個(gè)問題,與mapPartitions算子類似,如果一個(gè)分區(qū)的數(shù)據(jù)量特別大,可能會(huì)造成OOM,即內(nèi)存溢出。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬
-

長(zhǎng)安汽車母公司突然更名:從“中國長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-

員工持股爆雷?廣汽埃安緊急回應(yīng)
最新活動(dòng)更多
-
11月7日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月20日立即報(bào)名>> 【免費(fèi)下載】RISC-V芯片發(fā)展現(xiàn)狀與測(cè)試挑戰(zhàn)-白皮書
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
11月28日立即下載>> 【白皮書】精準(zhǔn)洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰是“蘋果”?
- 3 拐點(diǎn)已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時(shí)達(dá)海爾賦能扭虧為盈
- 4 L3自動(dòng)駕駛延期,逼出車企技術(shù)自我淘汰
- 5 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 6 機(jī)器人9月大事件|3家國產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 7 谷歌“香蕉”爆火啟示:國產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 8 7倍機(jī)器人大牛股:高管股東套現(xiàn)VS機(jī)構(gòu)兇猛抱團(tuán),該信誰?
- 9 八部門聯(lián)手放行L3自動(dòng)駕駛!巨頭開始拼搶萬億市場(chǎng)?
- 10 OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





