原文鏈接:https://blog.csdn.net/zuolixiangfisher/article/details/88973159
1浩聋、什么是寬依賴,什么是窄依賴湃崩?哪些算子是寬依賴惶我,哪些是窄依賴?
窄依賴就是一個父RDD分區(qū)對應(yīng)一個子RDD分區(qū)冠骄,如map伪煤,filter
或者多個父RDD分區(qū)對應(yīng)一個子RDD分區(qū),如co-partioned join
寬依賴是一個父RDD分區(qū)對應(yīng)非全部的子RDD分區(qū)凛辣,如groupByKey抱既,ruduceByKey
或者一個父RDD分區(qū)對應(yīng)全部的子RDD分區(qū),如未經(jīng)協(xié)同劃分的join
http://www.reibang.com/p/736a4e628f0f
2扁誓、Transformation和action算子有什么區(qū)別防泵?舉例說明
Transformation 變換/轉(zhuǎn)換:這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過程處理蝗敢。Transformation 操作是延遲計算的捷泞,也就是說從一個RDD 轉(zhuǎn)換生成另一個 RDD 的轉(zhuǎn)換操作不是馬上執(zhí)行,需要等到有 Action 操作的時候才會真正觸發(fā)運算
map, filter
Action 行動算子:這類算子會觸發(fā) SparkContext 提交 Job 作業(yè)寿谴。
Action 算子會觸發(fā) Spark 提交作業(yè)(Job)锁右。
count
3、講解spark shuffle原理和特性讶泰?shuffle write 和 shuffle read過程做些什么咏瑟?
https://blog.csdn.net/zhanglh046/article/details/78360762
4、Shuffle數(shù)據(jù)塊有多少種不同的存儲方式痪署?分別是什么
RDD數(shù)據(jù)塊:用來存儲所緩存的RDD數(shù)據(jù)响蕴。
Shuffle數(shù)據(jù)塊:用來存儲持久化的Shuffle數(shù)據(jù)。
廣播變量數(shù)據(jù)塊:用來存儲所存儲的廣播變量數(shù)據(jù)惠桃。
任務(wù)返回結(jié)果數(shù)據(jù)塊:用來存儲在存儲管理模塊內(nèi)部的任務(wù)返回結(jié)果浦夷。通常情況下任務(wù)返回結(jié)果隨任務(wù)一起通過Akka返回到Driver端。但是當任務(wù)返回結(jié)果很大時辜王,會引起Akka幀溢出劈狐,這時的另一種方案是將返回結(jié)果以塊的形式放入存儲管理模塊,然后在Driver端獲取該數(shù)據(jù)塊即可呐馆,因為存儲管理模塊內(nèi)部數(shù)據(jù)塊的傳輸是通過Socket連接的肥缔,因此就不會出現(xiàn)Akka幀溢出了。
流式數(shù)據(jù)塊:只用在Spark Streaming中汹来,用來存儲所接收到的流式數(shù)據(jù)塊
5续膳、哪些spark算子會有shuffle改艇?
去重,distinct
排序坟岔,groupByKey谒兄,reduceByKey等
重分區(qū),repartition社付,coalesce
集合或者表操作承疲,interection,join
https://kuncle.github.io/spark/2017/03/13/Spark的shuffle算子.html
6鸥咖、講解spark schedule(任務(wù)調(diào)度)燕鸽?
https://www.cnblogs.com/missmzt/p/6734078.html
7、Spark stage是如何劃分的啼辣?
從hdfs中讀取文件后啊研,創(chuàng)建 RDD 對象
DAGScheduler模塊介入運算,計算RDD之間的依賴關(guān)系鸥拧。RDD之間的依賴關(guān)系就形成了DAG
每一個JOB被分為多個Stage悲伶,劃分Stage的一個主要依據(jù)是當前計算因子的輸入是否是確定的,如果是則將其分在同一個Stage住涉,避免多個Stage之間的消息傳遞開銷麸锉。
因此spark劃分stage的整體思路是:從后往前推,遇到寬依賴就斷開舆声,劃分為一個stage花沉;遇到窄依賴就將這個RDD加入該stage中。
8媳握、Spark cache一定能提升計算性能么碱屁?說明原因?
不一定啊蛾找,cache是將數(shù)據(jù)緩存到內(nèi)存里娩脾,當小數(shù)據(jù)量的時候是能提升效率,但數(shù)據(jù)大的時候內(nèi)存放不下就會報溢出打毛。
9柿赊、Cache和persist有什么區(qū)別和聯(lián)系?
cache調(diào)用了persist方法幻枉,cache只有一個默認的緩存級別MEMORY_ONLY 碰声,而persist可以根據(jù)情況設(shè)置其它的緩存級別。
https://blog.csdn.net/houmou/article/details/52491419
10熬甫、RDD是彈性數(shù)據(jù)集胰挑,“彈性”體現(xiàn)在哪里呢?你覺得RDD有哪些缺陷?
自動進行內(nèi)存和磁盤切換
基于lineage的高效容錯
task如果失敗會特定次數(shù)的重試
stage如果失敗會自動進行特定次數(shù)的重試瞻颂,而且只會只計算失敗的分片
checkpoint【每次對RDD操作都會產(chǎn)生新的RDD豺谈,如果鏈條比較長,計算比較笨重贡这,就把數(shù)據(jù)放在硬盤中】和persist 【內(nèi)存或磁盤中對數(shù)據(jù)進行復(fù)用】(檢查點茬末、持久化)
數(shù)據(jù)調(diào)度彈性:DAG TASK 和資源管理無關(guān)
數(shù)據(jù)分片的高度彈性repartion
缺陷:
惰性計算的缺陷也是明顯的:中間數(shù)據(jù)默認不會保存,每次動作操作都會對數(shù)據(jù)重復(fù)計算藕坯,某些計算量比較大的操作可能會影響到系統(tǒng)的運算效率
11、RDD有多少種持久化方式噪沙?memory_only如果內(nèi)存存儲不了炼彪,會怎么操作?
cache和persist
memory_and_disk正歼,放一部分到磁盤
MEMORY_ONLY_SER:同MEMORY_ONLY辐马,但是會使用Java序列化方式,將Java對象序列化后進行持久化局义∠惨可以減少內(nèi)存開銷,但是需要進行反序列化萄唇,因此會加大CPU開銷檩帐。
MEMORY_AND_DSK_SER:同MEMORY_AND_DSK。但是使用序列化方式持久化Java對象另萤。
DISK_ONLY:使用非序列化Java對象的方式持久化湃密,完全存儲到磁盤上。
MEMORY_ONLY_2或者MEMORY_AND_DISK_2等:如果是尾部加了2的持久化級別四敞,表示會將持久化數(shù)據(jù)復(fù)用一份泛源,保存到其他節(jié)點,從而在數(shù)據(jù)丟失時忿危,不需要再次計算达箍,只需要使用備份數(shù)據(jù)即可。
12铺厨、RDD分區(qū)和數(shù)據(jù)塊有啥聯(lián)系缎玫?
13、當GC時間占比很大可能的原因有哪些解滓?對應(yīng)的優(yōu)化方法是碘梢?
垃圾回收的開銷和對象合數(shù)成正比,所以減少對象的個數(shù)伐蒂,就能大大減少垃圾回收的開銷煞躬。序列化存儲數(shù)據(jù),每個RDD就是一個對象。緩存RDD占用的內(nèi)存可能跟工作所需的內(nèi)存打架恩沛,需要控制好
14在扰、Spark中repartition和coalesce異同?coalesce什么時候效果更高雷客,為什么
repartition(numPartitions:Int):RDD[T]
coalesce(numPartitions:Int, shuffle:Boolean=false):RDD[T]
1
2
以上為他們的定義芒珠,區(qū)別就是repartition一定會觸發(fā)shuffle,而coalesce默認是不觸發(fā)shuffle的搅裙。
他們兩個都是RDD的分區(qū)進行重新劃分皱卓,repartition只是coalesce接口中shuffle為true的簡易實現(xiàn),(假設(shè)RDD有N個分區(qū)部逮,需要重新劃分成M個分區(qū))
減少分區(qū)提高效率
15娜汁、Groupbykey和reducebykey哪個性能更高,為什么兄朋?
reduceByKey性能高掐禁,更適合大數(shù)據(jù)集
http://www.reibang.com/p/0c6705724cff
16、你是如何理解caseclass的颅和?
https://blog.csdn.net/hellojoy/article/details/81034528
17傅事、Scala里trait有什么功能,與class有何異同峡扩?什么時候用trait什么時候該用class
它可以被繼承蹭越,而且支持多重繼承,其實它更像我們熟悉的接口(interface)教届,但它與接口又有不同之處是:
trait中可以寫方法的實現(xiàn)般又,interface不可以(java8開始支持接口中允許寫方法實現(xiàn)代碼了),這樣看起來trait又很像抽象類
18巍佑、Scala 語法中to 和 until有啥區(qū)別
to 包含上界茴迁,until不包含上界
19、講解Scala伴生對象和伴生類
單例對象與類同名時萤衰,這個單例對象被稱為這個類的伴生對象堕义,而這個類被稱為這個單例對象的伴生類。伴生類和伴生對象要在同一個源文件中定義脆栋,伴生對象和伴生類可以互相訪問其私有成員倦卖。不與伴生類同名的單例對象稱為孤立對象。
import scala.collection.mutable.Map
class ChecksumAccumulator {
private var sum = 0
def add(b: Byte) {
sum += b
}
def checksum(): Int = ~(sum & 0xFF) + 1
}
object ChecksumAccumulator {
private val cache = Map[String, Int]()
def calculate(s: String): Int =
if (cache.contains(s))
cache(s)
else {
val acc = new ChecksumAccumulator
for (c <- s)
acc.add(c.toByte)
val cs = acc.checksum()
cache += (s -> cs)
println("s:"+s+" cs:"+cs)
cs
}
def main(args: Array[String]) {
println("Java 1:"+calculate("Java"))
println("Java 2:"+calculate("Java"))
println("Scala :"+calculate("Scala"))
}
}
20椿争、spark作業(yè)執(zhí)行流程
客戶端提交作業(yè)
Driver啟動流程
Driver申請資源并啟動其余Executor(即Container)
Executor啟動流程
作業(yè)調(diào)度怕膛,生成stages與tasks。
Task調(diào)度到Executor上秦踪,Executor啟動線程執(zhí)行Task邏輯
Driver管理Task狀態(tài)
Task完成褐捻,Stage完成掸茅,作業(yè)完成
————————————————