Storm常見模式——批處理

來源:互聯網
上載者:User

Storm對流資料進行即時處理時,一種常見情境是批量一起處理一定數量的tuple元組,而不是每接收一個tuple就立刻處理一個tuple,這樣可能是效能的考慮,或者是具體業務的需要。

例如,批量查詢或者更新資料庫,如果每一條tuple產生一條sql執行一次資料庫操作,資料量大的時候,效率會比批量處理的低很多,影響系統輸送量。

當然,如果要使用Storm的可靠資料處理機制的話,應該使用容器將這些tuple的引用緩衝到記憶體中,直到批量處理的時候,ack這些tuple。

下面給出一個簡單的程式碼範例:

現在,假設我們已經有了一個DBManager資料庫操作介面類,它至少有兩個介面:

(1)getConnection(): 返回一個java.sql.Connection對象;

(2)getSQL(Tuple tuple): 根據tuple元組產生資料庫動作陳述式。

為了在Bolt中緩衝一定數量的tuple,構造Bolt時傳遞int n參數賦給Bolt的成員變數int count,指定每個n條tuple批量處理一次。

同時,為了在記憶體中緩衝緩衝Tuple,使用java concurrent中的ConcurrentLinkedQueue來儲存tuple,每當攢夠count條tuple,就觸發批量處理。

另外,考慮到資料量小(如很長時間內都沒有攢夠count條tuple)或者count條數設定過大時,因此,Bolt中加入了一個定時器,保證最多每個1秒鐘進行一次批量處理tuple。

下面是Bolt的完整代碼(僅供參考):

import java.util.Map;import java.util.Queue;import java.util.concurrent.ConcurrentLinkedQueue;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;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;public class BatchingBolt implements IRichBolt {    private static final long serialVersionUID = 1L;    private OutputCollector collector;    private Queue<Tuple> tupleQueue = new ConcurrentLinkedQueue<Tuple>();    private int count;    private long lastTime;    private Connection conn;    public BatchingBolt(int n) {        count = n; //批量處理的Tuple記錄條數        conn = DBManger.getConnection(); //通過DBManager擷取資料庫連接        lastTime = System.currentTimeMillis(); //上次批量處理的時間戳記    }    @Override    public void prepare(Map stormConf, TopologyContext context,            OutputCollector collector) {        this.collector = collector;    }    @Override    public void execute(Tuple tuple) {        tupleQueue.add(tuple);        long currentTime = System.currentTimeMillis();        // 每count條tuple批量提交一次,或者每個1秒鐘提交一次        if (tupleQueue.size() >= count || currentTime >= lastTime + 1000) {            Statement stmt = conn.createStatement();            conn.setAutoCommit(false);            for (int i = 0; i < count; i++) {                Tuple tup = (Tuple) tupleQueue.poll();                String sql = DBManager.getSQL(tup); //產生sql語句                stmt.addBatch(sql); //加入sql                collector.ack(tup); //進行ack            }            stmt.executeBatch(); //批量提交sql            conn.commit();            conn.setAutoCommit(true);            System.out.println("batch insert data into database, total records: " + count);            lastTime = currentTime;        }    }    @Override    public void cleanup() {    }    @Override    public void declareOutputFields(OutputFieldsDeclarer declarer) {    }    @Override    public Map<String, Object> getComponentConfiguration() {        // TODO Auto-generated method stub        return null;    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.