Spark面試題(二)

首發於我的個人博客:Spark面試題(二)

1、Spark有哪兩種算子?

Transformation(轉化)算子和Action(執行)算子。

2、Spark有哪些聚合類的算子,我們應該儘量避免什麼類型的算子?

在我們的開發過程中,能避免則儘可能避免使用reduceByKey、join、distinct、repartition等會進行shuffle的算子,儘量使用map類的非shuffle算子。
這樣的話,沒有shuffle操作或者僅有較少shuffle操作的Spark作業,可以大大減少性能開銷。

3、如何從Kafka中獲取數據?

1)基於Receiver的方式
這種方式使用Receiver來獲取數據。Receiver是使用Kafka的高層次Consumer API來實現的。receiver從Kafka中獲取的數據都是存儲在Spark Executor的內存
中的,然後Spark Streaming啓動的job會去處理那些數據。
2)基於Direct的方式
這種新的不基於Receiver的直接方式,是在Spark 1.3中引入的,從而能夠確保更加健壯的機制。替代掉使用Receiver來接收數據後,這種方式會週期性地
查詢Kafka,來獲得每個topic+partition的最新的offset,從而定義每個batch的offset的範圍。當處理數據的job啓動時,就會使用Kafka的簡單consumer api來
獲取Kafka指定offset範圍的數據。

4、RDD創建有哪幾種方式?

1)使用程序中的集合創建rdd
2)使用本地文件系統創建rdd
3)使用hdfs創建rdd
4)基於數據庫db創建rdd
5)基於Nosql創建rdd,如hbase
6)基於s3創建rdd
7)基於數據流,如socket創建rdd

5、Spark並行度怎麼設置比較合適?

spark並行度,每個core承載24個partition,如,32個core,那麼64128之間的並行度,也就是設置64~128個partion,並行讀和數據規模無關,
只和內存使用量和cpu使用時間有關。

6、Spark如何處理不能被序列化的對象?

將不能序列化的內容封裝成object。

7、collect功能是什麼,其底層是怎麼實現的?

driver通過collect把集羣中各個節點的內容收集過來彙總成結果,collect返回結果是Array類型的,collect把各個節點上的數據抓過來,
抓過來數據是Array型,collect對Array抓過來的結果進行合併,合併後Array中只有一個元素,是tuple類型(KV類型的)的。

8、爲什麼Spark Application在沒有獲得足夠的資源,job就開始執行了,可能會導致什麼什麼問題發生?

會導致執行該job時候集羣資源不足,導致執行job結束也沒有分配足夠的資源,分配了部分Executor,該job就開始執行task,應該是task的調度線程
和Executor資源申請是異步的;如果想等待申請完所有的資源再執行job的:
需要將
spark.scheduler.maxRegisteredResourcesWaitingTime設置的很大;
spark.scheduler.minRegisteredResourcesRatio 設置爲1,但是應該結合實際考慮
否則很容易出現長時間分配不到資源,job一直不能運行的情況。

9、map與flatMap的區別?

map:對RDD每個元素轉換,文件中的每一行數據返回一個數組對象。
flatMap:對RDD每個元素轉換,然後再扁平化。
將所有的對象合併爲一個對象,文件中的所有行數據僅返回一個數組對象,會拋棄值爲null的值。

10、Spark on Mesos中,什麼是的粗粒度分配,什麼是細粒度分配,各自的優點和缺點是什麼?

1)粗粒度:啓動時就分配好資源, 程序啓動,後續具體使用就使用分配好的資源,不需要再分配資源;優點:作業特別多時,資源複用率高,適合粗粒度;
缺點:容易資源浪費,假如一個job有1000個task,完成了999個,還有一個沒完成,那麼使用粗粒度,999個資源就會閒置在那裏,資源浪費。
2)細粒度分配:用資源的時候分配,用完了就立即回收資源,啓動會麻煩一點,啓動一次分配一次,會比較麻煩。

11、driver的功能是什麼?

1)一個Spark作業運行時包括一個Driver進程,也是作業的主進程,具有main函數,並且有SparkContext的實例,是程序的入口點;
2)功能:負責向集羣申請資源,向master註冊信息,負責了作業的調度,負責作業的解析、生成Stage並調度Task到Executor上。包括DAGScheduler,
TaskScheduler。

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

可以畫一個這樣的技術棧圖先,然後分別解釋下每個組件的功能和場景
1)Spark core:是其它組件的基礎,spark的內核,主要包含:有向循環圖、RDD、Lingage、Cache、broadcast等,並封裝了底層通訊框架,
是Spark的基礎。
2)SparkStreaming是一個對實時數據流進行高通量、容錯處理的流式處理系統,可以對多種數據源(如Kafka、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中用於圖和圖並行計算。

13、Spark中Worker的主要工作是什麼?

主要功能:管理當前節點內存,CPU的使用狀況,接收master分配過來的資源指令,通過ExecutorRunner啓動程序分配任務,worker就類似於包工頭,
管理分配新進程,做計算的服務,相當於process服務。
需要注意的是:
1)worker會不會彙報當前信息給master,worker心跳給master主要只有workid,它不會發送資源信息以心跳的方式給mater,master分配的時候就知道work,
只有出現故障的時候纔會發送資源。
2)worker不會運行代碼,具體運行的是Executor是可以運行具體appliaction寫的業務邏輯代碼,操作代碼的節點,它不會運行程序的代碼的。

14、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需要自己管理關係。
4)spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

15、RDD機制?

rdd分佈式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。 所有算子都是基於rdd來執行的,不同的場景會有不同的rdd實現類,
但是都可以進行互相轉換。rdd執行過程中會形成dag圖,然後形成lineage保證容錯性等。 從物理的角度來看rdd存儲的是block和node之間的映射。

16、什麼是RDD寬依賴和窄依賴?

RDD和它依賴的parent RDD(s)的關係有兩種不同的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)
1)窄依賴指的是每一個parent RDD的Partition最多被子RDD的一個Partition使用
2)寬依賴指的是多個子RDD的Partition會依賴同一個parent RDD的Partition

17、cache和pesist的區別?

cache和persist都是用於將一個RDD進行緩存的,這樣在之後使用的過程中就不需要重新計算了,可以大大節省程序運行時間
1) cache只有一個默認的緩存級別MEMORY_ONLY ,cache調用了persist,而persist可以根據情況設置其它的緩存級別;
2)executor執行的時候,默認60%做cache,40%做task操作,persist是最根本的函數,最底層的函數。

18、 cache後面能不能接其他算子,它是不是action操作?

cache可以接其他算子,但是接了算子之後,起不到緩存應有的效果,因爲會重新觸發cache。
cache不是action操作。

19、reduceByKey是不是action?

不是,很多人都會以爲是action,reduce rdd是action

20、 RDD通過Linage(記錄數據更新)的方式爲何很高效?

1)lazy記錄了數據的來源,RDD是不可變的,且是lazy級別的,且RDD之間構成了鏈條,lazy是彈性的基石。由於RDD不可變,所以每次操作就產生新的rdd,
不存在全局修改的問題,控制難度下降,所有有計算鏈條將複雜計算鏈條存儲下來,計算的時候從後往前回溯 900步是上一個stage的結束,要麼就checkpoint。
2)記錄原數據,是每次修改都記錄,代價很大如果修改一個集合,代價就很小,官方說rdd是粗粒度的操作,是爲了效率,爲了簡化,每次都是操作數據集合,
寫或者修改操作,都是基於集合的rdd的寫操作是粗粒度的,rdd的讀操作既可以是粗粒度的也可以是細粒度,讀可以讀其中的一條條的記錄。
3)簡化複雜度,是高效率的一方面,寫的粗粒度限制了使用場景如網絡爬蟲,現實世界中,大多數寫是粗粒度的場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章