转载请注明出处:http://blog.csdn.net/lonelytrooper/article/details/9964425
LocalCluster versus StormSubmitter
到目前为止,你使用了叫做LocalCluster的设施来在你本地的电脑中运行topology。在你的电脑里运行storm的基础设施使你可以方便的运行和调试不同的topologies。但是当你想提交你的topology到一个正在运行的storm集群时怎么样呢?storm的一个有趣的特点是提交你的topology到一个实际的集群中运行是很容易的。你需要将LocalCluster修改为StormCommitter并且执行submitTopology方法,这个方法负责将topology提交到集群。
你可以看到下边代码的改变:
//LocalCluster cluster = new LocalCluster();
//cluster.submitTopology("Count-Word-Topology-With-Refresh-Cache",conf,
builder.createTopology());
StormSubmitter.submitTopology("Count-Word-Topology-With-Refresh-Cache",conf,
builder.createTopology());
//Thread.sleep(1000);
//cluster.shutdown();
当你使用StormSubmitter时,你不能像你使用LocalCluster那样通过代码控制集群。
接下来,把资源打包成一个jar,它将在你运行storm客户端命令提交topology时被发送。因为你使用maven,你唯一需要做的一件事是到源文件目录下,然后运行下边的命令:
mvn package
一旦你有了创建好的jar,使用storm jar命令来提交topology(在附录A中你会知道怎样安装storm客户端)。语法是storm jar allmycode.jar org.me.MyTopology arg1arg2 arg3。
这个示例中,在topologies的源工程文件夹运行:
storm jartarget/Topologies-0.0.1-SNAPSHOT.jar countword.TopologyMain src/main/
resources/words.txt
用这些命令,你可以提交topology到集群。
要停止/杀掉它,运行:
storm killCount-Word-Topology-With-Refresh-Cache
topology的名字必须是唯一的。
要安装storm客户端,见附录A。
DPRC Topologies
有一种特殊类型的topology被称为是分布式远程过程调用(DRPC),它通过storm分布式的能力来执行远程过程调用(RPC)(见图3-1)。Storm提供了一些工具来激活DRPC的使用。第一个是一个在客户端和storm topology之间作为连接器运行的DRPC服务器,作为topology spouts的源。它接收一个函数和它的参数来执行。然后对于函数操作的每个数据片,该服务器指定一个在topology中使用的请求ID来识别RPC请求。当topology执行最后一个bolt时,它必须发射RPC的请求ID和结果,这使得DRPC服务器可以返回结果至正确的客户端。
一个单独的DRPC服务器可以执行很多函数。每个函数可以由一个唯一的标识符识别。
Storm提供的第二个工具是LinearDRPCTopologyBuilder(在示例中使用的),一个来帮助构建DRPCtopologies的抽象。构建的topology创建DRPCSpouts---它连接DRPC服务器并且发送数据到topology的剩余部分---topology还包装bolts,这使得结果可以从最后一个bolt返回。所有添加到LinearDRPCTopologyBuilder上的bolts被顺序执行。
作为这种类型topology的一个示例,你可以创建一个累加数的处理过程。这只是一个简单的示例,但是可以继承这个概念来执行复杂的分布式数学操作。
图3-1 DRPC topology模式
Bolt有如下的输出声明:
public voiddeclareOutputFields(OutputFieldsDeclarerdeclarer) {
declarer.declare(newFields("id","result"));
}
因为这是topology中唯一的bolt,它必须发射RPC ID和结果。
execute方法负责执行增加的操作:
public voidexecute(Tuple input) {
String[]numbers= input.getString(1).split("\\+");
Integer added =0;
if(numbers.length<2){
throw new InvalidParameterException("Shouldbe at least 2 numbers");
}
for(String num:numbers){
added +=Integer.parseInt(num);
}
collector.emit(newValues(input.getValue(0),added));
}
包含做累加的bolt的topology的定义如下:
public static voidmain(String[]args) {
LocalDRPC drpc =newLocalDRPC();
LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("add");
builder.addBolt(newAdderBolt(),2);
Config conf =newConfig();
conf.setDebug(true);
LocalCluster cluster =newLocalCluster();
cluster.submitTopology("drpc-adder-topology",conf,
builder.createLocalTopology(drpc));
String result =drpc.execute("add","1+-1");
checkResult(result,0);
result =drpc.execute("add","1+1+5+10");
checkResult(result,17);
cluster.shutdown();
drpc.shutdown();
}
创建LocalDRPC对象来在本地运行DRPC。接着,创建topology builder来添加bolt到topology。为了测试topology,在你的DRPC对象上使用execute方法。
为连接一个远程的DRPC服务器,需要使用DRPCClient类。DRPC服务器暴露一个可以被多种语言使用的Thrift API,并且在本地或远程运行DRPC服务器的API是一样的。为了提交topology到storm集群,使用builder对象的createRemoteTopology方法来代替createLocalTopology方法,该方法使用storm配置中的DRPC配置。