最簡大資料Spark-2.1.0

wolearn發表於2017-03-27

0.0 前言

本文主要基於最新的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 怎麼學習

首先看官網的教程

spark.apache.org/docs/latest…

看官網的教程基本給出了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 執行時流程

最簡大資料Spark-2.1.0

  • 當一個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-2.1.0

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都是一定時間段內的資料。

最簡大資料Spark-2.1.0

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 概念

將輸入資料流視為“輸入表”。到達流的每個資料項都像追加到輸入表的新行一樣。

最簡大資料Spark-2.1.0

對輸入的查詢將生成“結果表”。每個觸發間隔(例如,每1秒),新行將附加到輸入表,最終更新結果表。無論何時更新結果表,我們都希望將更改的結果行寫入外部接收器。


7.0 其他

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

8.0 後記

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

最簡大資料Spark-2.1.0

最簡大資料Spark-2.1.0
關注我(微信掃一掃)

最簡大資料Spark-2.1.0
加群學習,新增請標註"大資料學習"

相關文章