Storm 从入门到精通 第二十讲 Storm DRPC 简单示例

这里简单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 nimbus &
启动 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以上版本


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值