本文主要基於最新的Spark 2.1.0版本。閱讀本文可以對Spark 2.1.0的學習過程,運行流程,關鍵組件,原理有所了解。文章有點長,你也可以直接閱讀感興趣的部分,但是還是建議全面了解。
1.0 簡介Spark是Apache軟體基金會下的分布式系統開源項目。在官網中這樣概況這個項目
Apache Spark is a fast and general engine for large-scale data processing.
說Spark是一個用於大規模數據處理的快速通用分布式引擎,到底有多快,請看下面這句
Lightning-fast cluster computing
快如閃電的集群計算。感覺官網用閃電來形容有點抽象,我總結了Spark大致有以下特點:
快。基於內存的批處理,在內存中比Hadoop的MR模型快100多倍,磁碟上也快了10倍。為什麼這麼快?Spark有先進的DAG(有向無環圖)執行引擎還有其基於內存的計算方式有關。
易用。支持多語言Java,Scala,Python,R。同時能跟Hadoop生態圈很好的融合,比如Hive,HDFS,YARN。在近些年Hadoop已經慢慢成為大數據事實標準的大環境下,能抱住Hadoop的大腿,使其快速火起來。畢竟對於已經上了Hadoop的公司,切到一個如果完全不同的生態,即使這個生態再好,考慮到成本問題,公司也會猶豫。但是Spark完全不存在這個顧慮。
完整的技術棧。包括SQL查詢、流式計算、機器學習和圖算法組件在內的一攬子解決方案,讓你一個框架搞定所有,難以拒絕的誘惑。
Spark可以很好的支持大數據中常見的三種場景批處理、交互式查詢、流數據處理。但是其流處理只能達到秒級,如果有毫秒級別的需求,只能考慮Storm了。
2.0 怎麼學習首先看官網的教程
http://spark.apache.org/docs/latest/programming-guide.html
看官網的教程基本給出了Scala,Java,Python三種代碼的例子,也就是說,你只要會其中一種就可以玩了。但是考慮到Spark源碼是Scala寫的,從學習源碼的角度來看,用Scala是比較靠譜的。說下學習前的相關知識儲備
服務端相關概念:如分布式,集群等
資料庫相關概念:基本的資料庫,資料庫連接,Sql等
Hadoop生態:MR模型,Hive等
語言相關:推薦Scala,會Java,Python尤佳
Linux相關:因為Spark是部署在Linux上的,需要一些基本的操作。推薦安裝Ubuntu,或CenterOS
IDE:Scala有自己的eclipse,也可以使用IDEA開發
其他:如Maven使用等
3.0 Begin3.1 說在前面本文主要梳理Spark學習中大的知識脈絡,比較宏觀的原理,希望有個整體的認知。至於具體的如相關API的調用,細小的概念,由於作者比較懶,請自行學習。
3.2 環境配置可以從下面的地址下載到Spark的源碼,或者編譯後的包。
http://spark.apache.org/downloads.html
目前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
3.3 Main3.3.0 Spark的生態Spark的生態系統主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等件。
3.3.1 概念梳理RDD(Resilient Distributed Dataset):彈性分布式數據集,是最重要的一個概念,基本操作都是在和RDD打交道。RDD是Spark在分布式系統中抽象的一種高度受限的共享內存模型。個人感覺他的高度受限體現在他創建只能基於穩定的物理數據集合或RDD轉化,而且創建後基本不能修改,只能通過轉化操作,生成新的RDD完成變更。
DAG(Directed Acyclic Graph):還記得之前說Spark為什麼那麼快嗎?就是因為Spark有先進的DAG執行引擎。DAG主要是反映RDD之間的依賴關係。
Executor:Worker Node上的進程,負責運行任務,並儲存數據。
Application:就是你編寫的應用程式。
Job:作業。由多個階段構成。包含多個RDD以及RDD上的操作。
Stage:階段。由多個任務構成,是作業的基本調度單位。在Job和Task之間起到承上啟下的作用。
Task:任務。Executor上的工作任務。
Cluster Manage:Spark集群獲取資源的服務。Spark有自己的資源管理服務,但是也可以和YARN可靠的結合。Hadoop2.0後將資源協調抽離出來由YARN來負責,而Spark也可以使用YARN來協調資源。將各自為政的資源協調體系整合起來。這就是上面說的Spark可以很好的和Hadoop整合。
Driver Program:任務控制節點。由Driver為Executor上執行的task向Cluster Manage申請資源,資源包括CPU,內存等。
3.3.2 運行時流程當一個Appliction被提交到Spark集群,Driver節點會先創建一個SparkContext。由SparkContext向Cluster Manager申請資源。
Cluster Manager在Work Node上啟動Executor進程,等待執行Task,並為其分配運行需要的資源,同時隨時監測其資源運行情況。
Executor拿到資源並運行起來之後,向Driver註冊,並告知其可以執行任務。
Spark Application將任務抽象成RDD並構建DAG,並由DAGSchedule將DAG解析成Stage,並計算Stage的依賴關係,提交給TaskSchedule。
TaskSchedule將任務分配到註冊到Driver的Executor上,執行起來。
Executor將執行結果告之TaskSchedule,TaskSchedule將結果告之DAGSchedule,然後由SparkContent通知Cluster Manager任務運行完畢並釋放資源。
3.4 理解RDD對RDD的理解主要對照官方文檔2.1.0的理解梳理。
3.4.1 綜述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自動從節點故障中恢復。
3.4.2 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的任何數據源)中引用數據集。
3.4.3 RDD操作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界面進行交互。
4.2 DatasetsDataset是分布式數據集。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),而無需經過字節反序列化到對象的過程。
4.3 DataFramesDataFrame是一種被組織進有名稱的列的Dataset(很拗口,有沒有?看接下來比較好懂)。他在概念上等同於關係型資料庫中的表,但是適用面更廣。DataFrames可以從各種各樣的源構建,例如:結構化數據文件,Hive中的表,外部資料庫或現有RDD。
而官方文檔的大部分篇幅都是在講兩件事:
4.4 個人理解Spark SQL大部分時候其實就是抽象出一種數據結構DataFrame,然後通過操作DataFrame的形式間接操作結構化數據。
5.0 Spark Streaming5.1 概述Spark Streaming 是Spark核心API的擴展,能夠處理高擴展,高吞吐,高容錯的實時數據流。能夠接收多種數據來源,如Kafka, Flume, Kinesis, 或者 TCP sockets,並且能使用複雜的算法表達式如,map, reduce, join 和 window。最後,處理過的數據可以推送到文件系統,資料庫,和實時展示的圖表。
5.2 執行原理
Spark Streaming將接收的數據劃分成多個批次,然後交給Spark引擎處理,並且生成批量的最終結果的流數據。
Spark提供了更高級別的抽象,表示實時流數據,稱為DStream(discretized stream)。DStreams可以從來源(如Kafka,Flume和Kinesis)的輸入數據流創建,也可以通過對DStreams的高級操作來創建。在內部,DStream表示為RDD序列 。
5.3 DStreamsDStream是Spark Streaming提供的基本抽象。它表示連續的數據流,無論是從源接收的輸入數據流,還是通過轉換生成的數據流。在內部,DStream由連續的一系列RDD表示,這是Spark對不可變的分布式數據集的抽象。DStream中的每個RDD都是一定時間段內的數據。
Spark Streaming 提供了兩種構建流來源的方式。
基本來源:StreamingContext API中直接提供的資源。如:文件系統和套接字
高級來源:如Kafka, Flume, Kinesis等。而這些來源可能需要添加額外的依賴,可以通過Maven來解決。
6.0 Structured Streaming【ALPHA】6.1 概述這是Spark2.1中仍實驗性質的功能。Structured Streaming 是基於Spark Sql引擎構建的可擴展,高容錯的流處理引擎。你可以用表達靜態數據批處理的方式表達流計算。Spark SQL引擎會持續運行,並在流數據持續到達時更新最終結果。
6.2 編程模型處理結構化流的關鍵思路是把實時的數據流當成一個不斷增加的表格來處理。這導致新的流處理的方式非常類似批處理的模式。你將在靜態表格上將流式計算表示為標準批量查詢,而Spark會在無界輸入表上作為增量查詢來運行它。
6.3 概念將輸入數據流視為「輸入表」。到達流的每個數據項都像追加到輸入表的新行一樣。
對輸入的查詢將生成「結果表」。每個觸發間隔(例如,每1秒),新行將附加到輸入表,最終更新結果表。無論何時更新結果表,我們都希望將更改的結果行寫入外部接收器。
文章有多長,我最近的生活就有多單調。。。有收穫就關注我或打賞吧
加群學習,請標註「大數據學習」