第一種設(shè)計缺點:一次只處理一個tuple荣恐,對數(shù)據(jù)庫的大量調(diào)用液斜,并且沒有利用到storm的并行計算能力
第二種設(shè)計缺點:雖然使用了batch一次處理多個tuple,但仍舊沒有利用到storm的并行計算能力
第三種設(shè)計很好地解決了這些問題
處理并行的方式是:transaction分為process和commit叠穆,可以有無數(shù)個process同時進行少漆,但每次只能有一個commit在執(zhí)行
MemoryTransactionalSpout spout = new MemoryTransactionalSpout(DATA, new Fields("word"), PARTITION_TAKE_PER_BATCH);
TransactionalTopologyBuilder builder = new TransactionalTopologyBuilder("global-count", "spout", spout, 3);
builder.setBolt("partial-count", new BatchCount(), 5)
.shuffleGrouping("spout");
builder.setBolt("sum", new UpdateGlobalCount())
.globalGrouping("partial-count");
TransactionalTopologyBuilder構(gòu)造器中接受如下的參數(shù):
一個transaction topology的id
spout在整個topology里面的id。
一個transactional spout硼被。
一個可選的這個transactional spout的并行度示损。
topology的id是用來在zookeeper里面保存這個topology的當(dāng)前進度狀態(tài)的,所以如果你重啟這個topology嚷硫, 它可以接著前面的進度繼續(xù)執(zhí)行检访。
一個transaction topology里面有一個唯一的TransactionalSpout, 這個spout是通過TransactionalTopologyBuilder的構(gòu)造函數(shù)來指定的。在這個例子里面仔掸,MemoryTransactionalSpout被用來從一個內(nèi)存變量里面讀取數(shù)據(jù)(DATA)脆贵。第二個參數(shù)指定spout發(fā)送的tuple的字段, 第三個參數(shù)指定每個batch的最大tuple數(shù)量起暮。關(guān)于如何自定義TransactionalSpout我們會在后面介紹卖氨。
現(xiàn)在說說 bolts。這個topology并行地計算tuple的總數(shù)量鞋怀。第一個bolt:BatchBolt双泪,隨機地把輸入tuple分給各個task持搜,然后各個task各自統(tǒng)計局部數(shù)量密似。第二個bolt:UpdateGlobalCount, 用全局grouping來匯總這個batch中tuple的數(shù)量,然后再更新到數(shù)據(jù)庫里面的全局?jǐn)?shù)量葫盼。
轉(zhuǎn)自http://www.flyne.org/article/190