Spark-SQL 面試準備 3

Spark Knowledge No.3

21.driver的功能是什麼:

答:1.一個spark作業運行時包括一個driver進程,也就是作業的主進程,具有main函數,並且有sparkContext的實例,是程序的入口;

2.功能:負責向集羣申請資源,向master註冊信息,負責了作業的調度,負責了作業的解析,生成stage並調度task到executor上,包括DAGScheduler,TaskScheduler。

22.spark的有幾種部署模式,每種模式特點?

1)本地模式

Spark不一定非要跑在hadoop集羣,可以在本地,起多個線程的方式來指定。將Spark應用以多線程的方式直接運行在本地,一般都是爲了方便調試,本地模式分三類

· local:只啓動一個executor

· local[k]:啓動k個executor

· local:啓動跟cpu數目相同的 executor

2)standalone模式

分佈式部署集羣, 自帶完整的服務,資源管理和任務監控是Spark自己監控,這個模式也是其他模式的基礎,

3)Spark on yarn模式

分佈式部署集羣,資源和任務監控交給yarn管理,但是目前僅支持粗粒度資源分配方式,包含cluster和client運行模式,cluster適合生產,driver運行在集羣子節點,具有容錯功能,client適合調試,dirver運行在客戶端

4)Spark On Mesos模式。官方推薦這種模式(當然,原因之一是血緣關係)。正是由於Spark開發之初就考慮到支持Mesos,因此,目前而言,Spark運行在Mesos上會比運行在YARN上更加靈活,更加自然。用戶可選擇兩種調度模式之一運行自己的應用程序:

  1. 粗粒度模式(Coarse-grained Mode):每個應用程序的運行環境由一個Dirver和若干個Executor組成,其中,每個Executor佔用若干資源,內部可運行多個Task(對應多少個“slot”)。應用程序的各個任務正式運行之前,需要將運行環境中的資源全部申請好,且運行過程中要一直佔用這些資源,即使不用,最後程序運行結束後,回收這些資源。

  2. 細粒度模式(Fine-grained Mode):鑑於粗粒度模式會造成大量資源浪費,Spark On Mesos還提供了另外一種調度模式:細粒度模式,這種模式類似於現在的雲計算,思想是按需分配

23.Spark技術棧有哪些組件,每個組件都有什麼功能,適合什麼應用場景?

1)Spark core:是其它組件的基礎,spark的內核,主要包含:有向循環圖、RDD、Lineage、Cache、broadcast等,並封裝了底層通訊框架,是Spark的基礎。

2)SparkStreaming是一個對實時數據流進行高通量、容錯處理的流式處理系統,可以對多種數據源(如Kdfka、Flume、Twitter、Zero和TCP 套接字)進行類似Map、Reduce和Join等複雜操作,將流式計算分解成一系列短小的批處理作業。

3)Spark sql:Shark是SparkSQL的前身,Spark SQL的一個重要特點是其能夠統一處理關係表和RDD,使得開發人員可以輕鬆地使用SQL命令進行外部查詢,同時進行更復雜的數據分析

4)BlinkDB :是一個用於在海量數據上運行交互式 SQL 查詢的大規模並行查詢引擎,它允許用戶通過權衡數據精度來提升查詢響應時間,其數據的精度被控制在允許的誤差範圍內。

5)MLBase: 是Spark生態圈的一部分專注於機器學習,讓機器學習的門檻更低,讓一些可能並不瞭解機器學習的用戶也能方便地使用MLbase。MLBase分爲四部分:MLlib,MLI、ML Optimizer和MLRuntime。

6)GraphX是Spark中用於圖和圖並行計算

24.spark中worker 的主要工作是什麼?

主要功能:管理當前節點內存,CPU的使用情況,接受master發送過來的資源指令,通過executorRunner啓動程序分配任務,worker就類似於包工頭,管理分配新進程,做計算的服務,相當於process服務,需要注意的是:

1.worker會不會彙報當前信息給master?worker心跳給master主要只有workid,不會以心跳的方式發送資源信息給master,這樣master就知道worker是否存活,只有故障的時候纔會發送資源信息;

2.worker不會運行代碼,具體運行的是executor,可以運行具體application斜的業務邏輯代碼,操作代碼的節點,不會去運行代碼。

25.簡單說一下hadoop和spark的shuffle相同和差異?

答:1)從 high-level 的角度來看,兩者並沒有大的差別。 都是將 mapper(Spark 裏是 ShuffleMapTask)的輸出進行 partition,不同的 partition 送到不同的 reducer(Spark 裏 reducer 可能是下一個 stage 裏的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以內存作緩衝區,邊 shuffle 邊 aggregate 數據,等到數據 aggregate 好以後進行 reduce() (Spark 裏可能是後續的一系列操作)。

2)從 low-level 的角度來看,兩者差別不小。 Hadoop MapReduce 是 sort-based,進入 combine() 和 reduce() 的 records 必須先 sort。這樣的好處在於 combine/reduce() 可以處理大規模的數據,因爲其輸入數據可以通過外排得到(mapper 對每段數據先做排序,reducer 的 shuffle 對排好序的每段數據做歸併)。目前的 Spark 默認選擇的是 hash-based,通常使用 HashMap 來對 shuffle 來的數據進行 aggregate,不會對數據進行提前排序。如果用戶需要經過排序的數據,那麼需要自己調用類似 sortByKey() 的操作;如果你是Spark 1.1的用戶,可以將spark.shuffle.manager設置爲sort,則會對數據進行排序。在Spark 1.2中,sort將作爲默認的Shuffle實現。

3)從實現角度來看,兩者也有不少差別。 Hadoop MapReduce 將處理流程劃分出明顯的幾個階段:map(), spill, merge, shuffle, sort, reduce() 等。每個階段各司其職,可以按照過程式的編程思想來逐一實現每個階段的功能。在 Spark 中,沒有這樣功能明確的階段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蘊含在 transformation() 中。

如果我們將 map 端劃分數據、持久化數據的過程稱爲 shuffle write,而將 reducer 讀入數據、aggregate 數據的過程稱爲 shuffle read。那麼在 Spark 中,問題就變爲怎麼在 job 的邏輯或者物理執行圖中加入 shuffle write 和 shuffle read 的處理邏輯?以及兩個處理邏輯應該怎麼高效實現?

Shuffle write由於不要求數據有序,shuffle write 的任務很簡單:將數據 partition 好,並持久化。之所以要持久化,一方面是要減少內存存儲空間壓力,另一方面也是爲了 fault-tolerance。

26.Mapreduce和Spark的都是並行計算,那麼他們有什麼相同和區別

答:兩者都是用mr模型來進行並行計算:

1)hadoop的一個作業稱爲job,job裏面分爲map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束。

2)spark用戶提交的任務成爲application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job。這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關係劃分job而來的,每個stage裏面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命週期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啓動讀取內存進行計算。

3)hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的IO操作,多個job需要自己管理關係。

spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

27.spark有哪些組件?

答:主要有如下組件:

1)master:管理集羣和節點,不參與計算。

2)worker:計算節點,進程本身不參與計算,和master彙報。

3)Driver:運行程序的main方法,創建spark context對象。

4)spark context:控制整個application的生命週期,包括dagsheduler和task scheduler等組件。

5)client:用戶提交程序的入口。

28.Spark的優化怎麼做?

答: spark調優比較複雜,但是大體可以分爲三個方面來進行,

1)平臺層面的調優:防止不必要的jar包分發,提高數據的本地性,選擇高效的存儲格式如parquet,

2)應用程序層面的調優:過濾操作符的優化降低過多小任務,降低單條記錄的資源開銷,處理數據傾斜,複用RDD進行緩存,作業並行化執行等等,

3)JVM層面的調優:設置合適的資源量,設置合理的JVM,啓用高效的序列化方法如kyro,增大off head內存等等

序列化在分佈式系統中扮演着重要的角色,優化Spark程序時,首當其衝的就是對序列化方式的優化。Spark爲使用者提供兩種序列化方式:

29.Java serialization: 默認的序列化方式。

Kryo serialization: 相較於 Java serialization 的方式,速度更快,空間佔用更小,但並不支持所有的序列化格式,同時使用的時候需要註冊class。spark-sql中默認使用的是kyro的序列化方式。
可以在spark-default.conf設置全局參數,也可以代碼中初始化時對SparkConf設置 conf.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”) ,該參數會同時作用於機器之間數據的shuffle操作以及序列化rdd到磁盤,內存。
Spark不將Kyro設置成默認的序列化方式是因爲它需要對類進行註冊,官方強烈建議在一些網絡數據傳輸很大的應用中使用kyro序列化。

如果你要序列化的對象比較大,可以增加參數spark.kryoserializer.buffer所設置的值。

如果沒有註冊需要序列化的class,Kyro依然可以照常工作,但會存儲每個對象的全類名(full class name),這樣的使用方式往往比默認的 Java serialization 還要浪費更多的空間。

可以設置 spark.kryo.registrationRequired 參數爲 true,使用kyro時如果在應用中有類沒有進行註冊則會報錯

發佈了79 篇原創文章 · 獲贊 45 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章