Storm 多语言支持

Storm作为真正的实时流处理系统比spark的伪实时流更好。Storm用java开发很方便,但是除了支持java语言,还支持其他多种语言。

1.对于JVM语言比较简单, 直接提高DSL封装Java即可。

2.对于非JVM语言就稍微复杂一些, Storm分为两部分, topologycomponent(blotspout)

对于topology用其他语言实现比较easy, 因为nimbusthrift server, 所以什么语言最终都是都是转化为thrift结构.而且其实topology本身逻辑就比较简单, 直接用java写也行,没有太多的必要一定要使用其他的语言。

对于component, 采用的方案和Hadoop的一样,使用shell process来执行component, 并使用stdin, stdout作为component之间的通信 (json messages over stdin/stdout).
     
通信就涉及通信协议, 即每个component怎样产生别的component可以理解json message, storm的通信协议比较简单, 是一个只有100行的库,storm团队给这些库开发了对应的Ruby, PythonFancy版本, 如果需要支持其他的语言, 自己实现一下这个协议也应该很容易。其实component支持多语言比较必要, 因为很多分析或统计模块, 不一定是使用java,如果porting比较麻烦,不象topology那么简单.

Python版本的Bolt的定义, java版不同的是继承ShellBolt类。先将python版本的bolt类写成脚本,再到java中去建一个继承自ShellBoltbolt来调用脚本就可以了

下面是splitsentence.py的定义: 
import storm  //在python中, 首先import storm,其中封装了通信协议
class SplitSentenceBolt(storm.BasicBolt):
    def process(self, tup):
        words = tup.values[0].split(" ")
        for word in words:
          storm.emit([word])
SplitSentenceBolt().run()


下面是SplitSentence.java的定义: 
public static class SplitSentence extends ShellBolt implements IRichBolt {
    public SplitSentence() {
//直接将python splitsentence.py作为子进程来调用
        super("python", "splitsentence.py"); 
    } 
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("word"));
    }
}

 重点注意:应当把所有的脚本文件保存在storm工程目录下的一个名为multilang/resources的子目录中。这个子目录被包含在发送给worker进程的jar文件中。如果不把脚本包含在这个目录中,Storm就不能运行它们,并抛出一个错误。

====end====

每天进步一点点。。。

更多请关注

====end====
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值