最簡大數據Spark-2.1.0

0.0 前言

本文主要基於最新的Spark 2.1.0版本。閱讀本文能夠對Spark 2.1.0的學習過程,運行流程,關鍵組件,原理有所瞭解。文章有點長,你也能夠直接閱讀感興趣的部分,可是仍是建議全面瞭解。javascript


1.0 簡介

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

  • 。基於內存的批處理,在內存中比Hadoop的MR模型快100多倍,磁盤上也快了10倍。爲何這麼快?Spark有先進的DAG(有向無環圖)執行引擎還有其基於內存的計算方式有關。
  • 易用。支持多語言Java,Scala,Python,R。同時能跟Hadoop生態圈很好的融合,好比Hive,HDFS,YARN。在近些年Hadoop已經慢慢成爲大數據事實標準的大環境下,能抱住Hadoop的大腿,使其快速火起來。畢竟對於已經上了Hadoop的公司,切到一個若是徹底不一樣的生態,即便這個生態再好,考慮到成本問題,公司也會猶豫。可是Spark徹底不存在這個顧慮。
  • 完整的技術棧。包括SQL查詢、流式計算、機器學習和圖算法組件在內的一攬子解決方案,讓你一個框架搞定全部,難以拒絕的誘惑。

Spark能夠很好的支持大數據中常見的三種場景批處理交互式查詢流數據處理。可是其流處理只能達到秒級,若是有毫秒級別的需求,只能考慮Storm了。shell


2.0 怎麼學習

首先看官網的教程數據庫

spark.apache.org/docs/latest…apache

看官網的教程基本給出了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 Begin

3.1 說在前面

本文主要梳理Spark學習中大的知識脈絡,比較宏觀的原理,但願有個總體的認知。至於具體的如相關API的調用,細小的概念,因爲做者比較懶,請自行學習。

3.2 環境配置

能夠從下面的地址下載到Spark的源碼,或者編譯後的包。

spark.apache.org/downloads.h…

目前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 Main

3.3.0 Spark的生態

Spark的生態系統主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等件。

  • Spark Core:Spark 核心包,包含Spark的基礎功能。
  • Spark SQL:Spark SQL容許開發人員以處理RDD的方式,直接處理外部的數據源,如HBase,Hive等。
  • 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可以更高效地運行。


4.0 Spark SQL

4.1 SQL

Spark SQL是用於結構化數據處理的Spark模塊。

Spark SQL的一個用途是執行SQL查詢。Spark SQL也可用於從Hive中讀取數據。當編程語言運行SQL時,結果將以Dataset / DataFrame的形式返回。還可使用命令行或JDBC / ODBC與SQL界面進行交互。

4.2 Datasets

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),而無需通過字節反序列化到對象的過程。

4.3 DataFrames

DataFrame是一種被組織進有名稱的列的Dataset(很拗口,有沒有?看接下來比較好懂)。他在概念上等同於關係型數據庫中的表,可是適用面更廣。DataFrames能夠從各類各樣的源構建,例如:結構化數據文件,Hive中的表,外部數據庫或現有RDD。

而官方文檔的大部分篇幅都是在講兩件事:

  • 構造一個DataFrames。從文件中構建,從結構化數據如json、Hive中的表中構建,RDD的轉換操做等
  • 操做DataFrames。

4.4 我的理解

Spark SQL大部分時候其實就是抽象出一種數據結構DataFrame,而後經過操做DataFrame的形式間接操做結構化數據。


5.0 Spark Streaming

5.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 DStreams

DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,不管是從源接收的輸入數據流,仍是經過轉換生成的數據流。在內部,DStream由連續的一系列RDD表示,這是Spark對不可變的分佈式數據集的抽象。DStream中的每一個RDD都是必定時間段內的數據。

5.4 數據來源

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秒),新行將附加到輸入表,最終更新結果表。不管什麼時候更新結果表,咱們都但願將更改的結果行寫入外部接收器。


7.0 其餘

  • 機器學習(Spark MLlib)和圖計算(GraphX)這塊知識先放放。
  • 關於部署、性能調優、運維接下來繼續學習

8.0 後記

文章有多長,我最近的生活就有多單調。。。有收穫就點喜歡或打賞吧

關注我(微信掃一掃)

加羣學習,添加請標註"大數據學習"
相關文章
相關標籤/搜索