Kafka實戰-資料持久化

smartloli發表於2016-04-25

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.結束語

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

 

相關文章