原创文章,欢迎转载,转载请注明出处:http://blog.csdn.net/jmppok/article/details/16840231
参考1:
参考2:
参考3:
在Strom中使用C++开发Bolt总结
参考4:
Storm DRPC 使用
方法:
1)根据[参考2]介绍,实现C++的Bolt; 其中storm.h 和 storm.cpp可从其中下载。JsonCPP可从官方下载编译。这里提供一个编译好的:jsoncpp 0.6.0rc2 代码+ubuntu下gcc编译结果
SplitSentence.h修改后的代码
#ifndef SPLIT_SENTENCE_H #define SPLIT_SENTENCE_H #include <string> #include <vector> #include "Storm.h" #include "json/json.h" using namespace std; namespace storm { class SplitSentence : public BasicBolt { public: void Initialize(Json::Value conf, Json::Value context) { } void Process(Tuple &tuple) { // first is args std::string s = tuple.GetValues()[0].asString(); s+="-------------"; Json::Value j_token; j_token.append(s); j_token.append(tuple.GetValues()[1].asString()); Tuple t(j_token); Emit(t); } }; } #endif
#include <iostream> #include <stdexcept> #include "SplitSentence.h" using namespace storm; using namespace std; int main(int argc, char *argv[]) { SplitSentence b; b.Run(); return 0; }
编译生成 my_app:
g++ -o my_app Test.cpp Storm.cpp -I ../../jsoncpp/jsoncpp/include -L ../../jsoncpp/jsoncpp/libs/linux-gcc-4.6/ -ljson_linux-gcc-4.6_libmt
需要注意Storm.h和Storm.cpp 以及Jsoncpp的位置。
编译完成后将其拷贝到Java工程的resources目录下,如果有依赖的动态库,同样考过去。保证在运行my_app时能够找到所有的依赖库。
2) 实现Java的壳,CppBolt.java
package drpc; import java.util.HashMap; import java.util.Map; import backtype.storm.task.ShellBolt; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseBasicBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; public class CppBolt extends ShellBolt implements IRichBolt/* implements IBasicBolt */{ public CppBolt() { super("/bin/sh","start.sh"); } public void prepare(Map conf, TopologyContext context) { } /* public void execute(Tuple tuple, BasicOutputCollector collector) { String input = tuple.getString(1); collector.emit(new Values(tuple.getValue(0), input + " @ " + getLocalIP()+":"+getPid()+":"+getThreadId())); } */ public void cleanup() { } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("word", "result")); } @Override public Map<String, Object> getComponentConfiguration() { // TODO Auto-generated method stub return null; } }
注意在CppBolt构造函数中需要使用sh进行中转,不能直接运行my_app,(会没有权限),见[参考3]中的说明。
3)创建Topology
TopologyBuilder builder = new TopologyBuilder(); DRPCSpout drpcSpout = new DRPCSpout("drpc-query"); builder.setSpout("drpc-input", drpcSpout,5); //我们的CPPBolt builder.setBolt("cpp", new CppBolt(), 5) .noneGrouping("drpc-input"); builder.setBolt("return", new ReturnResults(),5) .noneGrouping("cpp"); Config conf = new Config(); conf.setDebug(false); conf.setMaxTaskParallelism(3); try { StormSubmitter.submitTopology("drpc-q", conf,builder.createTopology()); } catch (Exception e) { e.printStackTrace(); }
4.将所有程序打包成一个jar包。
5.通过storm jar提交到storm Cluster中;
需要注意drpc server的配置问题,并启动之。见[参考4]
6.客户端访问,见[参考4]