流式Window解析

参考:http://120.25.204.125/ProgrammingGuide_cn/AdvancedUsage/Window.html

在流式计算中我们经常需要以时间或者数据量将无界的数据划分成一份份有限的集合,然后以这个集合为维度进行操作。

1、你可以写定时任务,或者计数器,批量处理

2、使用window API

滚动窗口(Tumbling Window)

每个Tuple只能属于其中一个滚动窗口,一个Tuple不能同时是两个或者两个以上窗口的元素。比如下面我们以消息到达的时间来划分成一个个滚动窗口,窗口大小是5秒:

第一个窗口w1包含的是0~5th到达的数据,第二窗口w2包含的是5~10th秒到达的数据,第三个窗口包含的是10~15th秒到达的数据。每个窗口每隔5秒被计算,窗口和窗口直接没有重叠。

172345_cYio_2401742.png

滑动窗口(Sliding Window)

tuples被划分到一个个滑动窗口,窗口滑动的间隔是sliding interval。每个窗口间会有重叠,重叠部分的tuple可以先后属于前后两个窗口。比如下面我们以事件处理时间划分滑动窗口,窗口大小是10秒,滑动间隔是5秒:

第一个窗口w1包含的是0~10th到达的数据,第二窗口w2包含的是5~15th秒到达的数据。消息时间e3~e6都是窗口w1和w2的一部分。在15th秒时,窗口w2会被计算,这时候e1 e2的数据会会过期,会从队列中移除。

172402_9S2Q_2401742.png

Storm支持以时间、数量或者以两者混合的方式来定义窗口带下及窗口滑动间隔。

  • withWindow(Count windowLength, Count slidingInterval)
    滑窗 窗口长度:tuple数, 滑动间隔: tuple数
  • withWindow(Count windowLength)
    滑窗 窗口长度:tuple数, 滑动间隔: 每个tuple进来都滑
  • withWindow(Count windowLength, Duration slidingInterval)
    滑窗 窗口长度:tuple数, 滑动间隔: 时间间隔
  • withWindow(Duration windowLength, Duration slidingInterval)
    滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔
  • withWindow(Duration windowLength)
    滑窗 窗口长度:时间间隔, 滑动间隔: 每个tuple进来都滑
  • withWindow(Duration windowLength, Count slidingInterval)
    滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔
  • withTumblingWindow(BaseWindowedBolt.Count count)
    滚窗 窗口长度:Tuple数
  • withTumblingWindow(BaseWindowedBolt.Duration duration)
    滚窗 窗口长度:时间间隔
 builder.setSpout("spout", new RandomSentenceSpout(), 1);
     builder.setBolt("slidingwindowbolt",
                     new SlidingWindowBolt().withWindow(new Count(30), new Count(10)),
                     1).shuffleGrouping("spout");
public class SlidingWindowBolt extends BaseWindowedBolt {
    private OutputCollector collector;

    @Override
    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
        this.collector = collector;
    }

    @Override
    public void execute(TupleWindow inputWindow) {
      for(Tuple tuple: inputWindow.get()) {
        // do the windowing computation
        ...
      }
      // emit the results
      collector.emit(new Values(computedValue));
    }
}

 

转载于:https://my.oschina.net/chuibilong/blog/856478

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值