JStorm/Storm源码解读(二)--启动篇

为了在解读分析时有个统一的思路,本文将从启动一个集群开始分析。
(说明:为了测试方便,采用的是本地模式)。
1.参数设置

Config conf = new Config(); 
//设置Topology中workers的数量 
conf.setNumWorkers(4); 
//这意味着用于单元测试以防止元组在测试期间意外超时。 
conf.put(Config.TOPOLOGY_ENABLE_MESSAGE_TIMEOUTS, true); 
//最大超时时间 
conf.put(Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS , 10);

2.创建TopologyBuilder

TopologyBuilder builder = new TopologyBuilder();

3.设置TopologyBuilder

//3.1设置Spout 
//3.2设置Bolt(可能多个)

4.启动集群

启动集群 
//启动本地集群 
LocalCluster cluster = new LocalCluster(); 
//启动本地集群的细节: 
  public LocalCluster() { 
        synchronized (LocalCluster.class) { 
            //1.判断当前本地集群是否存在实例,如果存在则抛出异常,否则进行后面的处理 
            if (instance != null) { 
                throw new RuntimeException("LocalCluster should be single"); 
            } 
            //2.设置日志 
            setLogger(); 
            System.setProperty("java.net.preferIPv4Stack", "true"); 
            //3.调用prepareLocalCluster()方法对本地集群的启动环境做准备 
            this.state = LocalUtils.prepareLocalCluster(); 
            if (this.state == null) 
                throw new RuntimeException("prepareLocalCluster error"); 
                instance = this; 
        } 
    }

4.3.具体的准备如下:

public static LocalClusterMap prepareLocalCluster() { 
        LocalClusterMap state = new LocalClusterMap(); 
        try { 
            //1.创建缓存路径集合 
            List<String> tmpDirs = new ArrayList(); 
            //2.获取缓存路径 
            String zkDir = getTmpDir(); 
            tmpDirs.add(zkDir); 
            //3.启动本地Zookeepr 
            Factory zookeeper = startLocalZookeeper(zkDir); 
            //4.获取本地的配置文件 
            Map conf = getLocalConf(zookeeper.getZooKeeperServer().getClientPort()); 

            //获取(计算得到)nimbus的缓存路径 
            String nimbusDir = getTmpDir(); 
            tmpDirs.add(nimbusDir); 
            //5.进行深度拷贝得到nimbusConf配置文件 
            Map nimbusConf = deepCopyMap(conf); 
            //6.配置nimbus的缓存路径 
            nimbusConf.put(Config.STORM_LOCAL_DIR, nimbusDir); 
            //7.创建Nimbus服务 
            NimbusServer instance = new NimbusServer(); 
            //8.进行深拷贝得到supervisor的配置文件 
            Map supervisorConf = deepCopyMap(conf); 
            String supervisorDir = getTmpDir(); 
            tmpDirs.add(supervisorDir); 
            supervisorConf.put(Config.STORM_LOCAL_DIR, supervisorDir); 
            //9.创建Supervisor实例 
            Supervisor supervisor = new Supervisor(); 

            //IContext:该接口需要实现消息插件。消息插件通过Storm配置(storm.messaging.transport)指定参数。 消息传递插件应该有一个默认的构造函数和实现IContext界面。在构建之后, 
            我们将根据storm配置调用IContext::prepare(storm_conf)来启用上下文。 
            //10.获取消息插件 
            IContext context = getLocalContext(supervisorConf); 
            //11.设置本地集群中的Nimbus、Supervisor等主从节点以及zookeeper、消息插件等 
            state.setNimbusServer(instance); 
            state.setNimbus(instance.launcherLocalServer(nimbusConf, new DefaultInimbus())); 
            state.setZookeeper(zookeeper); 
            state.setConf(conf); 
            state.setTmpDir(tmpDirs); 
            state.setSupervisor(supervisor.mkSupervisor(supervisorConf, context)); 
            return state; 
        } catch (Exception e) { 
            LOG.error("prepare cluster error!", e); 
            state.clean(); 

        } 
        return null; 
    }

4.3.3启动本地Zookeeper的具体细节如下:

程序允许给35535个端口用来启动Zookeeper集群,从2000开始分配, 
 如果端口2000至端口65534全部被占用了,则会跑出无可用的端口来运行zookeeper的异常 
    private static Factory startLocalZookeeper(String tmpDir) { 
        for (int i = 2000; i < 65535; i++) { 
            try { 
                return Zookeeper.mkInprocessZookeeper(tmpDir, i); 
            } catch (Exception e) { 
                LOG.error("fail to launch zookeeper at port: " + i, e); 
            } 
        } 
        throw new RuntimeException("No port is available to launch an inprocess zookeeper.");   
  }

对于一个系统性的集群框架来说,启动该集群,必须为其配置相应的参数,比如workers数量,缓存地址等,
上述只是本地集群启动时的一小部分。剩下部分将在下一篇中讲述。


欢迎关注下面二维码进行技术交流:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑机接口社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值