Spark 基礎(chǔ)(下篇)

上篇介紹了spark的突出特點以及基本框架钥勋,下面給大家介紹下spark的基本數(shù)據(jù)結(jié)構(gòu)、spark任務(wù)調(diào)度的詳細(xì)流程以及spark中stage的劃分售淡。

5. spark的基本數(shù)據(jù)類型

RDD理张、DataFrame和DataSet可以說是spark獨有的三種基本的數(shù)據(jù)類型。Spark的核心概念是RDD (resilientdistributed dataset)召廷,指的是一個只讀的凳厢,可分區(qū)的分布式數(shù)據(jù)集,這個數(shù)據(jù)集的全部或部分可以緩存在內(nèi)存中竞慢,在多次計算間重用先紫。DataFrame是一個以RDD為基礎(chǔ)的,但卻是一種類似二維數(shù)據(jù)表的一種分布式數(shù)據(jù)集筹煮。與RDD不同的是遮精,前者帶有schema元信息,即DataFrame所表示的二維表數(shù)據(jù)集的每一列都帶有名稱和類型。這樣本冲,spark就可以使用sql操作dataframe准脂,像操作數(shù)據(jù)庫中的表一樣。目前檬洞,spark sql支持大多數(shù)的sql數(shù)據(jù)庫的操作狸膏。Dataset可以認(rèn)為是DataFrame的一個特例,主要區(qū)別是Dataset每一個record存儲的是一個強類型值而不是一個Row添怔。后面版本DataFrame會繼承DataSet湾戳,DataFrame和DataSet可以相互轉(zhuǎn)化,df.as[ElementType]這樣可以把DataFrame轉(zhuǎn)化為DataSet澎灸,ds.toDF()這樣可以把DataSet轉(zhuǎn)化為DataFrame院塞。創(chuàng)建Dataframe的代碼如下所示:

val df = spark.read.json("examples/src/main/resources/people.json")

// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

創(chuàng)建Dataset的代碼如下所示:

// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,
// you can use custom classes that implement the Product interface
case class Person(name: String, age: Long)

// Encoders are created for case classes
val caseClassDS = Seq(Person("Andy", 32)).toDS()
caseClassDS.show()
// +----+---+
// |name|age|
// +----+---+
// |Andy| 32|
// +----+---+

// Encoders for most common types are automatically provided by importing spark.implicits._
val primitiveDS = Seq(1, 2, 3).toDS()
primitiveDS.map(_ + 1).collect() // Returns: Array(2, 3, 4)

// DataFrames can be converted to a Dataset by providing a class. Mapping will be done by name
val path = "examples/src/main/resources/people.json"
val peopleDS = spark.read.json(path).as[Person]
peopleDS.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

6. spark scheduler(spark任務(wù)調(diào)度)

(1) 在使用spark-summit提交spark程序后,根據(jù)提交時指定(deploy-mode)的位置性昭,創(chuàng)建driver進程拦止,driver進程根據(jù)sparkconf中的配置,初始化sparkcontext糜颠。Sparkcontext的啟動后汹族,創(chuàng)建DAG Scheduler(將DAG圖分解成stage)和Task Scheduler(提交和監(jiān)控task)兩個調(diào)度模塊。
  (2) driver進程根據(jù)配置參數(shù)向resource manager(資源管理器)申請資源(主要是用來執(zhí)行的executor)其兴,resource manager接到到了Application的注冊請求之后顶瞒,會使用自己的資源調(diào)度算法,在spark集群的worker上元旬,通知worker為application啟動多個Executor榴徐。
  (3) executor創(chuàng)建后,會向resource manager進行資源及狀態(tài)反饋匀归,以便resource manager對executor進行狀態(tài)監(jiān)控坑资,如監(jiān)控到有失敗的executor,則會立即重新創(chuàng)建穆端。
  (4) Executor會向taskScheduler反向注冊袱贮,以便獲取taskScheduler分配的task。
  (5) Driver完成SparkContext初始化体啰,繼續(xù)執(zhí)行application程序攒巍,當(dāng)執(zhí)行到Action時,就會創(chuàng)建Job荒勇。并且由DAGScheduler將Job劃分多個Stage,每個Stage 由TaskSet 組成柒莉,并將TaskSet提交給taskScheduler,taskScheduler把TaskSet中的task依次提交給Executor, Executor在接收到task之后,會使用taskRunner(封裝task的線程池)來封裝task,然后沽翔,從Executor的線程池中取出一個線程來執(zhí)行task常柄。
   就這樣Spark的每個Stage被作為TaskSet提交給Executor執(zhí)行,每個Task對應(yīng)一個RDD的partition,執(zhí)行我們的定義的算子和函數(shù)。直到所有操作執(zhí)行完為止西潘。如下圖所示:

圖4. Spark 任務(wù)調(diào)度流程

7. Spark作業(yè)調(diào)度中stage劃分

Spark在接收到提交的作業(yè)后卷玉,DAGScheduler會根據(jù)RDD之間的依賴關(guān)系將作業(yè)劃分成多個stage,DAGSchedule在將劃分的stage提交給TASKSchedule喷市,TASKSchedule將每個stage分成多個task相种,交給executor執(zhí)行。task的個數(shù)等于stage末端的RDD的分區(qū)個數(shù)品姓。因此對了解stage的劃分尤為重要寝并。
  在spark中,RDD之間的依賴關(guān)系有兩種:一種是窄依賴腹备,一種是寬依賴衬潦。窄依賴的描述是:父RDD的分區(qū)最多只會被子RDD的一個分區(qū)使用。寬依賴是:父RDD的一個分區(qū)會被子RDD的多個分區(qū)使用植酥。如下圖所示:

圖5. RDD的兩種依賴關(guān)系

  上圖中镀岛,以一豎線作為分界,左邊是窄依賴友驮,右邊是寬依賴漂羊。
  Stage的劃分不僅根據(jù)RDD的依賴關(guān)系,還有一個原則是將依賴鏈斷開卸留,每個stage內(nèi)部可以并行運行走越,整個作業(yè)按照stage順序依次執(zhí)行,最終完成整個Job耻瑟。

實際劃分時旨指,DAGScheduler就是根據(jù)DAG圖,從圖的末端逆向遍歷整個依賴鏈喳整,一般是以一次shuffle為邊界來劃分的谆构。一般劃分stage是從程序執(zhí)行流程的最后往前劃分,遇到寬依賴就斷開算柳,遇到窄依賴就將將其加入當(dāng)前stage中。一個典型的RDD Graph如下圖所示:其中實線框是RDD姓言,RDD內(nèi)的實心矩形是各個分區(qū)瞬项,實線箭頭表示父子分區(qū)間依賴關(guān)系,虛線框表示stage何荚。針對下圖流程首先根據(jù)最后一步j(luò)oin(寬依賴)操作來作為劃分stage的邊界囱淋,再往左走,A和B之間有個group by也為寬依賴餐塘,也可作為stage劃分的邊界妥衣,所以我們將下圖劃分為三個stage。

圖6. Spark中的Stage劃分示例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市税手,隨后出現(xiàn)的幾起案子蜂筹,更是在濱河造成了極大的恐慌,老刑警劉巖芦倒,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艺挪,死亡現(xiàn)場離奇詭異,居然都是意外死亡兵扬,警方通過查閱死者的電腦和手機麻裳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器钟,“玉大人津坑,你說我怎么就攤上這事“涟裕” “怎么了疆瑰?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狞谱。 經(jīng)常有香客問我乃摹,道長,這世上最難降的妖魔是什么跟衅? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任孵睬,我火速辦了婚禮,結(jié)果婚禮上伶跷,老公的妹妹穿的比我還像新娘掰读。我一直安慰自己,他們只是感情好叭莫,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布蹈集。 她就那樣靜靜地躺著,像睡著了一般雇初。 火紅的嫁衣襯著肌膚如雪拢肆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天靖诗,我揣著相機與錄音郭怪,去河邊找鬼。 笑死刊橘,一個胖子當(dāng)著我的面吹牛鄙才,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播促绵,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼攒庵,長吁一口氣:“原來是場噩夢啊……” “哼嘴纺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浓冒,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栽渴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裆蒸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔萧,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年僚祷,在試婚紗的時候發(fā)現(xiàn)自己被綠了佛致。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡辙谜,死狀恐怖俺榆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情装哆,我是刑警寧澤罐脊,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蜕琴,受9級特大地震影響萍桌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凌简,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一上炎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雏搂,春花似錦藕施、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芙沥,卻和暖如春诲祸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背而昨。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工救氯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人配紫。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓径密,卻偏偏與公主長得像午阵,于是被迫代替她去往敵國和親躺孝。 傳聞我的和親對象是個殘疾皇子享扔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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