一、背景
有一些時(shí)候,多個(gè)團(tuán)隊(duì)需要共同完成一個(gè)任務(wù),比如,A團(tuán)隊(duì)將Hadoop集群計(jì)算的結(jié)果交給B團(tuán)隊(duì)繼續(xù)計(jì)算,B完成了自己任務(wù)再交給C團(tuán)隊(duì)繼續(xù)做。這就有點(diǎn)像業(yè)務(wù)系統(tǒng)的工作流一樣,一環(huán)一環(huán)地傳下
去,直到最后一部分完成。在業(yè)務(wù)系統(tǒng)中,我們經(jīng)常會(huì)用SOA的架構(gòu)來解決這種問題,每個(gè)團(tuán)隊(duì)在ESB(企業(yè)服務(wù)股總線)服務(wù)器上部署自己的服務(wù),然后通過消息中間件完成調(diào)度任務(wù)。對(duì)亍分步式的多個(gè)
Hadoop集群系統(tǒng)的協(xié)作,同樣可以用這種架構(gòu)來做只要把消息中間件引擎換成支持分步式的消息中間件的引擎就行了。
本文樓主將使用zookeeper做為分步式消息中間件構(gòu)造一個(gè)大型超市的部分?jǐn)?shù)據(jù)計(jì)算模型來完成各個(gè)區(qū)域利潤(rùn)計(jì)算的業(yè)務(wù)需求。
由于采購(gòu)和銷售分別是由不同廠商進(jìn)行的軟件開發(fā)和維護(hù),而且業(yè)務(wù)往來也在不同的城市和地區(qū)。 所以在每月底結(jié)算時(shí),工作量都特別大。 比如,計(jì)算利潤(rùn)表: 當(dāng)月利潤(rùn) = 當(dāng)月銷售金額 - 當(dāng)月采購(gòu)
額 - 當(dāng)月其他支出(樓主只是粗略計(jì)算)。如果采購(gòu)系統(tǒng)是單獨(dú)的系統(tǒng),銷售是另外單獨(dú)的系統(tǒng),及以其他幾十個(gè)大大小小的系統(tǒng), 如何能讓多個(gè)系統(tǒng),配合起來完成該需求?
二、系統(tǒng)構(gòu)思
樓主基于zookeeper來構(gòu)建一個(gè)分步式隊(duì)列的應(yīng)用,來解決上面的功能需求。排除了ESB的部分,只保留zookeeper進(jìn)行實(shí)現(xiàn)。
采購(gòu)數(shù)據(jù):海量數(shù)據(jù),基于Hadoop存儲(chǔ)和分析(樓主環(huán)境有限,只使用了很少的數(shù)據(jù))
銷售數(shù)據(jù):海量數(shù)據(jù),基于Hadoop存儲(chǔ)和分析(樓主環(huán)境有限,只使用了很少的數(shù)據(jù))
其他費(fèi)用支出:為少量數(shù)據(jù),基于文件或數(shù)據(jù)庫存儲(chǔ)和分析
我們?cè)O(shè)計(jì)一個(gè)同步隊(duì)列,這個(gè)隊(duì)列有3個(gè)條件節(jié)點(diǎn),分別對(duì)應(yīng)采購(gòu)(purchase),銷售 (sell),其他費(fèi)用(other)3個(gè)部分。當(dāng)3個(gè)節(jié)點(diǎn)都被創(chuàng)建后,程序會(huì)自動(dòng)觸發(fā)計(jì)算利潤(rùn), 幵創(chuàng)建利潤(rùn)(profit)節(jié)點(diǎn)。上面3個(gè)節(jié)點(diǎn)的創(chuàng)建,無順序要求。每個(gè)節(jié)點(diǎn)只能被創(chuàng)建一次 。
Hadoop mapreduce1,Hadoop mapreduce2 是2個(gè)獨(dú)立的Hadoop集群應(yīng)用。 Java App 是2個(gè)獨(dú)立的Java應(yīng)用 。ZooKeeper集群的有3個(gè)節(jié)點(diǎn) 。
/queue,是znode的隊(duì)列目錄,假設(shè)隊(duì)列長(zhǎng)度為3
/queue/purchase,是znode隊(duì)列中,1號(hào)排對(duì)者,由Hadoop mapreduce1提交,用于統(tǒng)計(jì)采購(gòu)金額
/queue/sell,是znode隊(duì)列中,2號(hào)排對(duì)者,由Hadoop mapreduce2提交,用于統(tǒng)計(jì)銷售金額
/queue/other,是znode隊(duì)列中,3號(hào)排對(duì)者,由Java App提交,用于統(tǒng)計(jì)其他費(fèi)用支出金額
/queue/profit,當(dāng)znode隊(duì)列中滿了,觸發(fā)創(chuàng)建利潤(rùn)節(jié)點(diǎn)。
當(dāng)/qeueu/profit被創(chuàng)建后,利潤(rùn)java app被啟動(dòng),所有zookeeper的連接通知同步程序(紅色線),隊(duì)列已完成,所有程序結(jié)束。