『 Spark 』2. spark 基本概念解析

原文:『 Spark 』2. spark 基本概念解析

寫在前面

本系列是綜合了自己在學(xué)習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來蓬戚。寫這樣一個系列僅僅是為了梳理個人學(xué)習spark的筆記記錄浮毯,并非為了做什么教程泞辐,所以一切以個人理解梳理為主,沒有必要的細節(jié)就不會記錄了钢猛。若想深入了解,最好閱讀參考文章和官方文檔。

其次欢顷,本系列是基于目前最新的 spark 1.6.0 系列開始的铺峭,spark 目前的更新速度很快墓怀,記錄一下版本好還是必要的。
最后卫键,如果各位覺得內(nèi)容有誤傀履,歡迎留言備注,所有留言 24 小時內(nèi)必定回復(fù)莉炉,非常感謝钓账。
Tips: 如果插圖看起來不明顯,可以:1. 放大網(wǎng)頁絮宁;2. 新標簽中打開圖片梆暮,查看原圖哦。

1. Application

用戶在 spark 上構(gòu)建的程序绍昂,包含了 driver 程序以及在集群上運行的程序代碼惕蹄,物理機器上涉及了 driver,master,worker 三個節(jié)點.

2. Driver Program

創(chuàng)建 sc 卖陵,定義 udf 函數(shù)遭顶,定義一個 spark 應(yīng)用程序所需要的三大步驟的邏輯:加載數(shù)據(jù)集,處理數(shù)據(jù)泪蔫,結(jié)果展示棒旗。

3. Cluster Manager

集群的資源管理器,在集群上獲取資源的外部服務(wù)撩荣。
拿 Yarn 舉例铣揉,客戶端程序會向 Yarn 申請計算我這個任務(wù)需要多少的 memory,多少 CPU餐曹,etc逛拱。
然后 Cluster Manager 會通過調(diào)度告訴客戶端可以使用,然后客戶端就可以把程序送到每個 Worker Node 上面去執(zhí)行了台猴。

4. Worker Node

集群中任何一個可以運行spark應(yīng)用代碼的節(jié)點朽合。Worker Node就是物理節(jié)點,可以在上面啟動Executor進程饱狂。

5. Executor

在每個 Worker Node 上為某應(yīng)用啟動的一個進程曹步,該進程負責運行任務(wù),并且負責將數(shù)據(jù)存在內(nèi)存或者磁盤上休讳,每個任務(wù)都有各自獨立的 Executor讲婚。
Executor 是一個執(zhí)行 Task 的容器。它的主要職責是:

  • 初始化程序要執(zhí)行的上下文 SparkEnv俊柔,解決應(yīng)用程序需要運行時的 jar 包的依賴筹麸,加載類。
  • 同時還有一個 ExecutorBackend 向 cluster manager 匯報當前的任務(wù)狀態(tài)雏婶,這一方面有點類似 hadoop的 tasktracker 和 task物赶。

總結(jié):Executor 是一個應(yīng)用程序運行的監(jiān)控和執(zhí)行容器。

6. Jobs

包含很多 task 的并行計算尚骄,可以認為是 Spark RDD 里面的 action块差,每個 action 的觸發(fā)會生成一個job。
用戶提交的 Job 會提交給 DAGScheduler倔丈,Job 會被分解成 Stage憨闰,Stage 會被細化成 Task,Task 簡單的說就是在一個數(shù)據(jù) partition 上的單個數(shù)據(jù)處理流程需五。關(guān)于 job鹉动,stage,task宏邮,詳細可以參考這篇文章:『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task

spark-web-ui-job.jpg

A job is triggered by an action, like count() or saveAsTextFile(), click on a job to see info about the stages of tasks inside it.

7. Stage

一個 Job 會被拆分為多組 Task泽示,每組任務(wù)被稱為一個 Stage 就像 Map Stage缸血, Reduce Stage。

Stage 的劃分在 RDD 的論文中有詳細的介紹械筛,簡單的說是以 shuffle 和 result 這兩種類型來劃分捎泻。
在 Spark 中有兩類 task:

  • shuffleMapTask

    輸出是shuffle所需數(shù)據(jù), stage的劃分也以此為依據(jù),shuffle之前的所有變換是一個stage埋哟,shuffle之后的操作是另一個stage笆豁。

  • resultTask,

    輸出是result赤赊,比如 rdd.parallize(1 to 10).foreach(println) 這個操作沒有shuffle闯狱,直接就輸出了,那么只有它的task是resultTask抛计,stage也只有一個哄孤;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 這個job因為有reduce,所以有一個shuffle過程吹截,那么reduceByKey之前的是一個stage瘦陈,執(zhí)行shuffleMapTask,輸出shuffle所需的數(shù)據(jù)饭弓,reduceByKey到最后是一個stage双饥,直接就輸出結(jié)果了媒抠。如果job中有多次shuffle弟断,那么每個shuffle之前都是一個stage。

8. Task

被送到 executor 上的工作單元趴生。

9. Partition

Partition 類似 hadoop 的 Split阀趴,計算是以 partition 為單位進行的,當然 partition 的劃分依據(jù)有很多苍匆,這是可以自己定義的刘急,像 HDFS 文件,劃分的方式就和 MapReduce 一樣浸踩,以文件的 block 來劃分不同的 partition叔汁。總而言之检碗,Spark 的 partition 在概念上與 hadoop 中的 split 是相似的据块,提供了一種劃分數(shù)據(jù)的方式。

10. RDD

先看看原文 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for
In-Memory Cluster Computing
是怎么介紹 RDD 的折剃。


a distributed memory abstraction that lets programmers perform in-memory computations on large clusters in a fault-tolerant manner.

RDDs are motivated by two types of applications that current computing frameworks handle inefficiently:

  • iterative algorithms;
  • interactive data mining tools;

In both cases, keeping data in memory can improve performance by an order of magnitude.

To achieve fault tolerance efficiently, RDDs provide a restricted form of shared memory, based on coarsegrained transformations rather than fine-grained updates to shared state. However, we show that RDDs are expressive enough to capture a wide class of computations, including recent specialized programming models for iterative jobs, such as Pregel, and new applications that these models do not capture. We have implemented RDDs in a system called Spark, which we evaluate through a variety of user applications and benchmarks.


每個RDD有5個主要的屬性:

  • 一組分片(partition)另假,即數(shù)據(jù)集的基本組成單位
  • 一個計算每個分片的函數(shù)
  • 對parent RDD的依賴,這個依賴描述了RDD之間的lineage
  • 對于key-value的RDD怕犁,一個Partitioner边篮,這是可選擇的
  • 一個列表己莺,存儲存取每個partition的preferred位置。對于一個HDFS文件來說戈轿,存儲每個partition所在的塊的位置凌受。這也是可選擇的

把上面這5個主要的屬性總結(jié)一下,可以得出RDD的大致概念思杯。首先要知道胁艰,RDD大概是這樣一種表示數(shù)據(jù)集的東西,它具有以上列出的一些屬性智蝠。是spark項目組設(shè)計用來表示數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)腾么。而spark項目組為了讓RDD能handle更多的問題,又規(guī)定RDD應(yīng)該是只讀的杈湾,分區(qū)記錄的一種數(shù)據(jù)集合中解虱。可以通過兩種方式來創(chuàng)建RDD:一種是基于物理存儲中的數(shù)據(jù)漆撞,比如說磁盤上的文件殴泰;另一種,也是大多數(shù)創(chuàng)建RDD的方式浮驳,即通過其他RDD來創(chuàng)建【以后叫做轉(zhuǎn)換】而成悍汛。而正因為RDD滿足了這么多特性,所以spark把RDD叫做Resilient Distributed Datasets至会,中文叫做彈性分布式數(shù)據(jù)集离咐。很多文章都是先講RDD的定義,概念奉件,再來說RDD的特性宵蛀。我覺得其實也可以倒過來,通過RDD的特性反過來理解RDD的定義和概念县貌,通過這種由果溯因的方式來理解RDD也未嘗不可术陶。反正對我個人而言這種方式是挺好的。

RDD是Spark的核心煤痕,也是整個Spark的架構(gòu)基礎(chǔ)梧宫,可以總下出幾個它的特性來:

  • 它是不變的數(shù)據(jù)結(jié)構(gòu)存儲
  • 它是支持跨集群的分布式數(shù)據(jù)結(jié)構(gòu)
  • 可以根據(jù)數(shù)據(jù)記錄的key對結(jié)構(gòu)進行分區(qū)
  • 提供了粗粒度的操作,且這些操作都支持分區(qū)
  • 它將數(shù)據(jù)存儲在內(nèi)存中摆碉,從而提供了低延遲性

關(guān)于 rdd 的更多詳情塘匣,可以參考這篇文章:『 Spark 』4. spark 之 RDD

11. sc.parallelize

先看看 api 文檔里是怎么說的:parallelize


  • parallelize(c, numSlices=None)

Distribute a local Python collection to form an RDD. Using xrange is recommended if the input represents a range for performance.


簡單的說,parallelize 就是把 driver 端定義的一個數(shù)據(jù)集兆解,或者一個獲取數(shù)據(jù)集的生成器馆铁,分發(fā)到 worker 上的 executor 中,以供后續(xù)分析锅睛。這種方式在測試代碼邏輯時經(jīng)常用到埠巨,但在構(gòu)建真正的 spark 應(yīng)用程序時很少會用到历谍,一般都是從 hdfs 或者數(shù)據(jù)庫去讀取數(shù)據(jù)。

12. code distribute

提交 spark 應(yīng)用時辣垒,spark 會把應(yīng)用代碼分發(fā)到所有的 worker 上面望侈,應(yīng)用依賴的包需要在所有的worker上都存在,有兩種解決 worker 上相關(guān)包依賴的問題:

  • 選用一些工具統(tǒng)一部署 spark cluster勋桶;
  • 在提交 spark 應(yīng)用的時候脱衙,指定應(yīng)用依賴的相關(guān)包,把 應(yīng)用代碼例驹,應(yīng)用依賴包 一起分發(fā)到 worker捐韩;

13. cache priority

cache 是否支持 priority,目前不支持鹃锈,而且 spark 里面對 rdd 的 cache 和我們常見的緩存系統(tǒng)是不一樣的荤胁。細節(jié)可以找我討論。

14. cores


The number of cores to use on each executor. For YARN and standalone mode only. In standalone mode, setting this parameter allows an application to run multiple executors on the same worker, provided that there are enough cores on that worker. Otherwise, only one executor per application will run on each worker.


每一個 core屎债,相當于一個 worker 上的進程仅政,這些進程會同時執(zhí)行分配到這個 worker 上的任務(wù)。簡單的說盆驹,就是 spark manager 把一個 job 切分幾個 task 分發(fā)到 worker 上同步執(zhí)行圆丹,而每個 worker 把分配給自己的 task 再切分成幾個 subtask,分配給當前 worker 上的不同進程躯喇。

15. Memory

分配給 spark 應(yīng)用的內(nèi)存是僅僅給 cache 數(shù)據(jù)用嗎辫封?

不是,分配給 spark 應(yīng)用的內(nèi)存有三個方面的應(yīng)用:

  • spark 本身
  • spark 應(yīng)用
    • spark 應(yīng)用過程中 runtime 使用玖瘸,比如 UDF 函數(shù)
    • spark 應(yīng)用中的 cache

16. RDD narrow/wide dependences

RDD 之間的依賴類別[ 或者秸讹,創(chuàng)建一個 RDD 的不同方法 ]

rdd-dependences.jpg

17. 本地內(nèi)存與集群內(nèi)存

所謂本地內(nèi)存檀咙,是指在 driver 端的程序所需要的內(nèi)存雅倒,由 driver 機器提供,一般用來生成測試數(shù)據(jù)弧可,接受運算結(jié)果等蔑匣;
所謂集群內(nèi)存,是指提交到集群的作業(yè)能夠向集群申請的最多內(nèi)存使用量棕诵,一般用來存儲關(guān)鍵數(shù)據(jù)裁良;

spark-memory-cluster-and-driver.jpg

18. 限制用戶使用的內(nèi)存

可以在啟動 spark 應(yīng)用的時候申請;完全可控校套。

19. 當用戶申請總資源超過當前集群總資源

FIFO 資源分配方式价脾。

20. SparkContext [經(jīng)常簡稱為 sc]

spark app 的起點和入口,一般用來加載數(shù)據(jù)集笛匙,生成第一個 rdd侨把。

21. 對一個 rdd 多次 cache 會有什么影響嗎犀变?

不會,只會cache一次秋柄。stackoverflow

4. Next

下一篇获枝,通過幾個簡單的例子來介紹 spark 的基本編程模式。

5. 打開微信骇笔,掃一掃省店,點一點,棒棒的

wechat_pay.png

參考文章

本系列文章鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懦傍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芦劣,更是在濱河造成了極大的恐慌谎脯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件持寄,死亡現(xiàn)場離奇詭異源梭,居然都是意外死亡,警方通過查閱死者的電腦和手機稍味,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門废麻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人模庐,你說我怎么就攤上這事烛愧。” “怎么了掂碱?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵怜姿,是天一觀的道長。 經(jīng)常有香客問我疼燥,道長沧卢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任醉者,我火速辦了婚禮但狭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撬即。我一直安慰自己立磁,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布剥槐。 她就那樣靜靜地躺著唱歧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粒竖。 梳的紋絲不亂的頭發(fā)上颅崩,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天绍刮,我揣著相機與錄音,去河邊找鬼挨摸。 笑死孩革,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的得运。 我是一名探鬼主播膝蜈,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熔掺!你這毒婦竟也來了饱搏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤置逻,失蹤者是張志新(化名)和其女友劉穎推沸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券坞,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡鬓催,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨锚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇驾。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猴伶,靈堂內(nèi)的尸體忽然破棺而出课舍,到底是詐尸還是另有隱情,我是刑警寧澤他挎,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布筝尾,位于F島的核電站,受9級特大地震影響办桨,放射性物質(zhì)發(fā)生泄漏筹淫。R本人自食惡果不足惜晋控,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一将饺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦狸相、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至古沥,卻和暖如春瘸右,著一層夾襖步出監(jiān)牢的瞬間娇跟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工太颤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苞俘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓龄章,卻偏偏與公主長得像吃谣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子做裙,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容