Spark常見面試題
什麼是RDD
- RDD是彈性分佈式數據集,Spark最基本的數據集,它不可變、可分區、可並行計算。
- 彈性表示:能夠將數據存儲在內存或者磁盤,RDD的分區是能夠改變的,task若是失敗會進行特定次數的重試,stage若是失敗會自動進行特定次數的重試且只會計算失敗的分片,基於lineage的高效容錯
RDD有什麼特性
- A list of partitions
- A function for computing each split
- A list of dependencies on other RDDs
- Optionally,a Partitioner for key-value RDDs(eg:to say that the RDD is hash-partitioned)
- 可選項,數據本地性,數據位置最優
map、flatMap與mapPartition的區別
- map 函數會對每一條輸入進行指定的操做,而後爲每一條輸入返回一個對象
- flatMap函數則是兩個操做的集合——正是「先映射後扁平化」
-
- 對每一條輸入進行指定的操做,而後爲每一條輸入返回一個對象
-
- mapPartition每次處理一個分區的數據,可是可能致使OOM
repartition和coalesce異同
- 前者會產生shuffle,後者不會
- repartition只是coalesce接口中shuffle爲true的簡易實現
transformation與action的區別
- transformation:不觸發提交做業,屬於延遲計算
- action:會觸發SparkContext提交Job做業
reducebykey與groupbykey的區別
- 前者的效率高於後者
- reducebykey:spark會在每一個分區移動數據以前將輸出數據與一個共用的key結合
- groupbykey:全部的鍵值對(key-value pair) 都會被移動,在網絡上傳輸這些數據很是不必,所以避免使用 GroupByKey
寬依賴與窄依賴
- 窄依賴:一個父RDD的分區去到了子RDD的一個分區,沒有shuffle產生,如:filter、map、flatMap、distinct
- 寬依賴:一個父RDD的分區去到子RDD的多個分區,會產生shuffle,如:reduce、groupByKey、join
Spark中如何劃分Stage
pipeline管道
- pipeline管道會來一條數據計算一條數據,會把全部的邏輯走完,而後shuffle write,進行數據的持久化
RDD緩存
- cache與persist
- cache只能基於內存的緩存
- persist能夠選擇不一樣的StorageLevel
- cache不必定會提高速率,當數據量很大時,會形成緩存溢出
RDD共享變量
spark-submit的時候如何引入外部jar包
- 配置 -driver-class-path 外部jar包
- 配置 -jars 外部jar包
Spark防止內存溢出
- driver端的內存溢出
-
- 能夠增大driver的內存參數spark.driver.memory (default 1g)
- map過程產生大量對象致使內存溢出
-
- 在會產生大量對象的map操做以前調用repartition方法,分區成更小的塊傳入map
- 數據不平衡致使內存溢出
-
- shuffle後內存溢出
- 使用rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)代替rdd.cache()
shuffle數據塊有多少種不一樣的存儲方式
- RDD數據塊:用來存儲所緩存的RDD數據
- shuffle數據塊:用來存儲持久化的shuffle數據
- 廣播數據塊:存儲廣播變量的數據
- 任務返回數據塊:
- 流式數據塊:spark streaming中,存儲接收到的流式數據塊
數據傾斜
- 多數task執行速度較快,少數task執行時間很是長,或者等待很長時間後提示你內存不足,執行失敗
數據傾斜緣由
- 數據問題:key分佈不均衡,key的設置不合理
- spark問題:shuffle時併發度不高
數據傾斜的後果
- spark中的stage的執行時間受限於最後那個執行完成的task,所以運行緩慢的任務會拖垮整個程序的運行速度
- 過多的數據在同一個task中運行,將會把executor撐爆
如何實現sparkStreaming讀取kafka中的數據
- receiver:是採用了kafka高級api,利用receiver接收器來接受kafka topic中的數據,從kafka接收來的數據會存儲在spark的executor中,以後spark streaming提交的job會處理這些數據,kafka中topic的偏移量是保存在zk中的。
- direct:在spark1.3以後,引入了Direct方式。不一樣於Receiver的方式,Direct方式沒有receiver這一層,其會週期性的獲取Kafka中每一個topic的每一個partition中的最新offsets,以後根據設定的maxRatePerPartition來處理每一個batch。
什麼是粗粒度,什麼是細粒度
- 每一個應用程序的運行環境由一個Dirver和若干個Executor組成,其中,每一個Executor佔用若干資源,內部可運行多個Task(對應多少個「slot」)
- 粗粒度:啓動時就分配好資源
- 細粒度:用資源的時候再分配,用完了就當即回收
driver的功能
- 每一個spark做業運行時包含一個driver進程
- 建立SparkContext程序,鏈接到給定的SparkMaster
- 劃分stage,並生成DAGScheduler
- 經過taskScheduler生成併發送task到executor
Spark技術棧有哪些
- spark core
- spark streaming
- spark sql
- MLBase:MLlib、MLl、MLOptimizer、MLRuntime
- GraphX
- BlinkDB
Spark有哪些組件
- master
- worker
- driver
- spark context
- client
Spark做業執行流程
- 客戶端提交做業
- driver啓動流程
- driver申請資源並啓動其他executor
- executor啓動流程
- 做業調度,生成stages與tasks
- task調度到executor上,executor啓動線程執行task邏輯
- driver管理task狀態
- task完成,stage完成,做業完成
歡迎關注本站公眾號,獲取更多信息