spark面試題 一

2021-09-10 15:54:00 字數 4108 閱讀 6103

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相同和差異?

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程式設定生效

答:會導致執行該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

Spark面試題(一)

1 本地模式 spark不一定非要跑在hadoop集群,可以在本地,起多個執行緒的方式來指定。將spark應用以多執行緒的方式直接執行在本地,一般都是為了方便除錯,本地模式分三類 local 只啟動乙個executor local k 啟動k個executor local 啟動跟cpu數目相同的 e...

Spark面試題 三

39.spark的udf?因為目前 spark sql 本身支援的函式有限,一些常用的函式都沒有,比如 len,concat.etc 但是使用 udf 來自己實現根據業務需要的功能是非常方便的。spark sql udf 其實是乙個 scala 函式,被 catalyst 封裝成乙個 express...

spark經典面試題

1 寬依賴 乙個分割槽對應多個分割槽,這就表明有shuffle過程,父分割槽資料經過shuffle過程的hash分割槽器劃分子rdd。例如 groupbykey reducebykey sortbykey等操作,shuffle可以理解為資料從原分割槽打亂重組到新分割槽 2 窄依賴 乙個分割槽對應乙個...