storm定时的三种方式及tick详解

查看数: 20169 | 评论数: 2 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-12-7 17:03

正文摘要:

问题导读 1.tick是什么功能? 2.如何指定某个bolt每隔一段时间做一些操作? 3.如何实现Topology中的每个bolt都每隔一段时间做一些操作? 背景: 我们知道在java中可以有最少3钟方式来实现定 ...

回复

Hentai 发表于 2016-12-13 16:20:44
楼主 请问一下 我有多个bolt,每个bolt我都重新了getComponentConfiguration方法,但是只有第一个bolt能定时执行,其他的下游bolt都不能定时,请问该怎么解决呢
yuwenge 发表于 2016-12-7 17:07:35
补充:
如何在storm应用中实现定时调度

在storm中实时定时调度, 较好的方式是利用spout的nextTuple()不断循环触发你的定时任务。

    首先, 把需要定时调度的逻辑用一个bolt实现,其execute方法的伪代码如下:

[mw_shl_code=bash,true] // 从topology的全局对象 backtype.storm.Config取得上次调度时间
    Date 上次调度时间 = config.get("上次调度时间");

    if ( 如果当前时间 - 上次调度时间 >= 调度间隔 ) {

        // 执行具体业务逻辑
        doTask();

        // 将本次执行时间存入全局对象 backtype.storm.Config
        config.put("上次调度时间", 当前时间);
    }[/mw_shl_code]

    然后, 定义一个专门的定时发送消息的spout,如以下每隔8秒发送一条消息:
[mw_shl_code=bash,true] @Override
    public void nextTuple() {
        try {
            Thread.sleep(8 * 1000);
            collector.emit(new Values("Let's go!"));
        } catch (Exception e) {
            log.error("", e);
        }
    }[/mw_shl_code]


这个spout发出的消息没有任何业务意义,只是为了触发上面的bolt。

补充说明,如果以上代码在执行 config.put() 时抛出异常 “storm Async loop died!” , 那就改为用redis保存最近一次的执行时间。


作者:
林中漫步  




关闭

推荐上一条 /2 下一条