Storm常见模式4——批处理

转载 2015年11月18日 19:54:08

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;
    }
}
复制代码
转载: http://www.cnblogs.com/panfeng412/archive/2012/06/19/storm-common-patterns-of-batching.html

Storm常见模式——批处理

消息流是storm里面的最关键的抽象。一个消息流是一个没有边界的tuple序列, 而这些tuples会被以一种分布式的方式并行地创建和处理。 对消息流的定义主要是对消息流里面的tuple的定义, ...
  • waysoflife
  • waysoflife
  • 2015年03月24日 17:52
  • 999

Storm常见模式——批处理

Storm对流数据进行实时处理时,一种常见场景是批量一起处理一定数量的tuple元组,而不是每接收一个tuple就立刻处理一个tuple,这样可能是性能的考虑,或者是具体业务的需要。 例如,批量查询...
  • luyee2010
  • luyee2010
  • 2013年03月01日 03:02
  • 824

Storm常见模式——批处理

Storm对流数据进行实时处理时,一种常见场景是批量一起处理一定数量的tuple元组,而不是每接收一个tuple就立刻处理一个tuple,这样可能是性能的考虑,或者是具体业务的需要。 例如,批量...
  • joeyon
  • joeyon
  • 2015年01月20日 11:28
  • 362

storm批处理事物原理

对于容错机制,storm通过一个系统级别的组件acker,结合xor校验机制判断一个tuple是否发送成功,进而spout可以重发该tuple,保证一个tuple在出错的情况下至少被重发一次。 但是...
  • zengxiaosen
  • zengxiaosen
  • 2016年10月08日 19:31
  • 1252

Storm常见模式——批处理<转>

转自:http://www.cnblogs.com/panfeng412/archive/2012/06/19/storm-common-patterns-of-batching.html St...
  • yongjian_luo
  • yongjian_luo
  • 2014年01月09日 17:40
  • 448

Trident Storm 批处理流…

本文继《Strom 流计算编程模型》之后继续介绍Storm上层高级批处理抽象Trident。 (五)高级抽象 1、Trident State Storm是对实时流计算的分布式处理框架,在对Strea...
  • shanelisy
  • shanelisy
  • 2016年01月09日 15:52
  • 591

Twitter Storm: storm的一些常见模式

Twitter Storm: storm的一些常见模式 发表于 2011 年 10 月 07 日 由 xumingming 作者: xumingming | 可以转载, 但必须以超...
  • mengfeiyang123456
  • mengfeiyang123456
  • 2013年12月20日 10:24
  • 323

storm, kafka集成之本地开发、测试

转自:http://blog.csdn.net/xeseo/article/details/18615761 有删改 A. 使用KafkaSpout 一个KafkaSpout只能去处理一个topi...
  • ItDose
  • ItDose
  • 2016年03月24日 16:44
  • 682

实时计算框架Storm本地模式搭建

安装依赖 通过ubuntu自带的软件包管理器安装java环境。 安装Java: $ sudo apt-get install openjdk-7-jdk 检查是否安装完成: ...
  • wwd0501
  • wwd0501
  • 2016年12月14日 11:00
  • 1013

Storm滑动窗口实现批量计算

storm是一个流式处理框架,可以做到Spout产生一条数据,Bolt处理一条以达到实时计算。 这种模式并不是实际的业务需要的,我们更多是需要 最近5分钟的PV UV ,最近10分钟的网络最大延迟,...
  • sawen21
  • sawen21
  • 2015年03月31日 18:38
  • 3001
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Storm常见模式4——批处理
举报原因:
原因补充:

(最多只允许输入30个字)