原创文章,欢迎转载!
请注明原文地址:http://blog.csdn.net/jmppok/article/details/16827837
参考1:
参考2:
1.Storm简介
Storm是Twitter开源的一套并行处理系统,网站主页:https://github.com/nathanmarz/storm/wiki
其思想与Hadoop类似,但也与Hadoop有本质区别:Hadoop主要偏重批处理,Storm主要面向实时处理, 与Storm类似的系统还有Puma 、S4等。
2.为什么使用C++开发Storm Bolt
Storm的主要开发语言是Java,但由于其并行实时计算的特性,很多公司如Alee,baidu等都在使用。
但在实际使用过程中,经常会产生将现有的C++程序移植到Storm框架中的需求。
作者就有这样的需求。
3.现有C++开发Storm Bolt的资料及其问题和解决
从baidu、google等查找C++开发Storm向相关资料,基本没有,只有2篇:
(1). http://blog.csdn.net/yan_mount/article/details/11527799
作者分享了C++开发Storm的方法,但是代码太少了,也不完整,无法根据他的指导进行实际。不过值得一提的是里面有两点对我很有帮助:
a.super("/bin/sh","start.sh"); 在Java的壳中启动C++程序时,需要用脚本中转一下。因为C++程序在部署时,会打包到jar中,Storm框架解析出来后放置work的临时目录中;在该过程中C++程序会丢失可执行权限。所以需要用脚本启动。(C++程序和start.sh都放置java工程的resources目录下)
爱思考的小伙伴可能会想:那start.sh也会丢失可执行权限阿?
没错,所以我们启动的是/bin/sh ,然后将start.sh文件作为参数传给sh,这样就可以执行了。
start.sh内容如下:
chmod a+x c_app
./c_app
b.文章最后提出了问题:“
bolt程序会接收到非json格式的输入:
Shell msg: read_msg:[3][3][3][3][3][3]
造成程序僵死...” 本钓丝也遇到同样的问题,不过和他出现的情况不同(按照他的步骤开发的Bolt可以执行,在使用C++ Bolt + DRPC时 才出现相同的问题)
(2).http://demeter.inf.ed.ac.uk/cross/stormcpp.html
一个老外写的C++ Wrapper,封装了Storm.h和Storm.cpp,(需要使用Jsoncpp库),里面封装了BasicBolt和BasicSpout,只需要继承就可以了,
高手...
他的教程写的比较详细,但是细节上有些问题,比如:
a. what's it?
其实split_sentence就是你编译的C++程序。
b.按他的教程是没办法运行的,会出现前面说的没有权限的问题,按上面说的进行操作就OK了。
c.最重要原理他没说:就是要继承Storm.h实现一个Spout或Bolt,并写一个主程序,将Spout或Bolt run起来。
然后再Java的壳中调用该可执行程序(参考资料1)。
4. 后续问题:使用DRPC验证
综合以上两个资料就可以用C++开发Storm的插件了,在本地运行OK。
但是接下来可能就需要验证,或者说我怎么能访问这个实时处理服务呢?
这就是DRPC,还记不记得上面作者所的使用DRPC+ C++Bolt遇到了问题?
可参照:Storm DRPC 使用及访问C++ Bolt问题的解决方法http://blog.csdn.net/jmppok/article/details/16840231