1.概述
經過前面Kafka實戰系列的學習,我們通過學習《Kafka實戰-入門》瞭解Kafka的應用場景和基本原理,《Kafka實戰-Kafka Cluster》一文給大家分享了Kafka叢集的搭建部署,讓大家掌握了叢集的搭建步驟,《Kafka實戰-實時日誌統計流程》一文給大家講解一個專案(或者說是系統)的整體流程,《Kafka實戰-Flume到Kafka》一文給大家介紹了Kafka的資料生產過程,《Kafka實戰-Kafka到Storm》一文給大家介紹了Kafka的資料消費,通過Storm來實時計算處理。今天進入Kafka實戰的最後一個環節,那就是Kafka實戰的結果的資料持久化。下面是今天要分享的內容目錄:
- 結果持久化
- 實現過程
- 結果預覽
下面開始今天的分享內容。
2.結果持久化
一般,我們在進行實時計算,將結果統計處理後,需要將結果進行輸出,供前端工程師去展示我們統計的結果(所說的報表)。結果的儲存,這裡我們選擇的是Redis+MySQL進行儲存,下面用一張圖來展示這個持久化的流程,如下圖所示:
從途中可以看出,實時計算的部分由Storm叢集去完成,然後將計算的結果輸出到Redis和MySQL庫中進行持久化,給前端展示提供資料來源。接下來,我給大家介紹如何實現這部分流程。
3.實現過程
首先,我們去實現Storm的計算結果輸出到Redis庫中,程式碼如下所示:
package cn.hadoop.hdfs.storm; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import redis.clients.jedis.Jedis; import cn.hadoop.hdfs.util.JedisFactory; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Tuple; /** * @Date Jun 10, 2015 * * @Author dengjie * * @Note Calc WordsCount eg. */ public class WordsCounterBlots implements IRichBolt { /** * */ private static final long serialVersionUID = -619395076356762569L; OutputCollector collector; Map<String, Integer> counter; @SuppressWarnings("rawtypes") public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { this.collector = collector; this.counter = new HashMap<String, Integer>(); } public void execute(Tuple input) { String word = input.getString(0); Integer integer = this.counter.get(word); if (integer != null) { integer += 1; this.counter.put(word, integer); } else { this.counter.put(word, 1); } for (Entry<String, Integer> entry : this.counter.entrySet()) { // write result to redis Jedis jedis = JedisFactory.getJedisInstance("real-time"); jedis.set(entry.getKey(), entry.getValue().toString()); // write result to mysql // ... } this.collector.ack(input); } public void cleanup() { // TODO Auto-generated method stub } public void declareOutputFields(OutputFieldsDeclarer declarer) { // TODO Auto-generated method stub } public Map<String, Object> getComponentConfiguration() { // TODO Auto-generated method stub return null; } }
注:這裡關於輸出到MySQL就不贅述了,大家可以按需處理即可。
4.結果預覽
在實現持久化到Redis的程式碼實現後,接下來,我們通過提交Storm作業,來觀察是否將計算後的結果持久化到了Redis叢集中。結果如下圖所示:
通過Redis的Client來瀏覽儲存的Key值,可以觀察統計的結果持久化到來Redis中。
5.總結
我們在提交作業到Storm叢集的時候需要觀察作業執行狀況,有可能會出現異常,我們可以通過Storm UI介面來觀察,會有提示異常資訊的詳細描述。若是出錯,大家可以通過Storm UI的錯誤資訊和Log日誌列印的錯誤資訊來定位出原因,從而找到對應的解決辦法。
6.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!