數據結構
核心之數據集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