Spark精選面試題七(精華篇)

1、driver的功能是什麼?

1、一個Spark作業運行時包括一個Driver進程,也是作業的主進程,具有main函數,並且有SparkContext的實例,是程序的人口點;

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

2、spark的有幾種部署模式,每種模式特點?

1、本地模式

2、standalone 模式

3、spark on yarn 模式

4、mesos模式

3、Spark爲什麼比mapreduce快?

1、基於內存計算,減少低效的磁盤交互;

2、高效的調度算法,基於DAG;

3、容錯機制Linage,精華部分就是DAG和Lingae

4、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。

5、RDD寬依賴和窄依賴?

RDD和它依賴的parent RDD(s)的關係有兩種不同的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)。

1、窄依賴指的是每一個parent RDD的Partition最多被子RDD的一個Partition使用

2、寬依賴指的是多個子RDD的Partition會依賴同一個parent RDD的Partition

6、cache和pesist的區別 

1、cache和persist都是用於將一個RDD進行緩存的,這樣在之後使用的過程中就不需要重新計算了,可以大大節省程序運行時間;

2、 cache只有一個默認的緩存級別MEMORY_ONLY ,cache調用了persist,而persist可以根據情況設置其它的緩存級別;

3、executor執行的時候,默認60%做cache,40%做task操作,persist最根本的函數,最底層的函數

7、常規的容錯方式有哪幾種類型?RDD通過Linage(記錄數據更新)的方式爲何很高效?

1、.數據檢查點,會發生拷貝,浪費資源

2、.記錄數據的更新,每次更新都會記錄下來,比較複雜且比較消耗性能

——————

1、lazy記錄了數據的來源,RDD是不可變的,且是lazy級別的,且rDD之間構成了鏈條,lazy是彈性的基石。由於RDD不可變,所以每次操作就產生新的rdd,不存在全局修改的問題,控制難度下降,所有有計算鏈條將複雜計算鏈條存儲下來,計算的時候從後往前回溯900步是上一個stage的結束,要麼就checkpoint

2、記錄原數據,是每次修改都記錄,代價很大如果修改一個集合,代價就很小,官方說rdd是粗粒度的操作,是爲了效率,爲了簡化,每次都是操作數據集合,寫或者修改操作,都是基於集合的rdd的寫操作是粗粒度的,rdd的讀操作既可以是粗粒度的也可以是細粒度,讀可以讀其中的一條條的記錄。

3、簡化複雜度,是高效率的一方面,寫的粗粒度限制了使用場景如網絡爬蟲,現實世界中,大多數寫是粗粒度的場景

8、RDD有哪些缺陷?

1、不支持細粒度的寫和更新操作(如網絡爬蟲),spark寫數據是粗粒度的所謂粗粒度,就是批量寫入數據,爲了提高效率。但是讀數據是細粒度的也就是說可以一條條的讀

2、不支持增量迭代計算,Flink支持

9、Spark中數據的位置是被誰管理的?

每個數據分片都對應具體物理位置,數據的位置是被blockManager,無論數據是在磁盤,內存還是tacyan,都是由blockManager管理

10、Spark的數據本地性有哪幾種?

Spark中的數據本地性有三種:a.PROCESS_LOCAL是指讀取緩存在本地節點的數據b.NODE_LOCAL是指讀取本地節點硬盤數據c.ANY是指讀取非本地節點數據通常讀取數據PROCESS_LOCAL>NODE_LOCAL>ANY,儘量使數據以PROCESS_LOCAL或NODE_LOCAL方式讀取。其中PROCESS_LOCAL還和cache有關,如果RDD經常用的話將該RDD cache到內存中,注意,由於cache是lazy的,所以必須通過一個action的觸發,才能真正的將該RDD cache到內存中

11、rdd有幾種操作類型?

1、transformation,rdd由一種轉爲另一種rdd

2、action,

3、cronroller,crontroller是控制算子,cache,persist,對性能和效率的有很好的支持三種類型,不要回答只有2中操作

12、Spark程序執行,有時候默認爲什麼會產生很多task,怎麼修改默認task執行個數?

1、因爲輸入數據有很多task,尤其是有很多小文件的時候,有多少個輸入block就會有多少個task啓動;

2、spark中有partition的概念,每個partition都會對應一個task,task越多,在處理大規模數據的時候,就會越有效率。不過task並不是越多越好,如果平時測試,或者數據量沒有那麼大,則沒有必要task數量太多。

3、參數可以通過spark_home/conf/spark-default.conf配置文件設置:spark.sql.shuffle.partitions 50 spark.default.parallelism 10第一個是針對spark sql的task數量第二個是非spark sql程序設置生效

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

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

14、join操作優化經驗?

join其實常見的就分爲兩類: map-side join 和  reduce-side join。當大表和小表join時,用map-side join能顯著提高效率。將多份數據進行關聯是數據處理過程中非常普遍的用法,不過在分佈式計算系統中,這個問題往往會變的非常麻煩,因爲框架提供的 join 操作一般會將所有數據根據 key 發送到所有的 reduce 分區中去,也就是 shuffle 的過程。造成大量的網絡以及磁盤IO消耗,運行效率極其低下,這個過程一般被稱爲 reduce-side-join。如果其中有張表較小的話,我們則可以自己實現在 map 端實現數據關聯,跳過大量數據進行 shuffle 的過程,運行時間得到大量縮短,根據不同數據可能會有幾倍到數十倍的性能提升。

15、介紹一下cogroup rdd實現原理,你在什麼場景下用過這個rdd?

cogroup的函數實現:這個實現根據兩個要進行合併的兩個RDD操作,生成一個CoGroupedRDD的實例,這個RDD的返回結果是把相同的key中兩個RDD分別進行合併操作,最後返回的RDD的value是一個Pair的實例,這個實例包含兩個Iterable的值,第一個值表示的是RDD1中相同KEY的值,第二個值表示的是RDD2中相同key的值.由於做cogroup的操作,需要通過partitioner進行重新分區的操作,因此,執行這個流程時,需要執行一次shuffle的操作(如果要進行合併的兩個RDD的都已經是shuffle後的rdd,同時他們對應的partitioner相同時,就不需要執行shuffle

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