Storm作为真正的实时流处理系统比spark的伪实时流更好。Storm用java开发很方便,但是除了支持java语言,还支持其他多种语言。
1.对于JVM语言比较简单, 直接提高DSL封装Java即可。
2.对于非JVM语言就稍微复杂一些, Storm分为两部分, topology和component(blot和spout):对于topology用其他语言实现比较easy, 因为nimbus是thrift 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, Python和Fancy版本, 如果需要支持其他的语言, 自己实现一下这个协议也应该很容易。其实component支持多语言比较必要, 因为很多分析或统计模块, 不一定是使用java,如果porting比较麻烦,不象topology那么简单.
Python版本的Bolt的定义, 和java版不同的是继承ShellBolt类。先将python版本的bolt类写成脚本,再到java中去建一个继承自ShellBolt的bolt来调用脚本就可以了。
下面是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====
每天进步一点点。。。
更多请关注