这里简单Echo程序:
1. BasicDRPCTopology
package com.john.learn.storm.drpc.basic;
import java.util.Arrays;
import java.util.Scanner;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.LocalDRPC;
import org.apache.storm.StormSubmitter;
import org.apache.storm.drpc.DRPCSpout;
import org.apache.storm.drpc.LinearDRPCTopologyBuilder;
import org.apache.storm.drpc.ReturnResults;
import org.apache.storm.generated.AlreadyAliveException;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.InvalidTopologyException;
import org.apache.storm.shade.org.apache.commons.exec.util.StringUtils;
import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseBasicBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import clojure.main;
public class BasicDRPCTopology {
public static class EchoBolt extends BaseBasicBolt {
public void execute(Tuple tuple, BasicOutputCollector collector) {
// 你声明的第一个bolt会接收两维tuple,tuple的第一个field是request-id,第二个field是这个请求的参数
System.out.println("EchoBolt execute input " + tuple.getValue(0) + " Input val:" + tuple.getString(1));
collector.emit(new Values(tuple.getValue(0), "Hi " + tuple.getString(1)));
}
public void declareOutputFields(OutputFieldsDeclarer fieldsDeclarer) {
fieldsDeclarer.declare(new Fields("id", "result"));
}
private static final long serialVersionUID = 1L;
}
public static void main(String[] args)
throws AlreadyAliveException, InvalidTopologyException, AuthorizationException {
Config config = new Config();
config.setDebug(false);
config.setNumWorkers(1);
// DRPC Server Name
LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("Echo");
// 数据源Spout直接来此DRPCClient,不用指定Spout
builder.addBolt(new EchoBolt(), 3);
if (args == null || args.length == 0) {
LocalDRPC drpc = new LocalDRPC();
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("BasicDRPCTopology", config, builder.createLocalTopology(drpc));
Scanner scanner = new Scanner(System.in);
System.out.println("Please input a value:");
if (scanner.hasNextLine()) {
System.out.println("Response :" + drpc.execute("Echo", scanner.nextLine()));
}
// 便于找到Response log
System.exit(0);
drpc.shutdown();
cluster.shutdown();
return;
}
config.setNumWorkers(3);
// Server Mode
StormSubmitter.submitTopology("BasicDRPCTopology", config, builder.createRemoteTopology());
}
}
2. 本地模式的Local DRPC 运行
运行结果:
3。Client Server 运行
a. Deploy Server
远程模式的DRPC与本地模式的DRPC不同之处在于:
远程模式DRPC不需要模拟DRPC Server,而是通过在真实的Storm集群中配置DRPC Server来完成
远程模式通过调用builder的createRemoteTopology方法来构建topology。
在一个实际的集群中使用 DRPC 有以下三个步骤:
1. 配置并启动 DRPC 服务器;
2. 在集群的各个服务器上配置 DRPC 服务器的地址;
3. 将 DRPC 拓扑提交到集群运行。
可以像 Nimbus、Supervisor 那样使用 storm 命令来启动 DRPC 服务器
(注意,此 server 的基本配置,如 nimbus,ZooKeeper 等参数应该与 Storm 集群其他机器相同)
Nimbus、Supervisor 配置如下
vim / usr/local/apache-storm-0..2/conf/storm.yaml
drpc.servers:
- "drpc1.foo.com"
- "drpc2.foo.com"
启动 Storm supervisor &
启动 Storm ui &
在Nimbus Server 上启动 DRPC
启动 Storm drpc &
部署把相应的 Topology代码上传到stor服务器上
storm jar BasicDRPCTopology.jar com.john.learn.storm.drpc.basic.BasicDRPCTopology remote
b. Client 模式
package com.john.learn.storm.drpc.basic;
import java.util.Map;
import java.util.Scanner;
import org.apache.storm.Config;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.DRPCExecutionException;
import org.apache.storm.thrift.TException;
import org.apache.storm.thrift.transport.TTransportException;
import org.apache.storm.utils.DRPCClient;
import org.apache.storm.utils.Utils;
import clojure.main;
public class BasicDRPCTopologyClient {
public static void main(String[] args) throws DRPCExecutionException, AuthorizationException, TException {
// Config config = new Config(); 导致 Null 异常 1.1.0以上版本
Map<?, ?> config = Utils.readDefaultConfig();
DRPCClient drpcClient = new DRPCClient(config, "192.168.1.114", 3770);
Scanner scanner = new Scanner(System.in);
System.out.println("Please input a value:");
if (scanner.hasNextLine()) {
System.out.println("Response :" + drpcClient.execute("Echo", scanner.nextLine()));
}
drpcClient.close();
}
}
Config config = new Config(); 导致 Null 异常 1.1.0以上版本