Spark專用名詞
- RDD ---- resillient distributed dataset 彈性分布式數(shù)據(jù)集
- Operation ---- 作用于RDD的各種操作分為transformation和action
- Job ---- 作業(yè),一個(gè)JOB包含多個(gè)RDD及作用于相應(yīng)RDD上的各種operation
- Stage ---- 一個(gè)作業(yè)分為多個(gè)階段
- Partition ---- 數(shù)據(jù)分區(qū), 一個(gè)RDD中的數(shù)據(jù)可以分成多個(gè)不同的區(qū)
- DAG ---- Directed Acycle graph, 有向無環(huán)圖贱纠,反應(yīng)RDD之間的依賴關(guān)系
- Narrow dependency ---- 窄依賴伊佃,子RDD依賴于父RDD中固定的data partition
- Wide Dependency ---- 寬依賴,子RDD對父RDD中的所有data partition都有依賴
- Caching Managenment ---- 緩存管理焕毫,對RDD的中間計(jì)算結(jié)果進(jìn)行緩存管理以加快整體的處理速度
Spark編程模型
下面是Spark的一個(gè)日志計(jì)數(shù)示例蹲坷,該程序演示了Spark的計(jì)算模型:
下面是Spark運(yùn)行時(shí)涉及的各組件的概況圖:
從RDD轉(zhuǎn)換和存儲角度,用戶程序?qū)DD通過多個(gè)函數(shù)進(jìn)行操作邑飒,將RDD進(jìn)行轉(zhuǎn)換循签。Block Manager管理RDD的物理分區(qū),每個(gè)Block就是節(jié)點(diǎn)上對應(yīng)的一個(gè)數(shù)據(jù)塊疙咸,可以存儲在內(nèi)存或磁盤县匠。而RDD中的partition是一個(gè)邏輯數(shù)據(jù)塊,對應(yīng)相應(yīng)的物理塊Block撒轮。
本質(zhì)上乞旦,一個(gè)RDD在代碼中相當(dāng)于是數(shù)據(jù)的一個(gè)元數(shù)據(jù)結(jié)構(gòu),存儲著數(shù)據(jù)分區(qū)及其邏輯結(jié)構(gòu)映射關(guān)系题山,存儲著RDD之前的依賴轉(zhuǎn)換關(guān)系兰粉。
作用于RDD上的操作分為transformantion和action。 經(jīng)Transformation處理之后顶瞳,數(shù)據(jù)集中的內(nèi)容會發(fā)生更改亲桦,由數(shù)據(jù)集A轉(zhuǎn)換成為數(shù)據(jù)集B;而經(jīng)Action處理之后浊仆,數(shù)據(jù)集中的內(nèi)容會被歸約為一個(gè)具體的數(shù)值客峭。
只有當(dāng)RDD上有action時(shí),該RDD及其父RDD上的所有operation才會被提交到cluster中真正的被執(zhí)行抡柿。
Spark運(yùn)行態(tài)
用Spark的術(shù)語來說舔琅,static view稱為dataset-level view,而dynamic view稱為parition-level view洲劣,關(guān)系如圖所示:
在Spark中的task可以對應(yīng)于線程备蚓,worker是一個(gè)個(gè)的進(jìn)程课蔬,worker由driver來進(jìn)行管理。
在源碼閱讀時(shí)郊尝,需要重點(diǎn)把握以下兩大主線:
- 靜態(tài)視圖static view 即 RDD, transformation and action
- 動態(tài)視圖dynamic view 即 life of a job,每一個(gè)job又分為多個(gè)stage二跋,每一個(gè)stage中可以包含多個(gè)rdd及其transformation,這些stage又是如何映射成為task被distributed到cluster中
Spark調(diào)度機(jī)制
Spark應(yīng)用提交后經(jīng)歷了一系列的轉(zhuǎn)換,最后成為Task在每個(gè)節(jié)點(diǎn)上執(zhí)行流昏。
當(dāng)有Action作用于某RDD時(shí)扎即,該action會作為一個(gè)job被提交。
在提交的過程中况凉,DAGScheduler模塊介入運(yùn)算谚鄙,計(jì)算RDD之間的依賴關(guān)系。RDD之間的依賴關(guān)系就形成了DAG刁绒。
每一個(gè)Job被分為多個(gè)stage闷营,劃分stage的一個(gè)主要依據(jù)是當(dāng)前計(jì)算因子的輸入是否是確定的,如果是則將其分在同一個(gè)stage知市,避免多個(gè)stage之間的消息傳遞開銷傻盟。
當(dāng)stage被提交之后,由taskscheduler來根據(jù)stage來計(jì)算所需要的task嫂丙,并將task提交到對應(yīng)的worker莫杈。
大體概況如下圖所示:
關(guān)于Spark的調(diào)度運(yùn)行機(jī)制詳見下一節(jié)的RDD詳解中的介紹。
轉(zhuǎn)載請注明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進(jìn)入我的博客主頁