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

  • 從後往前,遇到寬依賴就劃分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
  • 數據不平衡致使內存溢出
    • 調用repartition從新分區
  • 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完成,做業完成
相關文章
相關標籤/搜索