原创文章,欢迎转载,转载请注明出处: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
#include
#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
#include
#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 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]