1. 程式人生 > >spark基本組件與概念

spark基本組件與概念

維表 優化 shu 合成 dag 優勢 lib task hive

數據結構

核心之數據集RDD

俗稱為彈性分布式數據集。Resilient Distributed Datasets,意為容錯的、並行的數據結構,可以讓用戶顯式地將數據存儲到磁盤和內存中,並能控制數據的分區。同時,RDD還提供了一組豐富的操作來操作這些數據。

RDD的特點

  • 它是在集群節點上的不可變的、已分區的集合對象。
  • 通過並行轉換的方式來創建如(map, filter, join, etc)。
  • 失敗自動重建。
  • 可以控制存儲級別(內存、磁盤等)來進行重用。
  • 必須是可序列化的。
  • 是靜態類型的。

優點:

1編譯時類型安全
2面向對象的編程風格 ,直接通過類名點的方式來操作數據

缺點:

1序列化和反序列化的性能開銷
因為RDD只有數據,沒有數據結構,無論是集群間的通信, 還是IO操作都需要對對象的結構和數據進行序列化和反序列化.
2GC的性能開銷
頻繁的創建和銷毀對象, 勢必會增加GC

RDD曾是spark處理數據最核心的基本單元,而spark在1.6推出了新的數據處理對象DataFarme和DataSet。

DataFarme

它在RDD的基礎上增加了數據的類型。DataFrame是一種以RDD為基礎的分布式數據集,類似於傳統數據庫中的二維表格。

技術分享

它針對RDD的弱點做了如下優化

序列化與反序列化的性能開銷

這個不用說,因為有了數據結構,所以節省了這一塊。具體上,DataFrame引入了schema : RDD每一行的數據, 結構都是一樣的. 這個結構就存儲在schema中. spark通過schame就能夠讀懂數據, 因此在通信和IO時就只需要序列化和反序列化數據, 而結構的部分就可以省略了.

GC的性能開銷

DataFrame引入了off-heap : 意味著JVM堆以外的內存, 這些內存直接受操作系統管理(而不是JVM)。Spark能夠以二進制的形式序列化數據(不包括結構)到off-heap中, 當要操作數據時, 就直接操作off-heap內存. 由於Spark理解schema, 所以知道該如何操作.

但是,DataFrame針對RDD的弱點做了優化,但是它卻沒有了RDD類型安全和面向對象的優點。可謂是有得必有失。人生不過是取舍。

Dataset

結合了RDD和DataFrame的優點。它同時具備了RDD的類型安全和面向對象優點,同時也具備了DataFrame的schema和off-heap。同時,它引入了新的概念Encoder。能夠按需訪問,而無需訪問整個對象。

總結

1:RDD類型安全,面向對象。

2:RDD僅有數據沒有數據結構,序列化開銷大。DataFrame引入schema使其具備了數據結構。同時其生命周期脫離了JVM和頻繁的GC回收。因此其不再是字節碼,而是二進制,又因為schema,所以操作系統和spark能夠快速識別。但DataFrame失去了RDD類型安全面向對象的優點。

3:DataSet具體RDD和DataFrame的共同優點。同時能夠按字段訪問,無需操作整 個對象。

4:就優點和性能來說 RDD<DataFrame<DataSet

組件

技術分享

Spark SQL 通常用於交互式查詢,但這一領域同類產品太多,更多作為MapReduce的替代者,用於批量作業。

Spark Streaming 流式batch處理。主要同類產品為storm。除了storm延遲低以外,想不出不使用spark streaming的理由。(spark streaming 2.2以後延遲將降低到1ms以內;除了spark不穩定和不兼容的理由以外)

MLlib機器學習, 不了解。

GraphX圖計算,不了解。

Spark core spark的核心框架,以上四大組件都依賴於core。

核心概念

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。

技術分享

圖片來自:https://github.com/lw-lin/CoolplaySpark/blob/master/Spark%20Streaming%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%B3%BB%E5%88%97/1.1%20DStream%2C%20DStreamGraph%20%E8%AF%A6%E8%A7%A3.md

常見概念

未完待續

比較優勢

網上曾有人號稱,spark要取代hadoop。目前看來,spark並無這樣的打算。事實上,hadoop已經成為大數據領域的標準,怎麽取代呢。spark官方也從未說過這樣的話。比如分布式數據存儲,spark官方並未有hdfs的替代方案。資源管理調度,spark有自己的想法,但遠遠達不到生產階段。除了standnode,還是得深度依賴mesos和yarn。實際上,spark只是hadoop的一個有益補充,如果真的要說替代的話,也只能說是替代mapreduce和storm。

spark的優勢體現在:

1:內存計算。這是最廣為人知的一點。但是spark在寬依賴的時候也得進行suffle,面且所說,hadoop3.0也引入了內存計算。內存計算絕不是spark引以為傲的優勢。據說,在資源緊張spark根本沒有多少內存進行計算的情況下,同樣的配置和數據條件下,spark依然比mapreduce效率高。(據官網,內存計算,spark效率是mapreduce10-100倍,磁盤計算,spark效率是mapreduce10倍,非內存計算沒有測試過)

2:弱化了批處理和實時計算。在spark誕生之前,大數據分成了涇渭分明的兩大陣營。批處理和實時,分別以hadoop(mapreduce)和storm為代表。spark以spark sql和spark streaming將兩者整合了起來。當然,這裏的弱化絕不僅僅是簡單的將實時和批處理技術整合成一家。spark創造性的將數據整合為RDD,可大可小,時間可以自行設置。在spark裏,數據將是流動的,各種RDD可以自由組合計算。

3:DAG。當然DAG是一種編程思想,並非spark獨有。DAG加RDD為spark帶來了高容錯的特性。如果處理失敗,只需恢復失敗的RDD即可。

4:得益於scala語言的簡潔強大,spark提供了許多強大的算子。hadoop只提供了map及reduce(shuffle階段除外),storm trident提供了更多的算子,但是效率是個問題。比如,wordcount的例子,分別用mapreduce,storm和spark開發,開發效率上spark會有很大的優勢。

5:storm進行批處理(minibath)的trident效率低,容錯低。它是將數據緩存到本地,而streaming提供了更多的選擇,比如streaming提供了lazy的kafka driect api。效率更高,容錯更高,占用資源更少。

參考:

http://www.36dsj.com/archives/61155

http://blog.csdn.net/wo334499/article/details/51689549

spark基本組件與概念