Storm 中 Clojure 的 Prepare Bolt 实现

生成对抗
• 阅读 3138

[原文地址:http://xcoder.in/2014/08/04/storm-clojure-prepare-bolt/]

起因

  Storm 中的 Bolt 都是通过 Nimbus 这个服务将序列化好的 Bolt 断章取义地发到各个 worker 中。所以,任何在 bolt 之外你自认为加载期间初始化计算好的上下文环境并不会被打包上去,Java 我不懂也不知道,但是至少在 Clojure 这个类的概念被淡化的 LIST 方言中,你要做的就是把所有跟 bolt 初始化计算相关的代码放到其 prepare 的代码当中去。

  你想一下,当你在文件加载的时候初始化了一个 MongoDB 链接,这个链接总不能被序列化到远程去吧?所以说办法就是把 bolt 搞上去之后,bolt 自动去初始化一个链接——这就是 prepare 的作用了。

  说白了,这个还是我们在 Suwako 当中踩到的坑。

做法

  大致的骨架如下:

(defbolt bolt [...] {:prepare true}
 [...]
 (let [...]
  (bolt
   (prepare [...]
    (...))
   (execute [tuple]
    (...))))

  首先就是 {:prepare true} 代表了它是一个需要初始化的 Bolt。

  然后在 (bolt) 的作用域之内有两个 form——prepareexecute

  其中 prepare 就是你要初始化的语句了。举个例子,我们让这里面初始化一个 Monger,于是我们要在 let 里面定义一个用于链接的 atom {}

(defbolt bolt ["..."] {:prepare true}
 [conf context collector]
 (let [conn (atom {})
       db (atom {})]
   (bolt
    (prepare [conf context collector]
     (reset! conn (mg/connect ...))
     (reset! db (mg/get-db @conn ...)))
    (execute [tuple]
     (...)))))

  这样一来,当 Bolt 被 Nimbus 打包传到各个 worker 之后,Bolt 执行起来的时候会自动执行 prepare 当中的代码,即初始化 MongoDB 的链接,并且将其赋值给 conndb 两个 atom。

  那么,我们就能在本体 execute 当中使用 @conn@db 来使唤 MongoDB 了。

思考

  可能很多人不解,不是说尽量保持 LISP 语系当中值的不变性的么?

  其实不变性只是为了提高程序在运行时的效率——而事实上是,上面那段代码并没有在运行时去做变量。

  虽然说这么说有点牵强,但是的确就是这个意思——因为我们是在程序执行真正有用的好逻辑的时候没有去改变一些值,相反只是在 Bolt 启动的时候做一些变量的操作。

  换句话说,虽然严谨的讲那个时候是算运行时,但是在运行时里面我们却可以把它归类为预处理——这一类东西反正程序还没真正开始跑有用的东西,效率慢一点无所谓,而且就初始化这么屁大点事儿能有多少影响?

  效率和效果之间权衡上面的还是要仁者见仁智者见智了。

小结

  本以为 Suwako 终于可以暂时告一段落了,紧要关头居然还是阻塞了。

  说多都是泪,不说了,找 Bug 去了。

Storm 中 Clojure 的 Prepare Bolt 实现

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Apache Kafka
ApacheKafka教程之与Storm集成http://blogxinxiucan.sh1.newtouch.com/原文地址:http://blogxinxiucan.sh1.newtouch.com/2017/07/13/ApacheKafka与Storm集成/(htt
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
Storm VS Flink ——性能对比
!(https://oscimg.oschina.net/oscnet/2cec00eb2dccf5fdec8def77207da253a86.jpg)1.背景ApacheFlink和ApacheStorm是当前业界广泛使用的两个分布式实时计算框架。其中ApacheStorm(以下简称“Storm”)在美团点评实时
Stella981 Stella981
3年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w
Easter79 Easter79
3年前
Trident学习笔记(一)
1\.Trident入门Trident\ 三叉戟 storm高级抽象,支持有状态流处理; 好处是确保消费被处理一次; 以小批次方式处理输入流,得到精准一次性处理 ; 不再使用bolt,使用functions、aggreates、filters以及states。 TridentT
Easter79 Easter79
3年前
Storm 性能优化
原文地址:https://www.jianshu.com/p/f645eb7944b0目录1.场景假设2.调优步骤和方法3.Storm的部分特性4.Storm并行度5.Storm消息机制6.StormUI解析7.性能优化场景假设在介绍Storm的
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(