本篇文章為大家帶來spark面試指南,文內會有兩種題型,問答題和代碼題,題目大部分來自於網絡上,有小部分是來自於工作中的總結,每個題目會給出一個參考答案。
為什麼考察Spark?
Spark作為大數據組件中的執行引擎,具備以下優勢特性。
1.高效性。內存計算下,Spark 比 MapReduce 快100倍。Spark使用最先進的DAG調度程序、查詢優化程序和物理執行引擎,實現批量和流式數據的高性能。
2.易用性。Spark支持Java、Python和Scala的API,還支持超過80種高級算法,使用戶可以快速構建多樣的應用。
3.通用性。Spark提供了統一的解決方案。Spark可以用於批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。這些不同類型的處理都可以在同一個應用中無縫使用。這對於企業應用來說,就可使用一個平台來進行不同的工程實現,減少了人力開發和平台部署成本。
4.兼容性。Spark能夠跟很多開源工程兼容使用。如Spark可以使用Hadoop的YARN和Apache Mesos作為它的資源管理和調度器,並且Spark可以讀取多種數據源,如HDFS、HBase、MySQL等。對於任何一家已經部署好Hadoop基礎集群的企業來說,在不需要進行任何數據遷移和處理的情況下,就可以快速使用上Spark強大的數據處理和計算能力。
可以說Spark幾乎是企業搭建大數據平台必備組件,作為數據分析工程師在工作中執行程序、調試程序、查詢數據都會和Spark打交道,所以對Spark知識的考察也就順理成章了。
怎麼去準備Spark的面試?對於概念類的知識點可以在面試前突擊一下,閱讀類似本文的面試指南,對於代碼類的或者涉及項目類的考題更多的是需要平時工作和學習的積累,多寫一些代碼並加上自己的思考。
精選考題
基本概念
1、Spark支持的程式語言有哪幾種?
Spark 同時支持Scala、Python、Java 、R四種應用程式API編程接口和編程方式, 考慮到大數據處理的特性,一般會優先使用Scala進行編程。
2、Spark有什麼特點,處理大數據有什麼優勢?
1.Spark為我們提供了一個全面、統一的框架,能夠適用於各種各樣原先需要多種不同的分布式平台的場景,包括批處理、疊代算法、交互式查詢和流處理。
2.Spark相比於MapReduce的運行速度提升幾十到幾百倍。
3.Spark提供了豐富的開箱即用運算元工具,讓開發者可以快速的用Java、Scala或Python編寫程序。它本身自帶了一個超過80個的高階操作符集合。
3、Spark中Worker的主要工作是什麼?
主要功能:管理當前節點內存和CPU的使用狀況,接收master分配過來的資源指令,通過ExecutorRunner啟動程序分配任務,worker就類似於包工頭,管理分配新進程,做計算的服務,相當於process服務。
需要注意的是:
1)worker不會彙報當前信息給master,worker心跳給master只有workid,它不會發送資源信息給mater。
2)worker不會運行代碼,具體運行的是Executor,worker可以運行具體appliaction寫的業務邏輯代碼,操作代碼的節點,它不會運行程序的代碼的。
4、Spark Driver的功能是什麼 ?
答:1)一個Spark作業運行時包括一個Driver進程,也是作業的主進程,具有main函數,並且持有SparkContext的實例,是程序的人口點;2)功能:負責向集群申請資源,向master註冊信息,負責作業的調度,負責作業的解析,生成Stage並調度Task到Executor上。包括DAGScheduler,TaskScheduler。
5、Spark是如何容錯的?
一般來說,分布式數據集的容錯性有兩種方式:數據檢查點和記錄數據的更新。
面向大規模數據分析,數據檢查點操作成本非常高,需要通過數據中心的網絡連接在機器之間複製龐大的數據集,而網絡帶寬往往比內存帶寬低得多,同時還需要消耗很多其它的存儲資源。因此,Spark選擇記錄更新的方式。可是,假設更新粒度太細太多,那麼記錄更新成本也不低。故RDD僅僅支持粗粒度轉換,即僅僅記錄單個塊上運行的單個操作,然後將創建RDD的一系列變換序列(每一個RDD都包括了他是怎樣由其它RDD變換過來的以及怎樣重建某一塊數據的信息。因此RDD的容錯機制又稱「血統(Lineage)」容錯)記錄下來,以便恢復丟失的分區。
Lineage本質上非常相似於資料庫中的重做日誌(Redo Log),只是這個重做日誌粒度非常大,是對全局數據做相同的重做進而恢複數據。
6、說說SparkContext和SparkSession有什麼區別和聯繫?
SparkContext是使用Spark功能的入口點。SparkSession是Spark2.x後引入的概念。在2.x之前,對於不同的功能,需要使用不同的Context,比如
1.創建和操作RDD時,使用SparkContext
2.使用Streaming時,使用StreamingContext
3.使用SQL時,使用SQLContext
4.使用Hive時,使用HiveContext
在2.x中,為了統一上述的Context,引入SparkSession,實質上是SQLContext、HiveContext、SparkContext的組合。
7、hadoop和spark的都是並行計算,那麼他們有什麼相同和區別?(優勢在哪裡,只寫區別)
1.兩者都是用mr模型來進行並行計算,但機制不同。hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束。
spark用戶提交的任務稱為application,一個application中存在多個job,每觸發一次action操作就會產生一個job。這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關係劃分job而來的,每個stage裡面有多個task,組成taskset,由TaskSchaduler分發到各個executor中執行,executor的生命周期是和application一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存中的數據並進行計算;
2.hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係;而spark則提供了豐富的運算元,可以實現常用的各種數據處理操作。
3.spark的疊代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。
8、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)SparkR:是一個R語言包,它提供了輕量級的方式使得可以在R語言中使用Apache Spark。在Spark 1.4中,SparkR實現了分布式的dataframe,支持類似查詢、過濾以及聚合的操作,但是這個可以操作大規模的數據集。
5)MLBase是Spark生態圈的一部分專注於機器學習,讓機器學習的門檻更低,讓一些可能並不了解機器學習的用戶也能方便地使用MLbase。MLBase分為四部分:MLlib、MLI、ML Optimizer和MLRuntime。
6)GraphX用於圖和圖並行計算。
9、Spark有幾種部署模式,每種模式特點?
local(本地模式):常用於本地開發測試,本地還分為local單線程和local-cluster多線程;
standalone(集群模式):典型的Master/Slave模式,Spark支持ZooKeeper來實現Master HA;
on yarn(集群模式):運行在 yarn 資源管理器框架之上,由 yarn 負責資源管理,Spark 負責任務調度和計算;
on mesos(集群模式):運行在 mesos 資源管理器框架之上,由 mesos 負責資源管理,Spark 負責任務調度和計算;
on cloud(集群模式):比如 AWS 的 EC2,使用這個模式能很方便的訪問 Amazon的 S3,Spark 支持多種分布式存儲系統:HDFS 和 S3等。
10、spark有哪些存儲級別?
1)MEMORY_ONLY:數據保存在內存中,如果內存不夠,數據可能就不會持久化;
2)MEMORY_AND_DISK:數據優先保存在內存中,如果內存不夠則會存到磁碟中;
3)MEMORY_ONLY_SER:和MEMORY_ONLY類似,區別是會將RDD中的數據進行序列化,這種方式更加節省內存;
4)MEMORY_AND_DISK_SER:和MEMORY_AND_DISK類似,區別是會將RDD中的數據進行序列化,這種方式更加節省內存;
5)DISK_ONLY:將數據全部寫入磁碟文件中;
6)MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等:這種有後綴_2的,代表的是將每個持久化的數據,都複製一份副本,並將副本保存到其他節點上。這種基於副本的持久化機制主要用於進行容錯。
11、RDD的優勢是什麼?
1)高效容錯機制
RDD沒有checkpoint的開銷,想還原一個RDD只需要根據血緣關係就可以,而且基本不涉及分區的重計算,除非分區的數據丟失了,重算過程在不同節點並行進行,不需要將整個系統回滾。
2)數據本地性
任務能夠根據數據本地性(data locality)被分配,意思是優先將任務分配到數據存儲的節點,從而提高性能。
3)優雅降級 (degrade gracefully)
讀取數據最快的方式當然是從內存中讀取,但是當內存不足的時候,RDD會將大分區溢出存儲到磁碟,也能繼續提供並行計算的能力。
12、DataFrame的特性?
1)大數據量級:支持從KB到PB級的數據量
2)多種數據源:支持多種數據格式和多種存儲系統
3)代碼優化:通過Catalyst優化器進行先進的優化生成代碼
4)通用性:通過Spark無縫集成主流大數據工具與基礎設施
5)多種開發語言:API支持Python、Java、Scala和R語言。
13、RDD中關於轉換(transformation)與動作(action)的區別?
transformation操作會產生新的RDD,而action不會,但是它會觸發運算,將RDD上某項操作的結果返回給程序。無論發生多少次transformation操作都不會觸發運算,只有action操作才會觸發運算。
14、RDD中有幾種依賴?有什麼作用?
有窄依賴(narrowdependencies)和寬依賴(widedependencies)兩種。窄依賴是指父RDD的每個分區都只被子RDD的一個分區所使用。相應的,那麼寬依賴就是指父RDD的分區被多個子RDD的分區所依賴。例如,map就是一種窄依賴,而join則會導致寬依賴,主要是看有沒有shuffle操作。
寬窄依賴的作用是用來劃分stage。
15、rdd有幾種操作類型?
1)transformation,rdd由一種轉為另一種rdd;
2)action,觸發具體的作業,對RDD最後取結果的一種操作
另外特殊的cache、persist,對性能效率和容錯方面的支持。
16、cache和persist的區別?
它們都是用來進行緩存的。
1)cache是特定的persist,rdd中cache的緩存級別是MEMORY_ONLY,cache調用了persist;
3)persist可以設置不同的緩存級別。
ataSet?以及他們之間的區別
17、什麼是RDD?什麼是DataFrame?什麼是DataSet?以及他們之間的區別?
RDD全稱Resilient Distributed Dataset,彈性分布式數據集,它是記錄的只讀分區集合,是Spark的基本數據結構,見名釋義:
彈性,表現在兩個方面,一是當計算過程中內存不足時可刷寫到磁碟等外存上,可與外存做靈活的數據交換;二是RDD使用了一種「血統」的容錯機制,在結構更新和丟失後可隨時根據血統進行數據模型的重建;
分布式,可分布在多台機器上進行並行計算;
數據集,一組只讀的、可分區的分布式數據集合,集合內包含了多個分區,分區依照特定規則將具有相同屬性的數據記錄放在一起,每個分區相當於一個數據集片段。
理解了RDD,DataFrame理解起來就比較容易了,DataFrame的思想來源於Python的pandas庫,RDD是一個數據集,DataFrame在RDD的基礎上加了Schema(描述數據的信息,可以認為是元數據,DataFrame曾經就有個名字叫SchemaRDD)。
DataSet是DataFrame API的擴展。相較於RDD來說,DataSet提供了強類型支持,區別也是給RDD的每行數據加了類型約束。
共同點
1.RDD、DataFrame、DataSet全都是Spark平台下的分布式彈性數據集,為處理超大型數據提供便利。
2.三者都有惰性機制,在進行創建、轉換等階段,如map、filter等方法時,不會立即執行,只有在遇到Action如count、collect等時,才會真正開始運算。
3.三者都會根據Spark的內存情況自動緩存運算,這樣即使數據量很大,也不用擔心會內存溢出。
4.三者有許多共同的函數,如filter、map等。
不同點
1.RDD不支持Sparksql操作,DataFrame與DataSet均支持Sparksql,比如select,groupby之類,還能註冊臨時表/視圖,實現與sql語句的無縫操作。
2.DataSet和DataFrame擁有完全相同的成員函數,區別在於每一行的數據類型和欄位類型是否明確。DataFrame也可以叫DataSet[Row],每一行的類型為Row,而DataSet每一行的數據類型是確定的。DataFrame只知道欄位,但無法確定欄位的具體類型,所以在執行這些操作的時候是沒辦法在編譯的時候檢查類型是否匹配的,比如你可以對一個String進行減法操作,在執行的時候才會報錯,而DataSet不僅僅知道欄位,還知道欄位類型,所以有更嚴格的錯誤檢查。
3.相比於RDD,DataFrame與DataSet支持一些特別方便的保存方式,比如保存成csv,且可以帶上表頭,這樣每一列的欄位名一目了然。
end:如果你覺得本文對你有幫助的話,記得關注點贊轉發,你的支持就是我更新動力。