五分鐘大數(shù)據(jù):Spark入門

Spark是什么昨登?

Apache Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎盏混,是一種開源的類Hadoop MapReduce的通用并行框架峰搪,擁有Hadoop MapReduce所具有的優(yōu)點(diǎn)愕难。

Spark不同于MapReduce的是嵌洼,Spark的Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS祝沸,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的MapReduce的算法矮烹。

Spark 主要有三個(gè)特點(diǎn)?:

首先,高級 API 剝離了對集群本身的關(guān)注罩锐,Spark 應(yīng)用開發(fā)者可以專注于應(yīng)用所要做的計(jì)算本身奉狈。

其次,Spark 很快涩惑,支持交互式計(jì)算和復(fù)雜算法仁期。

最后,Spark 是一個(gè)通用引擎竭恬,可用它來完成各種各樣的運(yùn)算跛蛋,包括 SQL 查詢、文本處理萍聊、機(jī)器學(xué)習(xí)等问芬,而在 Spark 出現(xiàn)之前,我們一般需要學(xué)習(xí)各種各樣的引擎來分別處理這些需求寿桨。

總結(jié)一下:從各種方向上(比如開發(fā)速度和運(yùn)行速度等)來看,Spark都優(yōu)于Hadoop MapReduce强戴;同時(shí)亭螟,Spark還提供大數(shù)據(jù)生態(tài)的一站式解決方案。因此骑歹,學(xué)會(huì)使用Spark刻不容緩预烙。

目錄


Spark生態(tài)圈

Spark運(yùn)行架構(gòu)

Spark運(yùn)行模式

Spark的Job執(zhí)行流程

Spark編程模型之RDD

Spark使用的簡單Demo

Spark生態(tài)圈


首先,我們先來看一下整個(gè)Spark的生態(tài)圈道媚,都有哪些功能扁掸。

下圖很好的說明了整個(gè)Spark的層級之間翘县,以及同級之間的關(guān)系。(注意谴分,此圖有些老锈麸,一些名稱已經(jīng)不再使用)

Spark層級

從下往上看,分別是:

數(shù)據(jù)層:Spark可以運(yùn)行在眾多底層的數(shù)據(jù)模型中牺蹄,比如HDFS忘伞、HBASE、Amazon s3等

資源調(diào)度層:這一層是Spark的四種運(yùn)行模式沙兰,包括一種本地模式local氓奈,和三種集群模式Standalone,Mesos鼎天,Yarn舀奶。

計(jì)算層:這一層是Spark的核心層,Spark Core斋射;其計(jì)算模型基于RDD(彈性分布式數(shù)據(jù)集)

應(yīng)用層:這一部分提供了基于Spark Core的高級應(yīng)用育勺,如用于交互式查詢的SparkSQL(即圖中的shark),用于流式處理的Spark Streaming绩鸣,用于機(jī)器學(xué)習(xí)的MLlib和用于圖計(jì)算的GraphX等怀大。

下圖展示的是目前的Spark的生態(tài)圈及組件。

目前的Spark生態(tài)圈

Spark運(yùn)行架構(gòu)


凡是用于大數(shù)據(jù)處理的呀闻,幾乎都是主從模式(master/slave)化借,Spark也不例外。

Spark的主節(jié)點(diǎn)捡多,被稱之為Driver蓖康,其控制著整個(gè)Spark程序的應(yīng)用上下文:SparkContext。

Spark的從節(jié)點(diǎn)垒手,稱為Executor蒜焊,負(fù)責(zé)執(zhí)行具體的任務(wù)。


spark運(yùn)行架構(gòu)

簡單解釋一下上圖:

1 首先Driver會(huì)創(chuàng)建一個(gè)SparkContext科贬,然后和集群資源的管理者Cluster Manager進(jìn)行通信泳梆,申請資源。

2 Cluster Manager會(huì)根據(jù)實(shí)際情況將合適的Worker節(jié)點(diǎn)分配給Spark榜掌,作為Executor使用优妙。

3 Driver和各Executor建立連接,生成DAG圖憎账,劃分Stage套硼,進(jìn)行Task調(diào)度;Executor則負(fù)責(zé)具體的Task執(zhí)行胞皱。

Spark運(yùn)行模式


Spark的運(yùn)行模式往粗了說邪意,就只有兩種:用于測試和學(xué)習(xí)的本地模式九妈,和用于實(shí)際生產(chǎn)的集群模式。細(xì)分一下雾鬼,集群模式主要分為Standalone萌朱,Spark on Memos,Spark on Yarn三種方式呆贿。當(dāng)然還有更細(xì)的劃分方式嚷兔,不過我們此處就不討論了,所以我們主要介紹下面的四種方式做入。

本地模式

一般是指“Local[N]”模式冒晰,其使用N個(gè)線程來進(jìn)行主從模擬。不需要進(jìn)行額外的參數(shù)配置竟块,安裝好Spark之后壶运,默認(rèn)啟動(dòng)的就是這種模式。

其操作全為單機(jī)完成浪秘,主要用于學(xué)習(xí)和功能測試蒋情。

Standalone

這里需要構(gòu)建一個(gè)由Master+Slave構(gòu)成的Spark集群,Spark運(yùn)行在集群中耸携。

這種模式是指利用Spark自己原生的master作為Cluster Manager來管理集群資源棵癣。這里需要注意的是,master并不是driver夺衍。master只擔(dān)任資源管理調(diào)度等方面的工作狈谊,具體的Task調(diào)度還是由driver完成。

Spark on Memos

Spark客戶端直接連接Mesos沟沙,不需要額外構(gòu)建Spark集群河劝,這種模式利用Memos的調(diào)度機(jī)制來管理集群。

Spark on Yarn

Spark客戶端直接連接Yarn矛紫,不需要額外構(gòu)建Spark集群赎瞎,這種模式是指利用Yarn的調(diào)度機(jī)制來管理集群,即上圖中的spark運(yùn)行架構(gòu)中的Cluster Manager為Resource Manager颊咬。

需要補(bǔ)充的一點(diǎn)是务甥,幾種集群模式中,都有兩種細(xì)分的方式喳篇,這里以Standalone為例缓呛。

Standalone Client模式(集群)

該模式運(yùn)行與集群之上,使用這種模式的時(shí)候杭隙,Master進(jìn)程做為cluster manager,SparkSubmit做為Client端和運(yùn)行driver程序因妙;Worker進(jìn)程用來作為Executor痰憎。

Standalone Cluster模式(集群)

該模式也是運(yùn)行于集群之上票髓,使用這種模式的時(shí)候,Client端的SparkSubmit進(jìn)程會(huì)在提交任務(wù)之后退出铣耘,Client不再負(fù)責(zé)運(yùn)行driver程序洽沟;Master會(huì)在集群中選擇一個(gè)Worker進(jìn)程生成一個(gè)子進(jìn)程DriverWrapper來啟動(dòng)driver程序;同時(shí)因?yàn)镈riverWrapper 進(jìn)程會(huì)占用Worker進(jìn)程的一個(gè)core蜗细,所以同樣的資源下配置下裆操,會(huì)比Standalone Client模式,少用1個(gè)core來參與計(jì)算炉媒。

總結(jié)一下:Client模式中踪区,Client提交任務(wù)之后,會(huì)作為Spark程序的driver吊骤,仍然和集群保持連接缎岗;而Cluster模式中,Client提交任務(wù)之后就退出白粉,由集群中的某個(gè)節(jié)點(diǎn)擔(dān)任driver传泊,也可以簡單理解為后臺模式。

Spark執(zhí)行流程(Job的執(zhí)行流程)


整個(gè)Spark執(zhí)行任務(wù)鸭巴,可以分為以下四個(gè)部分:

Driver端:

1 生成邏輯查詢計(jì)劃

2 生成物理查詢計(jì)劃

3 任務(wù)調(diào)度

Executor端

4 任務(wù)執(zhí)行

整個(gè)流程的簡圖可以參照下圖:

spark的Job執(zhí)行流程

如果對上面的流程有疑惑的話眷细,可以這么考慮:

Driver端:

1 生成邏輯查詢計(jì)劃:這一步主要是根據(jù)我們對RDD的操作,比如map鹃祖,join溪椎,reduce等操作,來設(shè)定RDD的查詢依賴關(guān)系惯豆。

2 生成物理查詢計(jì)劃:根據(jù)上一步的邏輯圖和數(shù)據(jù)實(shí)際分布的情況池磁,生成整個(gè)任務(wù)實(shí)際執(zhí)行的調(diào)度圖(DAG圖)。

3 任務(wù)調(diào)度:根據(jù)第二步生成的DAG圖楷兽,進(jìn)行具體的任務(wù)調(diào)度地熄。

Executor端

4 任務(wù)執(zhí)行:Executor執(zhí)行具體的任務(wù)

詳細(xì)的Job執(zhí)行的流程圖,如下:

spark的Job執(zhí)行流程詳解

Spark編程模型之RDD(resilient distributed dataset)


RDD定義

RDD芯杀,彈性分布式數(shù)據(jù)集端考,是Spark中的數(shù)據(jù)抽象模型和編程模型,本質(zhì)上是一種抽象的特殊集合 揭厚。

RDD的特點(diǎn)是支持多種數(shù)據(jù)來源?? 有容錯(cuò)機(jī)制?? 可以被緩存?? 支持并行操作等却特。

在邏輯上,一個(gè)RDD代表一個(gè)數(shù)據(jù)集筛圆。而在物理上裂明,同一個(gè)RDD里的數(shù)據(jù)可能分布在不同的節(jié)點(diǎn)。

下圖表示一個(gè)RDD在物理上跨節(jié)點(diǎn)的分布情況太援。

RDD的物理分布

RDD創(chuàng)建

#RDD主要有三種方式創(chuàng)建

1 通過內(nèi)存中的數(shù)據(jù)創(chuàng)建(比如內(nèi)存中的數(shù)組闽晦,適合學(xué)習(xí)測試使用)

val seq=Seq(1,2,3)

val rdd=sc.makeRDD(seq)

2 通過外部數(shù)據(jù)集創(chuàng)建(如HDFS數(shù)據(jù)集扳碍,一般用在生產(chǎn)環(huán)境)

val rdd=sc.textFile("test.txt")

3 通過其他RDD轉(zhuǎn)換而來(RDD transformation)

val childRdd=rdd.map(func)

RDD操作

RDD的操作分為兩種:Transformation(轉(zhuǎn)換)操作和Action(執(zhí)行)操作。其中仙蛉,轉(zhuǎn)換操作會(huì)生成一個(gè)新的RDD笋敞,但這種操作是惰性的,并不會(huì)立即執(zhí)行荠瘪,而是生成了RDD間的相互依賴關(guān)系夯巷;執(zhí)行操作一般是“寫”操作,“寫”到driver的collect()哀墓、take()和寫到文件的save()等趁餐,或者立刻需要返回結(jié)果的count()等函數(shù);執(zhí)行操作都是立即執(zhí)行的麸祷。

Transformation

1 將一個(gè)RDD轉(zhuǎn)化成一個(gè)新的RDD

2 保存RDD間的依賴關(guān)系澎怒,生成DAG圖

3 惰性操作,不會(huì)立刻執(zhí)行

Action

1 觸發(fā)任務(wù)的執(zhí)行

Transformation操作帶來的RDD依賴

RDD依賴關(guān)系

上面已經(jīng)說到阶牍,RDD可以由RDD轉(zhuǎn)換而來喷面,這樣就形成了RDD之間的相互依賴關(guān)系。根據(jù)RDD在實(shí)際執(zhí)行中的表現(xiàn)走孽,可以將RDD間的依賴關(guān)系分為以下兩種:

窄依賴:每個(gè)父RDD的一個(gè)Partition最多被子RDD的一個(gè)Partition所使用

寬依賴:每個(gè)父RDD的一個(gè)Partition會(huì)被多個(gè)子RDD的Partition所使用

簡單來說惧辈,窄依賴就是父子的一對一或者多對一關(guān)系,寬依賴就是父子的一對多關(guān)系磕瓷。Job執(zhí)行時(shí)盒齿,當(dāng)窄依賴失敗時(shí),只需要重算對應(yīng)的父RDD就可以了困食;而當(dāng)寬依賴失敗的時(shí)候边翁,需要重算所有對應(yīng)的父RDD,而重算的父RDD中硕盹,會(huì)有一些是無效的符匾;同時(shí),寬依賴一般會(huì)跨節(jié)點(diǎn)瘩例,產(chǎn)生大量的shuffle過程啊胶,所以要盡量減少寬依賴。

RDD的寬窄依賴圖解

RDD的寬依賴:stage的劃分

那么垛贤,RDD的寬窄依賴有什么用呢焰坪?上面也說過,知道什么是寬依賴聘惦,并且知道寬依賴是性能瓶頸某饰,有助于我們優(yōu)化程序的執(zhí)行。

其次,RDD的寬依賴露乏,也是stage的劃分依據(jù)碧浊,如下圖所示:

Spark以寬依賴為依據(jù)來進(jìn)行stage劃分


Spark使用的簡單Demo




文集

Spark:理論與實(shí)踐

文章

五分鐘大數(shù)據(jù):Spark入門

Spark編程快速入門

Spark難點(diǎn)解析:Join實(shí)現(xiàn)原理

可視化發(fā)現(xiàn)Spark數(shù)據(jù)傾斜

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘟仿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比勉,老刑警劉巖劳较,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浩聋,居然都是意外死亡观蜗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門衣洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓捻,“玉大人,你說我怎么就攤上這事坊夫∽┑冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵环凿,是天一觀的道長梧兼。 經(jīng)常有香客問我,道長智听,這世上最難降的妖魔是什么羽杰? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮到推,結(jié)果婚禮上考赛,老公的妹妹穿的比我還像新娘。我一直安慰自己莉测,他們只是感情好颜骤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悔雹,像睡著了一般复哆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腌零,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天梯找,我揣著相機(jī)與錄音,去河邊找鬼益涧。 笑死锈锤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播久免,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浅辙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阎姥?” 一聲冷哼從身側(cè)響起记舆,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呼巴,沒想到半個(gè)月后泽腮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衣赶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年诊赊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府瞄。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碧磅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遵馆,到底是詐尸還是另有隱情鲸郊,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布团搞,位于F島的核電站严望,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逻恐。R本人自食惡果不足惜像吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复隆。 院中可真熱鬧拨匆,春花似錦、人聲如沸挽拂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏栈。三九已至台腥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绒北,已是汗流浹背黎侈。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闷游,地道東北人峻汉。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓贴汪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親休吠。 傳聞我的和親對象是個(gè)殘疾皇子扳埂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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