Spark學習之問題整理
關於RDD運算元的問題:
1、如果Application中只有一個action類運算元,那麼有沒有必要使用控制類運算元?
沒有,因為一個action類運算元對應一個job,沒必要往記憶體或磁碟中寫。
2、如果持久化的級別是MEMORY_ONLY(CACHE),如果記憶體不足會不會出現OOM?
不會出現,能存多少就存多少,不會報錯。存不下的就不存了,等需要的時候會根據依賴關係重新計算。
3、如果持久化的級別是MEMORY_AND_DISK,會不會將一個partition的資料一部分儲存到記憶體一部分在磁碟?
不會,因為儲存單元是partition,不容分割。
Stage中的一些問題:
1、stage中每一個task(管道計算模式)在什麼時候落地磁碟?
如果是stage後面是action類運算元:
collect:將每一個管道的計算結果收集到Driver端的記憶體中。
saveAsTextFile:將每一個管道的計算結果寫到指定記錄。
count:將管道的計算結果統計記錄數,返回給Driver。
如果是stage後面是stage:
在shuffle write階段會寫磁碟,目的是為了防止reduce task拉取資料失敗。倘若不寫入磁碟,一旦拉取失敗會重新向Map端拉取資料,會重新shuffle,寫入磁碟,直接在磁碟拉取就可以。
2、spark在計算的過程中,是不是非常消耗記憶體?
不是,因為stage的計算模式是管道計算模式。
3、什麼場景下最耗記憶體?
控制類運算元,cache
4、解釋一下如果管道中有cache邏輯,他是如何快取資料的?
會複製一份相同的資料進行快取。
5、RDD彈性分散式資料集,為什麼不能儲存資料,還依然叫資料集?
雖然RDD是邏輯上的概念,但是RDD具有管理資料的能力,也可說RDD所對映的資料。
推測執行相關問題:
1、如果1T資料,單機執行30分鐘就能執行完畢,但是使用spark來計算(4個節點),需要2小時,為什麼?
原因:
1)計算髮生了資料傾斜(大量的資料給了少量的task,少量的資料給了大量的task);
2)開啟了推測執行機制,會複製多份掙扎task。
2、對於ETL(Extract Transform Load)型別的業務,開啟推測執行,重試機制,對於最終的結果會不會有影響?
會有影響。最終資料庫中會有重複的資料。比如,當task執行到90%的時候發生了錯誤,開啟重試機制,那麼這90%的資料會重複
解決方案:
關閉各種推測、重試機制。
設定一張事務表。

待更。。。。。。
大家喜歡多多關注,你的關注是我最大的動力
可以關注我的微信公眾號:首席資料師 裡面有很多關於大資料的乾貨