鎖屏面試題百日百刷-Spark篇(十)
鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.如何配置spark master的HA?
1)配置zookeeper
2)修改spark_env.sh文件,spark的master參數(shù)不在指定,添加如下代碼到各個master節(jié)點
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=zk01:2181,zk02:2181,zk03:2181 -Dspark.deploy.zookeeper.dir=/spark" 3)將spark_env.sh分發(fā)到各個節(jié)點
4)找到一個master節(jié)點,執(zhí)行./start-all.sh,會在這里啟動主master,其他的master備節(jié)點,啟動master命令: ./sbin/start-master.sh
5)提交程序的時候指定master的時候要指定三臺master,例如
./spark-shell --master spark://master01:7077,master02:7077,master03:7077
2.Spark中driver的功能是什么?
1)一個Spark作業(yè)運(yùn)行時包括一個Driver進(jìn)程,也是作業(yè)的主進(jìn)程,具有main函數(shù),并且有SparkContext的實例,是程序的人口點;
2)功能:負(fù)責(zé)向集群申請資源,向master注冊信息,負(fù)責(zé)了作業(yè)的調(diào)度,負(fù)責(zé)作業(yè)的解析、生成Stage并調(diào)度Task到Executor上。包括DAGScheduler,TaskScheduler。
3.park中Work的主要工作是什么?
主要功能:管理當(dāng)前節(jié)點內(nèi)存,CPU的使用狀況,接收master分配過來的資源指令,通過ExecutorRunner啟動程序分配任務(wù),worker就類似于包工頭,管理分配新進(jìn)程,做計算的服務(wù),相當(dāng)于process服務(wù)。
需要注意的是:
1)worker會不會匯報當(dāng)前信息給master,worker心跳給master主要只有workid,它不會發(fā)送資源信息以心跳的方式給mater,master分配的時候就知道work,只有出現(xiàn)故障的時候才會發(fā)送資源。
2)worker不會運(yùn)行代碼,具體運(yùn)行的是Executor是可以運(yùn)行具體appliaction寫的業(yè)務(wù)邏輯代碼,操作代碼的節(jié)點,它不會運(yùn)行程序的代碼的。
4.Spark為什么比mapreduce快?
1)基于內(nèi)存計算,減少低效的磁盤交互;
2)高效的調(diào)度算法,基于DAG;
3)容錯機(jī)制Linage,精華部分就是DAG和Lingae
5.簡單說一下hadoop和spark的shuffle相同和差異?
1)從 high-level 的角度來看,兩者并沒有大的差別。都是將 mapper(Spark 里是 ShuffleMapTask)的輸出進(jìn)行 partition,不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一個 stage 里的ShuffleMapTask,也可能是 ResultTask)。Reducer 以內(nèi)存作緩沖區(qū),邊 shuffle 邊 aggregate 數(shù)據(jù),等到數(shù)據(jù)aggregate 好以后進(jìn)行 reduce() (Spark 里可能是后續(xù)的一系列操作)。
2)從 low-level 的角度來看,兩者差別不小。Hadoop MapReduce 是 sort-based,進(jìn)入 combine() 和 reduce()的 records 必須先 sort。這樣的好處在于 combine/reduce() 可以處理大規(guī)模的數(shù)據(jù),因為其輸入數(shù)據(jù)可以通過外排得到(mapper 對每段數(shù)據(jù)先做排序,reducer 的 shuffle 對排好序的每段數(shù)據(jù)做歸并)。目前的 Spark 默認(rèn)選擇的是 hash-based,通常使用 HashMap 來對 shuffle 來的數(shù)據(jù)進(jìn)行 aggregate,不會對數(shù)據(jù)進(jìn)行提前排序。
如果用戶需要經(jīng)過排序的數(shù)據(jù),那么需要自己調(diào)用類似 sortByKey() 的操作;如果你是Spark 1.1的用戶,可以將spark.shuffle.manager設(shè)置為sort,則會對數(shù)據(jù)進(jìn)行排序。在Spark 1.2中,sort將作為默認(rèn)的Shuffle實現(xiàn)。
3)從實現(xiàn)角度來看,兩者也有不少差別。Hadoop MapReduce 將處理流程劃分出明顯的幾個階段:map(), spill, merge, shuffle, sort, reduce() 等。每個階段各司其職,可以按照過程式的編程思想來逐一實現(xiàn)每個階段的功能。
在 Spark 中,沒有這樣功能明確的階段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蘊(yùn)含在 transformation() 中。
如果我們將 map 端劃分?jǐn)?shù)據(jù)、持久化數(shù)據(jù)的過程稱為 shuffle write,而將 reducer 讀入數(shù)據(jù)、aggregate 數(shù)據(jù)的過程稱為 shuffle read。那么在 Spark 中,問題就變?yōu)樵趺丛?job 的邏輯或者物理執(zhí)行圖中加入 shuffle write和 shuffle read 的處理邏輯?以及兩個處理邏輯應(yīng)該怎么高效實現(xiàn)?
Shuffle write由于不要求數(shù)據(jù)有序,shuffle write 的任務(wù)很簡單:將數(shù)據(jù) partition 好,并持久化。之所以要持久化,一方面是要減少內(nèi)存存儲空間壓力,另一方面也是為了 fault-tolerance。