一、前言
針對大叔據(jù)實時處理的入門,除了使用WordCount示例之外,還需要相對更深入點的示例來理解Storm,因此,本篇博文利用Storm實現(xiàn)了頻繁項集挖掘的案例,以方便更好的入門Storm。
二、基礎知識
2.1 頻繁二項集挖掘
如顧客去超市購物時,牙膏和牙刷基本上都是擺放在一起,因為購買牙膏時,很有可能會購買牙刷。另外,“啤酒與尿布”的案例則是對訂單進行分析挖掘后發(fā)現(xiàn)的規(guī)律,將啤酒和尿布一起擺放會促進啤酒的銷量。
2.2 算法設計
本示例中不考慮太復雜的挖掘算法,只考慮將兩個商品組合后的挖掘,設計如下
· 將每筆訂單的商品按照兩兩分組。
· 將每個分組的頻度進行統(tǒng)計(不考慮商品的次序)。
· 根據(jù)頻度計算支持度(每個組合出現(xiàn)的頻率越高,更有可能是頻繁組合)和置信度(商品組合出現(xiàn)的置信程度)。
· 設置支持度和置信度閾值,過濾不達標的數(shù)據(jù)。
2.3 Storm設計思路
· 使用Redis作為存儲訂單數(shù)據(jù)的數(shù)據(jù)庫。
· 使用Spout從Redis中讀取訂單數(shù)據(jù)。
· 使用Bolt計算分組頻度。
· 使用Bolt計算支持度和置信度。
· 使用Bolt篩選結果并存儲到Redis中。
2.4 拓撲結構圖
根據(jù)程序思路設計如下所示的拓撲結構,其組件在之后進行介紹。
三、設計實現(xiàn)
3.1 實現(xiàn)步驟
1. 產(chǎn)生訂單數(shù)據(jù)
通過模擬程序產(chǎn)生訂單數(shù)據(jù),并存儲Redis中,即使用OrderGenerator來生成訂單數(shù)據(jù)并存入Redis中,每個訂單有四種不同商品及其數(shù)量組成。
2. 接入訂單數(shù)據(jù)
通過OrderSpout讀取Redis中的訂單數(shù)據(jù),以供拓撲結構下游的Bolt使用。
3. 對訂單中商品進行分組
通過SplitBolt對訂單中的商品進行分組,兩兩分組并構建商品對,發(fā)送元組至下游Bolt。
4. 統(tǒng)計商品對總數(shù)
使用PairTotalCountBolt對所有商品對數(shù)量進行統(tǒng)計(用于計算支持度),并發(fā)送元組至下游Bolt。
5. 統(tǒng)計商品對及其出現(xiàn)次數(shù)
使用PairCountBolt對商品對出現(xiàn)的次數(shù)進行統(tǒng)計,并發(fā)送元組至下游Bolt。
6. 計算商品對支持度
使用SupportComputeBolt對商品對的支持度進行計算,并發(fā)送元組至下游Bolt。
7. 計算商品對置信度
使用ConfidenceComputeBolt對商品對的置信度進行計算,并發(fā)送元組至下游Bolt。
8. 過濾符合條件的商品對
使用FilterBolt對符合條件的商品對進行過濾并存入redis,并發(fā)送元組至下游Bolt。
3.1 源碼分析
下面給出拓撲結構中的各組件的源碼并進行分析。
1. OrderSpout
OrderSpout
說明:OrderSpout會從redis中讀取訂單數(shù)據(jù),并遍歷訂單中每個商品并發(fā)射,同時會統(tǒng)計商品數(shù)據(jù)并存入redis。
2. CommandSpout
CommandSpout
說明:下游Bolt根據(jù)其發(fā)射的元組信息來統(tǒng)計支持度和置信度,其每5秒發(fā)射一次統(tǒng)計信號。
3. SplitBolt
SplitBolt
說明:其將每個訂單的兩兩商品進行組合,然后發(fā)射。
4. PairTotalCountBolt
PairTotalCountBolt
說明:其用于統(tǒng)計所有商品對的數(shù)量(用于后面支持度的計算)。
5. PairCountBolt
PairCountBolt
說明:其用于統(tǒng)計每個商品對出現(xiàn)的次數(shù),然后發(fā)射。
6. SupportComputeBolt
SupportComputeBolt
說明:計算每個商品對的支持度,并且發(fā)射支持度。
7. ConfidenceComputeBolt
View Code
說明:計算商品對的置信度,并且發(fā)射置信度。
8. FilterBolt
FilterBolt
說明:判斷支持度和置信度是否超過了閾值,若超過則需要存入redis,否則,從redis中刪除。
四、程序運行
4.1. 環(huán)境依賴
打開redis服務器、客戶端(方便觀看結果)和zookeeper。
4.2. 寫入訂單數(shù)據(jù)
運行OrderGenerator,生成并寫入訂單數(shù)據(jù),通過redis查看,結果如下
表示已經(jīng)成功寫入了訂單數(shù)據(jù)。
4.3. 運行任務拓撲
運行OrderTopology,其會根據(jù)訂單中的商品數(shù)據(jù),生成并寫入推薦商品對,通過redis查看,結果如下
可以看到運行完成后,已經(jīng)成功生成了推薦商品方案。
五、總結
通過本篇Storm案例的學習,對于Storm的編程有了更深入的認識,同時,本項目的源代碼已經(jīng)上傳至github,歡迎star,謝謝各位園友的觀看~
參考鏈接:http://www.jikexueyuan.com/course/1437.html
PS:如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”,將會是我不竭的動力!
作者:leesf 掌控之中,才會成功;掌控之外,注定失敗。
出處:http://www.cnblogs.com/leesf456/
本文版權歸作者和博客園共有,歡迎轉載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
http://www.cnblogs.com/leesf456/p/7161995.html