日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Beatles小記(三)-分布式數(shù)據(jù)流分析中Master

系統(tǒng) 2364 0

Author:放翁(文初)

Email: fangweng@taobao.com

Mblog:weibo.com/fangweng

Blog: http://blog.csdn.net/cenwenchu79/

Beatles: https://github.com/cenwenchu/beatles

讀前先看:

這篇文章主要講述的是beatles流式數(shù)據(jù)分析框架中對(duì)于master的橫向擴(kuò)展真實(shí)的設(shè)計(jì)演進(jìn),是beatles框架介紹的第三篇,看第三部分的時(shí)候如果看過前兩篇文章,這篇文章的遞進(jìn)應(yīng)該比較容易理解(如果看過前面的代碼,那么會(huì)更深入的理解其中的細(xì)節(jié),文字圖片描述一分鐘,代碼寫寫1個(gè)周)。如果沒有看過前兩篇,那前提你要理解hadoop等常用的分布式分析系統(tǒng)再看,否則最后可能交流起來就有些空對(duì)空了,因?yàn)檎娴膶懥撕陀昧司蜁?huì)有體會(huì)細(xì)節(jié)的差別。

廢話不多說,看完后如果不看代碼其實(shí)也很難體會(huì)細(xì)節(jié),因此建議看完后看看代碼,跑一下測(cè)試用例子(MasterSlaveIntegrationTest_SocketVersion是socket集成測(cè)試版本)。

下面文章中的mr表示MapReduce的意思。

Master的橫向擴(kuò)展:

盡管Beatles這種松散模式下Slave可以隨時(shí)隨地的加入集群,但由于最終數(shù)據(jù)還要匯總到Master,Master本身承擔(dān)著類似于Hadoop中Reduce的角色,所以Master在版本迭代的過程中不斷的對(duì)本身做著各種優(yōu)化:并行模式下多線程的數(shù)據(jù)合并,主干數(shù)據(jù)分析周期的磁盤換入換出,支持Slave多任務(wù)合并后返回,數(shù)據(jù)導(dǎo)出廣度遍歷column存儲(chǔ)結(jié)構(gòu)等等(詳細(xì)的參看第二篇文章)。當(dāng)數(shù)據(jù)base真的非常大的時(shí)候(例如:對(duì)于用戶緯度的統(tǒng)計(jì),統(tǒng)計(jì)后結(jié)果還是非常多,無法hold在內(nèi)存),開放平臺(tái)分析系統(tǒng)給數(shù)據(jù)需求方提供的解決方案是片段性輸出,交由外部再次合并這些片段。(這是基于當(dāng)時(shí)間片段足夠小的時(shí)候,數(shù)據(jù)片內(nèi)容可以被承受)但結(jié)果是讓外部數(shù)據(jù)使用者利用數(shù)據(jù)庫去對(duì)這些結(jié)果做二次歸并。這不僅給數(shù)據(jù)結(jié)果使用者帶來了問題,也使得Master隨時(shí)會(huì)被最后一根稻草壓倒(如果時(shí)間片數(shù)據(jù)依然無法被hold)。

下面看看老的結(jié)構(gòu)圖:


Beatles小記(三)-分布式數(shù)據(jù)流分析中Master的橫向擴(kuò)展

圖1Master橫向擴(kuò)展前結(jié)構(gòu)圖

1.master從不同的jobs來源構(gòu)建需要處理的分析任務(wù),并拆分為多個(gè)task是。

2.slave請(qǐng)求任務(wù)(一個(gè)或者多個(gè))去做分析處理。

3.slave獲得任務(wù)后從任務(wù)描述中獲得數(shù)據(jù)來源,分析規(guī)則,輸出,開始從數(shù)據(jù)來源增量獲取數(shù)據(jù)進(jìn)行分析。

4.slave根據(jù)任務(wù)定義判斷多個(gè)任務(wù)結(jié)果是否可以合并,并將合并后的結(jié)果發(fā)回給master。至此slave的一輪業(yè)務(wù)生命周期結(jié)束,再從步驟3開始重復(fù)。

5.master收到各個(gè)slave的數(shù)據(jù),開始多線程并行合并job結(jié)果,最終判斷某一個(gè)job的task是否都已經(jīng)完成,如果完成開始導(dǎo)出數(shù)據(jù)和臨時(shí)文件,重置job開始下一輪的job執(zhí)行。

思考:

是否增加一個(gè)角色:reducer來替代掉master的工作?

其實(shí)slave一次能夠獲取多個(gè)jobtask,然后自我合并,就是一種比較弱的reduce的做法。

否定了新增一個(gè)reducer的原因:新增角色增加了管理的復(fù)雜度和集群擴(kuò)展性。(Hadoop就直接用slave作為reduce)

如果用slave來完全承擔(dān)所有的reduce工作?

1.破壞了原來master不管理slave集群的基本原則,slave動(dòng)態(tài)擴(kuò)展非常麻煩,同時(shí)需要增加心跳管理和各種調(diào)度算法,任務(wù)管理來完成結(jié)果的合并。(最后就是一個(gè)hadoop的設(shè)計(jì))

2.不考慮用文件作為數(shù)據(jù)交互的方式(因?yàn)榱魇椒治龅奶攸c(diǎn):片段性數(shù)據(jù)量不大,及時(shí)性要求高,所以最好直接是內(nèi)存),因此hadoop最亮眼的hdfs沒有用到,hadoop設(shè)計(jì)將會(huì)大打折扣。

如果用master繼續(xù)做reduce,是否可以考慮橫向擴(kuò)展master?

Master的職責(zé):

1.從任務(wù)源(可能是本地配置文件或者db或者是http服務(wù))獲得jobs定義構(gòu)建任務(wù)池。

2.被動(dòng)分配多個(gè)job的tasks。

3.管理job狀態(tài)以及jobtask的狀態(tài)。

4.根據(jù)jobtask狀態(tài)合并slave返回結(jié)果到j(luò)ob各個(gè)主干上。

5.根據(jù)job狀態(tài)導(dǎo)出job每一輪的中間結(jié)果和統(tǒng)計(jì)結(jié)果。

6.根據(jù)job狀態(tài)判斷是否重置job。

會(huì)發(fā)現(xiàn)其實(shí)master歸根到底就是對(duì)job的管理以及對(duì)job中數(shù)據(jù)結(jié)果的合并和導(dǎo)出,而最為消耗的就是類似與reducer的4,5兩個(gè)步驟。

先介紹一下job和jobtask的概念,利于對(duì)后面的拆分有更好的理解:

job包含了一組jobtask,job本身定義了一組mr規(guī)則(類似有很多mr處理實(shí)現(xiàn)),定義了要處理的數(shù)據(jù)來源(其他信息參看代碼)。

Jobtask是將job的多個(gè)數(shù)據(jù)來源拆分后得到的一個(gè)子任務(wù),也就是每一個(gè)數(shù)據(jù)來源和同一組mr成為了一個(gè)任務(wù),在slave獲得一個(gè)或者多個(gè)task的時(shí)候,可以自己通過數(shù)據(jù)來源去獲取數(shù)據(jù),然后根據(jù)一組規(guī)則直接對(duì)流式數(shù)據(jù)做大量的mr(這也是和最早hadoop自己寫mr的差別,其實(shí)數(shù)據(jù)的多次移動(dòng)和讀入才是計(jì)算集群的最大成本),但最終所有的jobtask都要合并到j(luò)ob的結(jié)果主干上,最后導(dǎo)出臨時(shí)結(jié)果和報(bào)表數(shù)據(jù)。

a.如果等價(jià)部署多個(gè)master,所有slave連接一組master,來做master橫向擴(kuò)展會(huì)如何?

a)任務(wù)管理就需要多節(jié)點(diǎn)之間做并發(fā)控制,當(dāng)前可以看看master內(nèi)的代碼是一個(gè)進(jìn)程內(nèi)做并發(fā)控制。這種方式過于復(fù)雜,帶來的消耗遠(yuǎn)大于收益

b.如果等價(jià)部署多個(gè)master,所有slave連接一組master,但是將job或者jobtask按照業(yè)務(wù)(上面說過job就是定義了多個(gè)mr的實(shí)現(xiàn),要拆分也只能將mr分組放到不同的master上來減輕mr產(chǎn)生的<k,v>對(duì)存儲(chǔ)帶來的壓力)分?jǐn)偟蕉鄠€(gè)master上,即不用對(duì)任務(wù)管理做并發(fā)控制,又可以分擔(dān)reduce的工作。

a)slave主動(dòng)請(qǐng)求任務(wù),如何判斷應(yīng)該優(yōu)先向誰請(qǐng)求任務(wù)?任務(wù)負(fù)載均衡如何做?最后可能還是單獨(dú)部署多套集群來的靠譜。

b)將不同的mr放在多個(gè)master可行,但結(jié)果就和hadoop獨(dú)立的寫mr帶來的結(jié)果一樣,對(duì)同一份數(shù)據(jù)來源處理,卻因?yàn)閙r的分組數(shù)據(jù)被反復(fù)讀入和移動(dòng)。

c.和Zookeeper類似,master建立group,但是只有一臺(tái)負(fù)責(zé)1,2,3,6的工作,而4,5則可以擴(kuò)展到多個(gè)master上。需要對(duì)原來系統(tǒng)的改造為:

a)多個(gè)master job池構(gòu)建來源保持一致,構(gòu)建完畢增加mr與master的對(duì)應(yīng)關(guān)系(根據(jù)算法實(shí)現(xiàn)平均分配,后面介紹關(guān)于分配的算法,注意只有主的那臺(tái)master接受任務(wù)分發(fā)請(qǐng)求,負(fù)責(zé)將mr與master建立對(duì)應(yīng)關(guān)系在task中傳遞給slave)

b)slave從一臺(tái)master上獲取任務(wù),分析后將結(jié)果按照mr分組(執(zhí)行的Task中帶有,所有設(shè)計(jì)都是這樣,slave不保留任何帶有業(yè)務(wù)性或者集群管理性的配置,保證slave隨時(shí)離場(chǎng),隨時(shí)加入),將分組后的mr結(jié)果并行的發(fā)送到多個(gè)master上。

c)master在合并和輸出結(jié)果的時(shí)候判斷自己所負(fù)責(zé)的mr部分,按需合并和存儲(chǔ)(雖然在slave中已經(jīng)有做業(yè)務(wù)數(shù)據(jù)分組)。

會(huì)發(fā)現(xiàn)多個(gè)master好像多臺(tái)流水線一樣,保持著相同的動(dòng)作和周期性,從同一個(gè)slave獲取到了不同原始材料以后,開始制作零件,然后以匹配的速度來將不同零件丟到一個(gè)筐子里交給后續(xù)處理者。

當(dāng)然你會(huì)考慮到還有容錯(cuò),master集群動(dòng)態(tài)擴(kuò)展,速度不匹配等問題,后續(xù)細(xì)節(jié)慢慢介紹。

基于上面所描述的情況,結(jié)構(gòu)演變成如下:


Beatles小記(三)-分布式數(shù)據(jù)流分析中Master的橫向擴(kuò)展

圖2 橫向擴(kuò)展后的結(jié)構(gòu)圖

可以看到Slave現(xiàn)在獲取任務(wù)還是集中在一臺(tái),但是返回任務(wù)結(jié)果會(huì)支持分散到多臺(tái)master,解決master瓶頸最大的問題。同時(shí)master組的jobs來源保持一致,作為橫向擴(kuò)展的基礎(chǔ)(主master分組mr簡(jiǎn)化master的協(xié)同,其他master沒有獲得數(shù)據(jù)就沒有結(jié)果輸出)

細(xì)節(jié):

1.master group之間不需要通信。(主要是業(yè)務(wù)分拆信息,可以通過冪等算法,也可以通過單機(jī)分配,分析結(jié)果過濾投遞的方式),當(dāng)前主要是用分析結(jié)果過濾投遞來保證。

2.平均分配算法。

首先master有權(quán)重(有實(shí)體機(jī)器,也有虛擬機(jī),處理能力不同),其次mr的權(quán)重也不同(有對(duì)app做簡(jiǎn)單統(tǒng)計(jì)的,有對(duì)用戶做統(tǒng)計(jì)的,數(shù)據(jù)量相差非常大)。當(dāng)前考慮一個(gè)mr一臺(tái)虛擬機(jī)抗不論多少數(shù)據(jù)都能抗的住,如果扛不住后續(xù)可以再根據(jù)mr產(chǎn)生的結(jié)果分(這會(huì)增加分流數(shù)據(jù)的消耗),其實(shí)可以看作現(xiàn)在是分庫,以后就是分表。分配算法其實(shí)就是在兩邊都有權(quán)重的情況下做任務(wù)分配,且任務(wù)不可切割。

采用了兩個(gè)排序隊(duì)列,然后按照簡(jiǎn)單的饑餓+權(quán)重方式來分配,處理者根據(jù)當(dāng)前獲得的饑餓感排序,越饑餓的放在越前面(饑餓感=已分配任務(wù)/自身權(quán)重),當(dāng)已分配任務(wù)為0的時(shí)候饑餓感=1/自身權(quán)重(保證能力最強(qiáng)的優(yōu)先獲得最大的任務(wù))。任務(wù)按照權(quán)重排序,高權(quán)重的排在最前面。分配過程如下:

1.獲的當(dāng)前任務(wù)隊(duì)列最前面的任務(wù)(權(quán)重最高的任務(wù))

2.將任務(wù)分配給處理者隊(duì)列中饑餓感最強(qiáng)的節(jié)點(diǎn)。

3.節(jié)點(diǎn)吃了任務(wù)以后會(huì)再次按照處理者隊(duì)列排序。

4.循環(huán)到1再次分配任務(wù),直到任務(wù)分配結(jié)束。

能看到的就是其實(shí)就是有一個(gè)評(píng)判餓的標(biāo)準(zhǔn),按照資源權(quán)重高低來分配,最后平均分配資源。(也許各位會(huì)有更好的建議和算法)

這個(gè)算法在保證兩個(gè)隊(duì)列構(gòu)建時(shí)始終一致性的情況下,能夠變成等冪分配算法,其實(shí)也就是當(dāng)兩個(gè)隊(duì)列中如果遇到評(píng)判標(biāo)準(zhǔn)相等的時(shí)候排序是否會(huì)有前后變化,如果沒有,那么任何一個(gè)master都會(huì)產(chǎn)出相同的分配結(jié)果。(具體可以參看代碼,在ReportUtil中)

3.Master的容災(zāi)。由于master其實(shí)不是等價(jià)集群的模式,因此master的不可靠會(huì)導(dǎo)致數(shù)據(jù)丟失。

a)Slave如果發(fā)送錯(cuò)誤,則會(huì)嘗試再發(fā)送一次,如果兩次錯(cuò)誤,則將master和對(duì)應(yīng)的job作為文件名保存這次隸屬于這個(gè)job的tasks結(jié)果到文件中(append 進(jìn)文件)。

b)Master如果恢復(fù)的話,可以通過腳本將這些文件復(fù)制到master的目錄下,master后臺(tái)線程載入數(shù)據(jù)合并到主干。

c)過程中如果master恢復(fù),后續(xù)的消息將會(huì)投遞到master,因此不會(huì)再寫這個(gè)文件,因此文件不會(huì)需要有一個(gè)增量拷貝的過程,同時(shí)master也可以在后臺(tái)線程慢慢恢復(fù)合并,最后使得數(shù)據(jù)保持一致性。

d)當(dāng)前還是處于半自動(dòng)模式,后續(xù)可以考慮讓slave后臺(tái)線程將數(shù)據(jù)發(fā)送到恢復(fù)了的master上。

e)中間可能損失部分時(shí)間片數(shù)據(jù)。

4.mr的動(dòng)態(tài)增加或者減少(隨時(shí)隨地可以針對(duì)流式數(shù)據(jù)產(chǎn)出新的統(tǒng)計(jì)分析結(jié)果)。原來的集群就支持mr的動(dòng)態(tài)增加,因?yàn)槎际桥渲梦募薷模匦螺d入翻譯一下即可(統(tǒng)計(jì)模型被抽象后mr就可以窮舉了,具體參看前面的文檔)。當(dāng)前因?yàn)閙aster是多個(gè),同時(shí)開始的時(shí)候就做好了mr與master的對(duì)應(yīng)關(guān)系,因此增加或者減少如果從新做mr與master的分配會(huì)產(chǎn)生數(shù)據(jù)遷移的需求,因此對(duì)于mr的增加只是將變化部分再對(duì)master group做一次分配(假設(shè)原來那些mr分配是均勻的,現(xiàn)在歸零master再分配,大志結(jié)果也是均勻的),對(duì)于mr的減少,只是消除掉task中的定義,mr與master對(duì)應(yīng)關(guān)系不消除,避免后面要恢復(fù)帶來的數(shù)據(jù)遷移。

5.master的動(dòng)態(tài)增加和減少。這個(gè)不可避免的要做數(shù)據(jù)遷移,當(dāng)前做法是每天是所有job重置的周期,增加和減少master將在那個(gè)時(shí)候?qū)φ麄€(gè)集群做停機(jī),然后啟動(dòng)集群做重新編譯,從今天起點(diǎn)開始分析,追趕數(shù)據(jù)。以后可以考慮如何做到不停機(jī)擴(kuò)容master。(主要就是數(shù)據(jù)遷移)

6.后續(xù)考慮做master與mr的冗余分配,既可以保證數(shù)據(jù)可靠性(多份數(shù)據(jù)分析存儲(chǔ)),又可以方便擴(kuò)容(數(shù)據(jù)遷移成本可以間接降低)

一些感受

最后master的簡(jiǎn)單橫向擴(kuò)展模式,使得數(shù)據(jù)分片,一定程度上得到了數(shù)據(jù)安全性的保證,同時(shí)對(duì)于非常消耗cpu和memory的reduce被簡(jiǎn)單的拆分開來,為業(yè)務(wù)發(fā)展提供了突破,最重要的是系統(tǒng)依然保持最初的設(shè)計(jì)原則和目的。

任何系統(tǒng)都有自己的適用場(chǎng)景,不要因?yàn)橐鲆粋€(gè)大而全的系統(tǒng),而喪失了自己設(shè)計(jì)的原則,我們很難做一個(gè)hadoop,但是我們要的也并不是一個(gè)通用的hadoop,找到業(yè)務(wù)場(chǎng)景的特點(diǎn),才能夠用最簡(jiǎn)單高效的設(shè)計(jì)方式來完成業(yè)務(wù)不斷增長帶來的技術(shù)挑戰(zhàn)。

另,在設(shè)計(jì)過程中時(shí)不時(shí)有同學(xué)問我要不要引入zookeeper,過程中曾考慮過,但最后還是覺得要解決了根本問題以后再引入,因?yàn)樗皇且粋€(gè)工具,便于管理的工具。就像我們要求代碼能夠做單元測(cè)試一樣,如果沒有zookeeper是否你的系統(tǒng)就無法run,小到模塊,大到系統(tǒng),接口化設(shè)計(jì)就是要屏蔽實(shí)現(xiàn)對(duì)系統(tǒng)設(shè)計(jì)后期可擴(kuò)展,穩(wěn)定性的影響,所有系統(tǒng)最后都能夠退化為文件交換方式的處理模式,因此如果能夠用文件交換可以實(shí)現(xiàn)的了的話,你的系統(tǒng)就是最ok的了。(你可以發(fā)現(xiàn)linux這么偉大的操作系統(tǒng)就是如此,一切文件化,一切接口化,簡(jiǎn)單就是美,這個(gè)美需要不斷的堅(jiān)持自己的原則)

Beatles小記(三)-分布式數(shù)據(jù)流分析中Master的橫向擴(kuò)展


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 翁源县| 莒南县| 新巴尔虎右旗| 井研县| 长宁县| 神木县| 赫章县| 和林格尔县| 古蔺县| 罗城| 怀化市| 长阳| 平武县| 曲麻莱县| 诏安县| 嘉祥县| 都匀市| 昌吉市| 临沭县| 和田县| 靖西县| 扶沟县| 奉节县| 昌江| 滨州市| 东乡县| 靖边县| 宜宾市| 从化市| 花莲市| 大关县| 沅江市| 肥东县| 宁远县| 西乌| 若羌县| 囊谦县| 那曲县| 海安县| 长乐市| 淮安市|