[置顶] Storm DRPC 使用及访问C++ Bolt问题的解决方法


原创文章,欢迎转载,转载请注明出处:http://blog.csdn.net/jmppok/article/details/16840231


参考1:

storm下运行C++程序(一)

参考2:

Storm下运行C++(二)

参考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

Test.cpp代码

#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]

你可能感兴趣的:(C++,storm,分布式,drpc)