「面試妥了」史上最全Spark面試題

2019-10-03     科技百分百

戳藍字「CSDN雲計算關注我們哦!

作者 | 游騎小兵

責編 | 阿禿

Spark問題精華

Q:什麼是Spark?

A:簡單理解,Spark是在Hadoop基礎上的改進,是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的並行計算框架,Spark基於map reduce算法實現的分布式計算,擁有Hadoop MapReduce所具有的優點;但不同於MapReduce的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要疊代的map reduce的算法。

Q:為什麼要學Spark?

A:基於MapReduce的計算引擎通常會將中間結果輸出到磁碟上,進行存儲和容錯。出於任務管道承接的考慮,當一些查詢翻譯到MapReduce任務時,往往會產生多個Stage,而這些串聯的Stage又依賴於底層文件系統(如HDFS)來存儲每一個Stage的輸出結果。

Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生態系統,以彌補MapReduce的不足。

Q:Spark有什麼特性?

A:1、高效性

運行速度提高100倍。Apache Spark使用最先進的DAG調度程序,查詢優化程序和物理執行引擎,實現批量和流式數據的高性能。

2、易用性

Spark支持Java、Python和Scala的API,還支持超過80種高級算法,使用戶可以快速構建不同的應用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在這些shell中使用Spark集群來驗證解決問題的方法。

3、通用性

Spark提供了統一的解決方案。Spark可以用於批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。這些不同類型的處理都可以在同一個應用中無縫使用。Spark統一的解決方案非常具有吸引力,畢竟任何公司都想用統一的平台去處理遇到的問題,減少開發和維護的人力成本和部署平台的物力成本。

4、兼容性

Spark可以非常方便地與其他的開源產品進行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作為它的資源管理和調度器,器,並且可以處理所有Hadoop支持的數據,包括HDFS、HBase和Cassandra等。這對於已經部署Hadoop集群的用戶特別重要,因為不需要做任何數據遷移就可以使用Spark的強大處理能力。Spark也可以不依賴於第三方的資源管理和調度器,它實現了Standalone作為其內置的資源管理和調度框架,這樣進一步降低了Spark的使用門檻,使得所有人都可以非常容易地部署和使用Spark。此外,Spark還提供了在EC2上部署Standalone的Spark集群的工具。

Q:Spark生態圈介紹

A:Spark力圖整合機器學習(MLib)、圖算法(GraphX)、流式計算(Spark Streaming)和數據倉庫(Spark SQL)等領域,通過計算引擎Spark,彈性分布式數據集(RDD),架構出一個新的大數據應用平台。

Spark生態圈以HDFS、S3、Techyon為底層存儲引擎,以Yarn、Mesos和Standlone作為資源調度引擎;使用Spark,可以實現MapReduce應用;基於Spark,Spark SQL可以實現即席查詢,Spark Streaming可以處理實時應用,MLib可以實現機器學習算法,GraphX可以實現圖計算,SparkR可以實現複雜數學計算。

Q:Spark與Hadoop的對比

A:Spark的中間數據放到內存中,對於疊代運算效率更高。Spark更適合於疊代運算比較多的ML和DM運算。因為在Spark裡面,有RDD的抽象概念。所以,Spark比Hadoop更通用。

Q:spark的組成有哪些?

A:Spark組成(BDAS):全稱伯克利數據分析棧,通過大規模集成算法、機器、人之間展現大數據應用的一個平台。也是處理大數據、雲計算、通信的技術解決方案。

它的主要組件有:

SparkCore:將分布式數據抽象為彈性分布式數據集(RDD),實現了應用任務調度、RPC、序列化和壓縮,並為運行在其上的上層組件提供API。

SparkSQL:Spark Sql 是Spark來操作結構化數據的程序包,可以讓我使用SQL語句的方式來查詢數據,Spark支持 多種數據源,包含Hive表,parquest以及JSON等內容。

SparkStreaming:是Spark提供的實時數據進行流式計算的組件。

MLlib:提供常用機器學習算法的實現庫。

GraphX:提供一個分布式圖計算框架,能高效進行圖計算。

BlinkDB:用於在海量數據上進行交互式SQL的近似查詢引擎。

Tachyon:以內存為中心高容錯的的分布式文件系統。

Q:Spark的工作流程是什麼樣的呢?

A:通俗的解釋就是:Spark是為了處理數據而生的平台,用一個比喻來形容它是餐館。餐館搭建好了後,就會有顧客,顧客的各種需求都得有人去處理,那麼這時的Master就像是服務員,負責了解顧客的要求並把需求按照一定規律分配給廚師(Worker),這個顧客的需求就是一個APP,但這個APP不止包括了一個菜(job),整個訂單里有很多個job,每個job都得由這些廚師處理,廚師的手就像是具體處理的Executor,負責所有的包括shuffle啊,filter啊,map啊,reduce等等具體的對原材料(RDD)的處理。driver就像是懶惰的廚師長,worker向它申請資源,同時它負責接收下面的人處理好的半成品材料或者完成品的菜品,但它自己並不幹具體的活,如果是別人處理好的半成品,driver就將它分配給它認為有空的人接著處理(可能是map後要reduce的東西),直到目前的stage結束得到具體想要的結果,如果是直接就是想要的數據形式(一個job的完成),那麼driver就通知master收貨並反饋給顧客(可能是python程序,scala程序等等)。

Q:Apache Spark和Apache Storm之間有什麼差異,用戶應該根據什麼來加以選擇?

A:Apache Spark是一個內存中的分布式數據分析平台- 主要針對加快批量分析工作,反覆機器學習的工作,交互式查詢和圖形處理。一個最主要區別是Spark使用彈性分布式數據集(RDD)。RDD是通過並行運算符來進行計算,並根據定義它是一成不變的。RDD允許Spark基於譜系信息容錯的獨特的形式。如果你對執行Hadoop MapReduce作業更快,那麼Spark是一個很好的選擇(即使在這裡需要考慮內存的因素)。

Apache Storm是專注於流處理或者一些所謂複雜事件的處理。Storm實現容錯的方法進行計算或者以流水線的方式多次計算一個事件,由於Storm進入一個需要特定格式的系統,那麼可能導致它轉換為一個非結構化的數據。

Storm和Spark存在相當不同的使用情況。Storm和Spark流更多是類似「蘋果和蘋果」比較。由於Spark的SSD本身是不可變的,Spark流實現在用戶定義的時間間隔「定量」來實現更新,得到改造成自己的RDD的方法,從而Spark的並行操作人員可以對這些RDD進行計算。這是與Storm處理每個事的不同之處。

這兩種技術之間的一個主要區別是,Spark進行數據的並行計算,而Storm則是任務的並行計算。無論是那種方法,都有它表現價值的一方面。

Q:RDD的核心概念是什麼?

A:Client:客戶端進程,負責提交作業到Master。

Master:Standalone模式中主控節點,負責接收Client提交的作業,管理Worker,並命令Worker啟動分配Driver的資源和啟動Executor的資源。

Worker:Standalone模式中slave節點上的守護進程,負責管理本節點的資源,定期向Master彙報心跳,接收Master的命令,啟動Driver和Executor。

Driver:一個Spark作業運行時包括一個Driver進程,也是作業的主進程,負責作業的解析、生成Stage並調度Task到Executor上。包括DAGScheduler,TaskScheduler。

Executor:即真正執行作業的地方,一個集群一般包含多個Executor,每個Executor接收Driver的命令Launch Task,一個Executor可以執行一到多個Task。

Q:RDD有哪些常見術語?

A:DAGScheduler:實現將Spark作業分解成一到多個Stage,每個Stage根據RDD的Partition個數決定Task的個數,然後生成相應的Task set放到TaskScheduler中。

TaskScheduler:實現Task分配到Executor上執行。

Task:運行在Executor上的工作單元。

Job:SparkContext提交的具體Action操作,常和Action對應。

Stage:每個Job會被拆分很多組任務(task),每組任務被稱為Stage,也稱TaskSet。

RDD:Resilient Distributed Datasets的簡稱,彈性分布式數據集,是Spark最核心的模塊和類。

Transformation/Action:SparkAPI的兩種類型;Transformation返回值還是一個RDD,Action返回值不少一個RDD,而是一個Scala的集合;所有的Transformation都是採用的懶策略,如果只是將Transformation提交是不會執行計算的,計算只有在Action被提交時才會被觸發。

Q:RDD提供了哪些操作?

A:RDD提供了兩種類型的操作:

transformation和action

1. transformation是得到一個新的RDD,方式很多,比如從數據源生成一個新的RDD,從RDD生成一個新的RDD

2. action是得到一個值,或者一個結果(直接將RDD cache到內存中)

3. 所有的transformation都是採用的懶策略,就是如果只是將transformation提交是不會執行計算的,計算只有在action被提交的時候才被觸發。

DataFrame:帶有Schema信息的RDD,主要是對結構化數據的高度抽象。

DataSet:結合了DataFrame和RDD兩者的優勢,既允許用戶很方便的操作領域對象,又具有SQL執行引擎的高效表現。

Q:RDD中關於轉換(transformation)與動作(action)有什麼區別?

A:transformation會生成新的RDD,而後者只是將RDD上某項操作的結果返回給程序,而不會生成新的RDD;無論執行了多少次transformation操作,RDD都不會真正執行運算(記錄lineage),只有當action操作被執行時,運算才會觸發。

Q:RDD 與 DSM的最大不同是什麼?

A:RDD只能通過粗粒度轉換來創建,而DSM則允許對每個內存位置上數據的讀和寫。在這種定義下,DSM不僅包括了傳統的共享內存系統,也包括了像提供了共享 DHT(distributed hash table) 的 Piccolo 以及分布式資料庫等。

文章來源: https://twgreatdaily.com/zh-sg/0TpanW0BMH2_cNUgogbp.html