原創:花括號MC(微信公眾號:huakuohao-mc)。關注JAVA基礎程式設計及大資料,注重經驗分享及個人成長。
Spark整體介紹
Spark
是一個快速的,多用途的計算系統。這是來自官網的自我介紹。一般敢自稱系統的都是有兩把刷子的,況且還是多用途的計算系統。Spark
計算系統包含如下功能元件
Spark Core
: Spark
的核心功能模組。
Spark SQL
: 用於處理結構化資料。
MLlib
:用於機器學習。
GraphX
:用於影像處理。
Spark Streaming
:用於處理實時資料流。
包含如此多的功能,自稱多功能計算系統也是可以的。這篇文章幫大家梳理一下學習Spark Streaming
過程中可能會讓你產生困惑的基本概念。
RDD
Spark Core
是 Spark
的核心模組,這個模組提供了一個核心概念叫做RDD
(resilient distributed dataset)。你可以簡單的把它理解成一個資料片段集合,你要處理的源資料檔案可以分解成很多個RDD
。Spark
為RDD
提供了兩種型別的操作,一種是transformations
,一種是 action
。
transformations
:如果一個RDD
經過某種操作之後,生成一個新的RDD
,那麼這個操作就是transaction
的。比如,map
,flatMap
,filter
等。
action
:對一個RDD
進行計算操作,以生成某種結果,比如reduce
,count
等操作。
注意:所有的
transformations
都是Lazy的,也就是說只有碰到action
操作的時候才會執行前面的transformations
操作。
DStream
Spark Streaming
是用來處理流式資料的,假設我們規定每隔一秒鐘(通過duration設定)取一次資料,那麼這段時間內積讚的資料就稱為一個batch
,裡面的資料就用DStream
表示。從編寫程式碼的角度來看,你可以把DStream
和RDD
同等對待,因為他們的運算元操作都是一樣的。但是他們的資料結構還是有著本質不同的,我們可以把DStream
簡單的理解成是RDD
加上了時間戳。如下圖
DAG
Spark
使用DAG
進行資料建模,DAG
被稱為有向無環圖,有向無環圖的定義是這樣的 "在圖論中,如果一個有向圖從任意頂點出發無法經過若干條邊回到該點,則這個圖是一個有向無環圖(DAG,directed acyclic graph)",我們通過一個簡單的例子來感受一下,Spark
是如何使用DAG
建模的。
下面的程式碼可以完成一段文字內容的各個單詞的數量統計。
var textFile = sc.textFile(args[1]);
var result = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b);
result.saveAsTextFile(args[2]);
複製程式碼
上面這段程式碼可以用下面這個圖表示
這就是一個簡單的DAG
模型,資料按照方向流動,再也回不到原點。Spark Streaming
將這個DAG
模型,不斷的應用到每一個Batch
裡面的資料中。大家可以把DAG
模型理解成類,它是資料處理的模版,而每個Batch
裡面的資料就是不同的例項物件。
Job,Stage,Task
Spark
應用程式啟動之後,我們會利用Spark
提供的監控頁面來檢視程式的執行情況。在頁面上會看到Job
,Stage
,Task
等內容展示,如果不理解他們代表什麼意思,那麼Spark
好心好意提供的監控頁面對我們來說就毫無意義。
下面給大家簡單說一下這些概念到底什麼意思,以及他們之間的關係。
先來看個圖
從圖中可以看出,一個Application
被分解成多個Job
,每個Job
又分解成多個Stage
,Stage
又會分解成多個Task
,而Task
是任務執行的最小單元,最終會被Executor
執行。
Application:簡單的說就是我們寫的應用程式碼,啟動起來之後就是一個Application
。
Job:由Spark
的action
運算元觸發。也就是每遇到一個action
運算元就會觸發一個Job
任務,這個時候就會執行前面的一系列transformations操作。
Stage:Job
任務會繼續分解成Stage
,Stage
是根據DAG
的寬窄依賴來劃分,也就是RDD
之間的依賴關係。從後往前,每遇到一個寬依賴就劃分為一個Stage
。
寬依賴(Shuffle/Wide Dependency):父
RDD
的分割槽和子RDD
的分割槽是一對多或者多對多的關係。比如groupByKey
,reduceByKey
,join
等操作
窄依賴(Narrow Dependency):父
RDD
的分割槽和子RDD
的分割槽的關係是一對一或者多對一的關係,比如map
,flatmap
,filter
等操作。
寬窄依賴的定義可以用如下圖,形象的展示。
拿文章開頭的單詞統計程式為例,Stage
劃分情況應該是這樣的。
task:Stage
包含很多Task
,每個Task
會執行Stage
中包含的運算元。
以上就是Spark
精進之路上必須瞭解的基本概念,希望對各位有幫助。
推薦閱讀:
·END·
Java·大資料·個人成長