大家好,我是一行Spark代碼趣些,我叫小小小蕉金顿,不知道為毛臊泌,我爸爸大蕉和我媽媽大大蕉把我生的又瘦又長。長這樣揍拆。
valsssjiao =newSparkContext(newSparkConf().setAppName("sssjiao").setMaster("yarn-cluster")).parallelize(Array(""));
我真的渠概,不知道怎么說,好長好長啊。播揪≈總有小伙伴對著我說:
問君何不乘風起 ????扶搖直上九萬里。
說出來不怕嚇著你猪狈,其實我一個字都看不懂箱沦。
作為一行普通的代碼,我也開始思考碼生的三大問題雇庙,我是誰谓形,我從哪里來,要到哪里去疆前。
我從我從哪里來寒跳,開始講我的故事吧。
我從哪里來竹椒?
這有什么好說的童太,出自我爸爸大大蕉之手,就醬胸完。
本文終书释。
當當當,你以為就這樣結束了嗎赊窥?不可能的爆惧。我長得這么細這么長,其實我是由三個部分組成的誓琼。分別是SparkConf检激,SparkContext,RDD[String]腹侣,從代碼層面來說叔收,就是定義了一個SparkConf的配置,來生成一個SparkContext上下文傲隶,然后用這個SparkContext來對數組進行序列化饺律,我就被產生出來啦。
但是我今天不僅僅是想介紹這么淺層的來源跺株,畢竟爸比媽咪生得我那么辛苦是吧复濒?
(要開始Spark on yarn的深度剖析了)
大大蕉:yarn兄,我要生一個兒子乒省,oh不我要產生一個Spark任務了巧颈,能幫忙撥???????????????? ??點行政資源不?
yarn????:啥玩意袖扛,你想干啥砸泛?要尊貴的cluster模式還是平民的client模式十籍?
大大蕉:這兩個有啥差別?我頭胎唇礁。
yarn????:client就你用你自己粗糙的Driver勾栗,cluster模式就我給你分配一個高配置又漂亮的Driver。
大大蕉:那行盏筐,給我來個尊貴的cluster吧围俘。
yarn????:等著。
yarn????:歪琢融,ResourceManager嗎(管資源的界牡,下面簡稱RM)?你那邊不是在管資源嗎吏奸?咱這有貨嗎欢揖?趕緊給我空運一個高配的機器陶耍,嗯對奋蔚,用來跑Driver和ApplicationMaster的,嗯對對對烈钞,我們這邊有人快生了泊碑。對,急急急毯欣,這輩子就這要一次最急馒过。
RM????:知道了(一臉嫌棄懶洋洋)。
過了0.00001ms酗钞,對于CPU來說過了好久了
RM????:NodeManage(每臺機器的管家腹忽,下面簡稱NM),歪砚作,根據記錄你那里的配置恰好夠用窘奏,你那里的Container1容器我征用了,就這樣葫录。
NM????:我R着裹。。米同。
RM????:yarn老哥骇扇,給你那個名字為container-1的容器吧,他的地址和配置信息(CPU面粮,內存)在這少孝,你收好了匾七。
yarn的最小分配單位為Container
yarn????:好的占业,非常感謝但绕,后面有事情還麻煩你。
yarn????:大大蕉嗎旬蟋?Container拿到了,就是Container1式撼,自己去看看怎么生吧宪潮。
大大蕉:好的。掰盖淡。
大大蕉:(自言自語)根據說明書年柠,先啟動一個ApplicationMaster,名字叫做sssjiao褪迟,用來管理這個Job和Container冗恨。再先啟動一個Driver,來管理DAGScheduler(有向無環(huán)圖管理)和TaskScheduler(任務調度管理),BlockManagerMaster(數據塊管理的Master)味赃。咦掀抹,那我去哪跑任務呢?還差一些Worker工作站啊心俗。
Spark將一個大的任務拆成一個有向無環(huán)圖傲武,來表示依賴關系。
大大蕉:歪城榛。yarn嗎揪利?嗯是我。我這好像還差點東西啊狠持。疟位。我還需要一些Container來做我的Worker啊,不然我兒子生完往哪放按埂甜刻?
yarn????:知道了知道了,不會一次說完嗎正勒?真討厭得院。
大大蕉:我。昭齐。尿招。我?也不知道需要這個啊。
yarn????:歪阱驾。RM嗎就谜?嗯又是我。我需要一批Container里覆。嗯對高配那種丧荐。對,急急急喧枷,這輩子就這一次最急虹统。
RM???? ?:知道了弓坞。(不耐煩)
RM????? :NM-A,NM-B车荔,NM-C渡冻,NM-D,你們幾個的資源我都征用了忧便。
NM界一臉懵逼族吻,都感覺自己被搶劫了。珠增。
RM???? ?:歪超歌,yarn老哥嗎?資源都ok了蒂教。ContainerA巍举,ContainerB,ContainerC凝垛,ContainerD懊悯。
yarn????:好嘞。
yarn????:大大蕉苔严。資源拿到了定枷,信息我裝在信封里了孤澎,你拿好吧届氢。
大大蕉:嗯,我還想問一下覆旭,后面的(電話那頭傳來嘟嘟嘟掛斷的聲音)退子。步、驟型将、要寂祥、怎、么七兜、走丸凭。算了還是自己看說明書吧。
首先在Container里面啟動一個或者多個Executor腕铸,然后啟動一些jvm和BlockManager惜犀。好了現在Driver、Master和Worker都有了狠裹,完事具備虽界,只欠東西南北風了。
到這里涛菠,SparkContext算是初始化完了莉御。
大大蕉抓著頭發(fā)撇吞,一臉茫然地看著面前這堆玩意,要怎么玩礁叔。牍颈。。
誒琅关,再看看說明書吧颂砸,看看有沒有說怎么玩。(大蕉自言自語道)
突然空氣中響起了旁白:切分死姚、分配人乓、切分、分配都毒。
對色罚!這個job可以先用DAGScheduler進行stage切分。
切分完然后用TaskScheduler進行任務調度分配账劲。所以一個Job就被切分成很多個stage戳护,封裝成很多個TaskSet,然后每次Executor來請求任務的時候瀑焦,就給他們分配一個腌且,所有的Executor執(zhí)行完成后又向TaskScheduler報告進度。
Task失敗了榛瓮?報告TaskScheduler铺董。從頭開始重新跑。
Task太慢了禀晓?TaskSchduler找多一個Executor并行跑精续,誰先跑完就用誰(好殘忍)
Stage掛了?TaskScheduler報告DAGScheduler重新進行Stage拆分粹懒,看看是從當前開始重跑還是要用從父stage重跑重付。
好了到現在,小小小蕉我凫乖,還沒有被產生出來确垫。。
然后SparkContext就我的前輩Array("")進行序列化帽芽,然后根據key删掀,也就是每個字符串進行分區(qū),分區(qū)完之后把分區(qū)信息和對應的Executor保存起來嚣镜。然后呢根據分區(qū)信息把數據發(fā)送到Executor那邊去爬迟。所以我的本體RDD是在Driver的,但是我被分成很多份很小份很小份放在Exector里面的菊匿。
我是誰付呕?
我是一個RDD计福。全名RDD(Reilient Distributed DataSets)彈性分布式數據集。RDD的具體描述在這里邊徽职。
我要到哪里去象颖?
我后面的任務就是進行具體程序的執(zhí)行,一個job一個job姆钉,一個stage一個stage说订。
這里再深入,就是從編譯完的.class文件潮瓶,用JVM的ClassLoader類加載器陶冷,加載完變成一個真正的類,然后再又JVM編譯成機器碼毯辅,在堆里開辟一點內存初始化一個String對象埂伦,在棧里開辟一點內存初始化一個指針。
然而跑完之后呢思恐,我又將何去何從呢沾谜?
然后10M以下的就直接放在結果返回給TaskScheduler啦。
如果在10M以上的胀莹,就放到某個BlockManage基跑,只返回BlockId了。
通知TaskScheduler說跑完啦描焰。
然后TaskScheduler就通知DAGScheduler說跑完啦媳否。
然后DAGScheduler就通知SparkContext說跑完啦。
然后SparkContext就通知Driver跑完啦栈顷。
然后SparkContext就準備要stop了逆日。
大大蕉????:歪,yarn嗎萄凤?我兒子生完了,資源都還給你把搪哪。
yarn????????:好靡努。
yarn????????:歪。RM嗎晓折?剛剛申請的資源用完了惑朦,你把它們標記為可用把。
虛擬機????:這行又瘦又長的叫sssjiao的代碼是誰啊漓概。漾月。好像被人丟在這了,誒當垃圾回收了吧胃珍,然后就給小小小蕉臉上蓋上了一個待回收的印子??梁肿。
過了不久蜓陌,小小小蕉就被GC(Garbage Collection)回收了,但是它臉上洋溢著笑容吩蔑,它钮热,是快樂的。
這就是小小小蕉快快樂樂的一生烛芬。
附上之前的好幾篇Spark文章哈隧期。
如果覺得還不錯呢,就幫忙點贊評論分享一下啦赘娄,是對我最大的支持仆潮,感謝各位讀者小伙伴,哇咔咔(づ ̄3 ̄)づ╭?~遣臼。
微信公眾號:一名叫大蕉的程序員