Spark Core面試篇01
1、簡答題
1.Spark master使用zookeeper進行HA的,有哪些元數據保存在Zookeeper?
答:spark經過這個參數spark.deploy.zookeeper.dir指定master元數據在zookeeper中保存的位置,包括Worker,Driver和Application以及Executors。standby節點要從zk中,得到元數據信息,恢復集羣運行狀態,才能對外繼續提供服務,做業提交資源申請等,在恢復前是不能接受請求的。另外,Master切換須要注意2點
1)在Master切換的過程當中,全部的已經在運行的程序皆正常運行!由於Spark Application在運行前就已經經過Cluster Manager得到了計算資源,因此在運行時Job自己的調度和處理和Master是沒有任何關係的!
2) 在Master的切換過程當中惟一的影響是不能提交新的Job:一方面不可以提交新的應用程序給集羣,由於只有Active Master才能接受新的程序的提交請求;另一方面,已經運行的程序中也不可以由於Action操做觸發新的Job的提交請求;
2.Spark master HA 主從切換過程不會影響集羣已有的做業運行,爲何?
答:由於程序在運行以前,已經申請過資源了,driver和Executors通信,不須要和master進行通信的。
3.Spark on Mesos中,什麼是的粗粒度分配,什麼是細粒度分配,各自的優勢和缺點是什麼?
答:1)粗粒度:啓動時就分配好資源, 程序啓動,後續具體使用就使用分配好的資源,不須要再分配資源;好處:做業特別多時,資源複用率高,適合粗粒度;很差:容易資源浪費,假如一個job有1000個task,完成了999個,還有一個沒完成,那麼使用粗粒度,999個資源就會閒置在那裏,資源浪費。2)細粒度分配:用資源的時候分配,用完了就當即回收資源,啓動會麻煩一點,啓動一次分配一次,會比較麻煩。
4.如何配置spark master的HA?
1)配置zookeeper
2)修改spark_env.sh文件,spark的master參數不在指定,添加以下代碼到各個master節點
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分發到各個節點
4)找到一個master節點,執行./start-all.sh,會在這裏啓動主master,其餘的master備節點,啓動master命令: ./sbin/start-master.sh
5)提交程序的時候指定master的時候要指定三臺master,例如
./spark-shell --master spark://master01:7077,master02:7077,master03:7077
5.Apache Spark有哪些常見的穩定版本,Spark1.6.0的數字分別表明什麼意思?
答:常見的大的穩定版本有Spark 1.3,Spark1.6, Spark 2.0 ,Spark1.6.0的數字含義
1)第一個數字:1
major version : 表明大版本更新,通常都會有一些 api 的變化,以及大的優化或是一些結構的改變;
2)第二個數字:6
minor version : 表明小版本更新,通常會新加 api,或者是對當前的 api 就行優化,或者是其餘內容的更新,好比說 WEB UI 的更新等等;
3)第三個數字:0
patch version , 表明修復當前小版本存在的一些 bug,基本不會有任何 api 的改變和功能更新;記得有一個大神曾經說過,若是要切換 spark 版本的話,最好選 patch version 非 0 的版本,由於通常相似於 1.2.0, … 1.6.0 這樣的版本是屬於大更新的,有可能會有一些隱藏的 bug 或是不穩定性存在,因此最好選擇 1.2.1, … 1.6.1 這樣的版本。
經過版本號的解釋說明,能夠很容易瞭解到,spark2.1.1的發佈時是針對大版本2.1作的一些bug修改,不會新增功能,也不會新增API,會比2.1.0版本更加穩定。
6.driver的功能是什麼?
答: 1)一個Spark做業運行時包括一個Driver進程,也是做業的主進程,具備main函數,而且有SparkContext的實例,是程序的人口點;2)功能:負責向集羣申請資源,向master註冊信息,負責了做業的調度,,負責做業的解析、生成Stage並調度Task到Executor上。包括DAGScheduler,TaskScheduler。
7.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還提供了另一種調度模式:細粒度模式,這種模式相似於如今的雲計算,思想是按需分配。
8.Spark技術棧有哪些組件,每一個組件都有什麼功能,適合什麼應用場景?
答:能夠畫一個這樣的技術棧圖先,而後分別解釋下每一個組件的功能和場景node
1)Spark core:是其它組件的基礎,spark的內核,主要包含:有向循環圖、RDD、Lingage、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中用於圖和圖並行計算
9.Spark中Work的主要工做是什麼?
答:主要功能:管理當前節點內存,CPU的使用情況,接收master分配過來的資源指令,經過ExecutorRunner啓動程序分配任務,worker就相似於包工頭,管理分配新進程,作計算的服務,至關於process服務。須要注意的是:1)worker會不會彙報當前信息給master,worker心跳給master主要只有workid,它不會發送資源信息以心跳的方式給mater,master分配的時候就知道work,只有出現故障的時候纔會發送資源。2)worker不會運行代碼,具體運行的是Executor是能夠運行具體appliaction寫的業務邏輯代碼,操做代碼的節點,它不會運行程序的代碼的。
10.Spark爲何比mapreduce快?
答:1)基於內存計算,減小低效的磁盤交互;2)高效的調度算法,基於DAG;3)容錯機制Linage,精華部分就是DAG和Lingae
11.簡單說一下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。
12.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圖能夠實現良好的容錯。
13.RDD機制?
答:rdd分佈式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。
全部算子都是基於rdd來執行的,不一樣的場景會有不一樣的rdd實現類,可是均可以進行互相轉換。
rdd執行過程當中會造成dag圖,而後造成lineage保證容錯性等。 從物理的角度來看rdd存儲的是block和node之間的映射。
1四、spark有哪些組件?
答:主要有以下組件:
1)master:管理集羣和節點,不參與計算。
2)worker:計算節點,進程自己不參與計算,和master彙報。
3)Driver:運行程序的main方法,建立spark context對象。
4)spark context:控制整個application的生命週期,包括dagsheduler和task scheduler等組件。
5)client:用戶提交程序的入口。
1五、spark工做機制?
答:用戶在client端提交做業後,會由Driver運行main方法並建立spark context上下文。
執行add算子,造成dag圖輸入dagscheduler,按照add之間的依賴關係劃分stage輸入task scheduler。 task scheduler會將stage劃分爲task set分發到各個節點的executor中執行。
1六、spark的優化怎麼作?
答: spark調優比較複雜,可是大致能夠分爲三個方面來進行,1)平臺層面的調優:防止沒必要要的jar包分發,提升數據的本地性,選擇高效的存儲格式如parquet,2)應用程序層面的調優:過濾操做符的優化下降過多小任務,下降單條記錄的資源開銷,處理數據傾斜,複用RDD進行緩存,做業並行化執行等等,3)JVM層面的調優:設置合適的資源量,設置合理的JVM,啓用高效的序列化方法如kyro,增大off head內存等等
17.簡要描述Spark分佈式集羣搭建的步驟
1)準備linux環境,設置集羣搭建帳號和用戶組,設置ssh,關閉防火牆,關閉seLinux,配置host,hostname
2)配置jdk到環境變量
3)搭建hadoop集羣,若是要作master ha,須要搭建zookeeper集羣
修改hdfs-site.xml,hadoop_env.sh,yarn-site.xml,slaves等配置文件
4)啓動hadoop集羣,啓動前要格式化namenode
5)配置spark集羣,修改spark-env.xml,slaves等配置文件,拷貝hadoop相關配置到spark conf目錄下
6)啓動spark集羣。
18.什麼是RDD寬依賴和窄依賴?
RDD和它依賴的parent RDD(s)的關係有兩種不一樣的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)。
1)窄依賴指的是每個parent RDD的Partition最多被子RDD的一個Partition使用
2)寬依賴指的是多個子RDD的Partition會依賴同一個parent RDD的Partition
19.spark-submit的時候如何引入外部jar包
方法一:spark-submit –jars
根據spark官網,在提交任務的時候指定–jars,用逗號分開。這樣作的缺點是每次都要指定jar包,若是jar包少的話能夠這麼作,可是若是多的話會很麻煩。
命令:spark-submit --master yarn-client --jars .jar,.jar
方法二:extraClassPath
提交時在spark-default中設定參數,將全部須要的jar包考到一個文件裏,而後在參數中指定該目錄就能夠了,較上一個方便不少:
spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/* spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*
須要注意的是,你要在全部可能運行spark任務的機器上保證該目錄存在,而且將jar包考到全部機器上。這樣作的好處是提交代碼的時候不用再寫一長串jar了,缺點是要把全部的jar包都拷一遍。
20.cache和pesist的區別
答:1)cache和persist都是用於將一個RDD進行緩存的,這樣在以後使用的過程當中就不須要從新計算了,能夠大大節省程序運行時間;2) cache只有一個默認的緩存級別MEMORY_ONLY ,cache調用了persist,而persist能夠根據狀況設置其它的緩存級別;3)executor執行的時候,默認60%作cache,40%作task操做,persist最根本的函數,最底層的函數linux
2、選擇題web
2.下面哪一個端口不是 spark 自帶服務的端口 (C )
A.8080 B.4040 C.8090 D.18080
備註:8080:spark集羣web ui端口,4040:sparkjob監控端口,18080:jobhistory端口面試
3.spark 1.4 版本的最大變化 (B )
A spark sql Release 版本 B .引入 Spark R
C DataFrame D.支持動態資源分配算法
5.哪一個不是本地模式運行的個條件 ( D)
A spark.localExecution.enabled=true
B 顯式指定本地運行
C finalStage 無父 Stage
D partition默認值sql
6.下面哪一個不是 RDD 的特色 (C )
A. 可分區 B 可序列化 C 可修改 D 可持久化shell
關於廣播變量,下面哪一個是錯誤的 (D )
A 任何函數調用 B 是隻讀的
C 存儲在各個節點 D 存儲在磁盤或 HDFS數據庫
關於累加器,下面哪一個是錯誤的 (D )
A 支持加法 B 支持數值類型
C 可並行 D 不支持自定義類型編程
9.Spark 支持的分佈式部署方式中哪一個是錯誤的 (D )
A standalone B spark on mesos
C spark on YARN D Spark on localapi
10.Stage 的 Task 的數量由什麼決定 (A )
A Partition B Job C Stage D TaskScheduler
11.下面哪一個操做是窄依賴 (B )
A join B filter
C group D sort
12.下面哪一個操做確定是寬依賴 (C )
A map B flatMap
C reduceByKey D sample
13.spark 的 master 和 worker 經過什麼方式進行通訊的? (D )
A http B nio C netty D Akka
14 默認的存儲級別 (A )
A MEMORY_ONLY B MEMORY_ONLY_SER
C MEMORY_AND_DISK D MEMORY_AND_DISK_SER
15 spark.deploy.recoveryMode 不支持那種 (D )
A.ZooKeeper B. FileSystem
D NONE D Hadoop
16.下列哪一個不是 RDD 的緩存方法 (C )
A persist() B Cache()
C Memory()
17.Task 運行在下來哪裏個選項中 Executor 上的工做單元 (C )
A Driver program B. spark master
C.worker node D Cluster manager
18.hive 的元數據存儲在 derby 和 MySQL 中有什麼區別 (B )
A.沒區別 B.多會話
C.支持網絡環境 D數據庫的區別
19.DataFrame 和 RDD 最大的區別 (B )
A.科學統計支持 B.多了 schema
C.存儲方式不同 D.外部數據源支持
20.Master 的 ElectedLeader 事件後作了哪些操做 (D ) A. 通知 driver B.通知 worker C.註冊 application D.直接 ALIVE