本文主要基於最新的Spark 2.1.0版本。閱讀本文能夠對Spark 2.1.0的學習過程,運行流程,關鍵組件,原理有所瞭解。文章有點長,你也能夠直接閱讀感興趣的部分,可是仍是建議全面瞭解。javascript
Spark是Apache軟件基金會下的分佈式系統開源項目。在官網中這樣概況這個項目html
Apache Spark is a fast and general engine for large-scale data processing.java
說Spark是一個用於大規模數據處理的快速通用分佈式引擎,到底有多快,請看下面這句node
Lightning-fast cluster computing算法
快如閃電的集羣計算。感受官網用閃電來形容有點抽象,我總結了Spark大體有如下特色:sql
Spark能夠很好的支持大數據中常見的三種場景批處理、交互式查詢、流數據處理。可是其流處理只能達到秒級,若是有毫秒級別的需求,只能考慮Storm了。shell
首先看官網的教程數據庫
看官網的教程基本給出了Scala,Java,Python三種代碼的例子,也就是說,你只要會其中一種就能夠玩了。可是考慮到Spark源碼是Scala寫的,從學習源碼的角度來看,用Scala是比較靠譜的。說下學習前的相關知識儲備編程
本文主要梳理Spark學習中大的知識脈絡,比較宏觀的原理,但願有個總體的認知。至於具體的如相關API的調用,細小的概念,因爲做者比較懶,請自行學習。
能夠從下面的地址下載到Spark的源碼,或者編譯後的包。
目前Spark中的1.X版本中最新的是1.6.3,而2.X版本中最新的是2.1.0。你能夠安裝Hadoop使用其中的分佈式文件系統HDFS,也能夠不安裝只使用本地文件系統。解壓完成後,建議將Spark加入Linux的環境變量,方便使用Spark的相關命令。Spark提供很好用的交互式工具,使用下面命令直接調用
spark-shell --master local[*]複製代碼
除了shell的交互方式。Spark固然也能夠運行獨立應用程序。Java程序能夠經過Maven來打包,Scala程序則經過sbt工具來打包,Python程序能夠直接運行。用IDEA操做比較方便。Spark的提交命令以下
spark-submit複製代碼
Spark的生態系統主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等件。
對RDD的理解主要對照官方文檔2.1.0的理解梳理。
The main abstraction Spark provides is a resilient distributed dataset (RDD), which is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. RDDs are created by starting with a file in the Hadoop file system (or any other Hadoop-supported file system), or an existing Scala collection in the driver program, and transforming it. Users may also ask Spark to persist an RDD in memory, allowing it to be reused efficiently across parallel operations. Finally, RDDs automatically recover from node failures.
Spark提供彈性分佈式數據集(RDD)做爲主要抽象,它能夠提供並行的操做在集羣的節點之間。(RDD建立)能夠經過從Hadoop文件系統(或任何其餘Hadoop支持的文件系統)中的文件或驅動程序中的現有Scala集合,或者經過RDD的轉化操做獲得。(RDD的持久化)用戶還能夠要求Spark 在內存中保留 RDD,從而在並行操做中有效地重用RDD。(RDD基於血緣關係的高容錯)最後,RDD自動從節點故障中恢復。
There are two ways to create RDDs: parallelizing an existing collection in your driver program, or referencing a dataset in an external storage system, such as a shared filesystem, HDFS, HBase, or any data source offering a Hadoop InputFormat.
建立RDD的兩種方法:並行化(即經過parallelize方法),或者在外部存儲系統(如共享文件系統,HDFS,HBase或提供Hadoop InputFormat的任何數據源)中引用數據集。
RDDs support two types of operations: transformations, which create a new dataset from an existing one, and actions, which return a value to the driver program after running a computation on the dataset.
All transformations in Spark are lazy, in that they do not compute their results right away. Instead, they just remember the transformations applied to some base dataset (e.g. a file). The transformations are only computed when an action requires a result to be returned to the driver program. This design enables Spark to run more efficiently.
RDDS支持兩種類型的操做:transformations(轉化),從現有的RDD建立一個新的RDD。actions(行動),其上運行的數據集計算後獲取值返回驅動程序。
Spark中的全部transformations操做都是懶操做,由於它們不會立刻計算它們的結果。他們只記住應用於某些基本數據集(例如文件)的轉換。只有當某個actions操做執行的時候,transformations操做纔會真正執行。此設計使Spark可以更高效地運行。
Spark SQL是用於結構化數據處理的Spark模塊。
Spark SQL的一個用途是執行SQL查詢。Spark SQL也可用於從Hive中讀取數據。當編程語言運行SQL時,結果將以Dataset / DataFrame的形式返回。還可使用命令行或JDBC / ODBC與SQL界面進行交互。
Dataset是分佈式數據集。Dataset是Spark 1.6中開始添加的新功能,它使RDD具有了強類型,強大的lambda函數等功能,同時具備Spark SQL優化的執行引擎的優勢。Dataset能夠從JVM對象中建立,而後使用功能性的轉換(操做map,flatMap,filter等等)。數據集API可用於Scala和Java。Python不支持Dataset API。
Dataset跟RDD相似,可是他不使用Java的序列化或者Kryo,他有專門的Encoder(編碼器)串行化對象用於網絡的傳輸和處理。雖然Encoder和標準序列化都將負責將對象轉換成字節,可是Encoder使用了一種格式去構造代碼,使得Spark能夠進行許多操做(如map,filter),而無需通過字節反序列化到對象的過程。
DataFrame是一種被組織進有名稱的列的Dataset(很拗口,有沒有?看接下來比較好懂)。他在概念上等同於關係型數據庫中的表,可是適用面更廣。DataFrames能夠從各類各樣的源構建,例如:結構化數據文件,Hive中的表,外部數據庫或現有RDD。
而官方文檔的大部分篇幅都是在講兩件事:
Spark SQL大部分時候其實就是抽象出一種數據結構DataFrame,而後經過操做DataFrame的形式間接操做結構化數據。
Spark Streaming 是Spark核心API的擴展,可以處理高擴展,高吞吐,高容錯的實時數據流。可以接收多種數據來源,如Kafka, Flume, Kinesis, 或者 TCP sockets,而且能使用複雜的算法表達式如,map, reduce, join 和 window。最後,處理過的數據能夠推送到文件系統,數據庫,和實時展現的圖表。
Spark提供了更高級別的抽象,表示實時流數據,稱爲DStream(discretized stream)。DStreams能夠歷來源(如Kafka,Flume和Kinesis)的輸入數據流建立,也能夠經過對DStreams的高級操做來建立。在內部,DStream表示爲RDD序列 。
DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,不管是從源接收的輸入數據流,仍是經過轉換生成的數據流。在內部,DStream由連續的一系列RDD表示,這是Spark對不可變的分佈式數據集的抽象。DStream中的每一個RDD都是必定時間段內的數據。
Spark Streaming 提供了兩種構建流來源的方式。
這是Spark2.1中仍實驗性質的功能。Structured Streaming 是基於Spark Sql引擎構建的可擴展,高容錯的流處理引擎。你能夠用表達靜態數據批處理的方式表達流計算。Spark SQL引擎會持續運行,並在流數據持續到達時更新最終結果。
處理結構化流的關鍵思路是把實時的數據流當成一個不斷增長的表格來處理。這致使新的流處理的方式很是相似批處理的模式。你將在靜態表格上將流式計算表示爲標準批量查詢,而Spark會在無界輸入表上做爲增量查詢來運行它。
將輸入數據流視爲「輸入表」。到達流的每一個數據項都像追加到輸入表的新行同樣。
文章有多長,我最近的生活就有多單調。。。有收穫就點喜歡或打賞吧