文档章节

storm从入门到放弃教程(3)--初运行Topologies (拓扑)

j
 java_龙
发布于 2017/04/13 10:39
字数 1598
阅读 344
收藏 4

概述

上一篇【 基础概念详细介绍 】 博文连接:https://my.oschina.net/u/2342969/blog/874052

     本文将对Topologies (拓扑)进行详细的解释,此博文需要有一定storm基础,如需了解基础,请阅读上一篇博文,其中将会包含内容如下:

  1. TopologyBuilder
  2. 如何在生产集群运行一个拓扑
  3. 本地运行拓扑

主体

 简单使用

      TopologyBuilder为storm声明的拓扑暴露的java API,用于执行这个拓扑, 在java中可以使用此类构建拓扑。最终,拓扑们会是 Thrift  构造,由于 Thrift   很复杂,TopologyBuilder可以大大的简化创建拓扑,

生产环境例子如下:

 // 创建TopologyBuilder
    TopologyBuilder builder = new TopologyBuilder();
    // 为拓扑定义一个spout(最后一个参数是指定并行数,非必填)
    builder.setSpout("1", new TestWordSpout(true), 5);
    builder.setSpout("2", new TestWordSpout(true), 3);
    // 为拓扑定义一个bolt(最后一个参数是指定并行数,非必填)
    builder.setBolt("3", new TestWordCounter(), 3)
            //为bolt定义流分组
            .fieldsGrouping("1", new Fields("word"))
            .fieldsGrouping("2", new Fields("word"));
    builder.setBolt("4", new TestGlobalCount())
            .globalGrouping("1");

    Map conf = new HashMap();//为拓扑定义配置
    conf.put(Config.TOPOLOGY_WORKERS, 4); //为拓扑配置工作进程数
    
    //提交拓扑
    StormSubmitter.submitTopology("mytopology", conf, builder.createTopology());

本地例子如下:

 // 创建TopologyBuilder
    TopologyBuilder builder = new TopologyBuilder();
    // 为拓扑定义一个spout(最后一个参数是指定并行数,非必填)
    builder.setSpout("1", new TestWordSpout(true), 5);
    builder.setSpout("2", new TestWordSpout(true), 3);
    // 为拓扑定义一个bolt(最后一个参数是指定并行数,非必填)
    builder.setBolt("3", new TestWordCounter(), 3)
            //为bolt定义流分组
            .fieldsGrouping("1", new Fields("word"))
            .fieldsGrouping("2", new Fields("word"));
    builder.setBolt("4", new TestGlobalCount())
            .globalGrouping("1");

    Map conf = new HashMap();//为拓扑定义配置
    conf.put(Config.TOPOLOGY_WORKERS, 4); //为拓扑配置工作进程数
    conf.put(Config.TOPOLOGY_DEBUG, true);// 打开DEBUG模式
    LocalCluster cluster = new LocalCluster();// 创建本地集群(new 这个类即可)
    //向本地集群提交拓扑
    cluster.submitTopology("mytopology", conf, builder.createTopology());
    //线程睡眠10秒
    Utils.sleep(10000);
    //关闭集群
    cluster.shutdown();

TopologyBuilder是使用setSpout和setBolt方法影响组件ID到组件,那些方法生成的对象可以被用于声明那些组件的输入。

在生产运行拓扑

部署步骤

      在生产运行拓扑类似于在本地运行,以下说明一些步骤:

  1. 使用java编程的话, 用TopologyBuilder定义拓扑(参考上一节)
  2. 使用StormSubmitter类提交拓扑到集群,StormSubmitter提交拓扑需要 拓扑、拓扑名称,拓扑的配置。例子如下:
    Config conf = new Config();
    conf.setNumWorkers(20);
    conf.setMaxSpoutPending(5000);
    StormSubmitter.submitTopology("mytopology", conf, topology);
    

     

  3. 将代码打包成jar,需要包含代码的依赖哟(除storm 依赖外,storm   加入了集群classpath中),如果使用的maven,可以使用这个插件--Maven Assembly Plugin,只需要在 pom.xml 添加如下依赖即可:
     <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>  
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>com.path.to.main.Class</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

    运行 mvn assembly:assembly   即可得到合适的jar包。在集群classpath中已经存在storm,请确保已经排除storm.jar。

  4. 使用storm客户端提交拓扑到集群,指定jar包路径,运行类名,任意参数。例子如下:
    storm jar path/to/allmycode.jar org.me.MyTopology arg1 arg2 arg3

    storm jar 命令可以提交拓扑到集群并且配置StormSubmitter类连接正确的集群,在上面例子中,上传后的allmycode.jar,storm jar 命令调用org.me.MyTopology中的main方法,将arg1,arg2,arg3三个参数传入main方法,

    有时间将写一篇如何搭建storm开发环境, 里面会详细讲解如何通过此命令运行拓扑的.

常用配置

     每个拓扑可以设置很多配置,所有的配置可以查看官方文档的Config类http://storm.apache.org/releases/1.1.0/javadocs/org/apache/storm/Config.html 

以 TOPOLOGY  开头的配置属性可以被重写,其余的集群配置无法被重写,下面介绍几个拓扑常用设置:

  1. Config.TOPOLOGY_WORKERS: 这个配置是设置工作进程数用于执行拓扑,比如设置25个进程数,集群中就会有25个java进程去执行所有的任务,如果一个拓扑中有150个并行任务,每个工作进程会有6个任务线程运行任务。
  2. Config.TOPOLOGY_ACKER_EXECUTORS: 这个配置是设置检查者数量,有配置数量的执行器去跟踪元组树,直到一个spout元组被完全处理。检查者是storm可靠性的一个整体结构。如果次配置未设置,storm将会默认使用Config.TOPOLOGY_WORKERS的值,当它的值设置为0时,默认所有元组均被完全处理,失去了storm的可靠性。后续将会有专门的博客讲述storm的可靠性机制。请大家多多关注,收藏
  3. Config.TOPOLOGY_MAX_SPOUT_PENDING: 这个配置是设置一个单一spout任务运行期间等待的最大spout数(一个元组被认定成功或者失败为一个期间),为了防止队列爆满,非常推荐设置此配置。
  4. Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS: 这个配置是设置一个spout元组被认定为失败之前,完全处理完毕的时间。这个配合默认是30秒,这个默认配置可以满足大部分拓扑。
  5. Config.TOPOLOGY_SERIALIZATIONS: 这个配置可以为storm注册更多的序列器,为元组自定义类型

中止拓扑

      使用一下命令可以中止拓扑。

storm kill {stormname}

{stormname}使用提交拓扑时设定的名字。

它不能立刻中止这个拓扑,它会立刻停止所有spout,阻止它发送更多的元组,storm等待 Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS  配置的超时时长,停止此拓扑所有工作进程,这样子可以给被中止的拓扑一定时间去处理完剩下的元组。

更新运行中的拓扑

    目前仅支持的操作就是停止这个拓扑,重新提交拓扑到集群。官方准备实现 storm swap 命令去替换正在运行的拓扑,确保最大限度的减少更新时间以及新老两个拓扑处理元组可以平滑的过渡。

监控拓扑

     最好的监控方式是使用 storm UI,它提供了任务发生的所有错误信息,详细的数据吞吐量,运行在拓扑中每个组件的延迟性能。 也可以查看集群中运行日志。

© 著作权归作者所有

j
粉丝 73
博文 102
码字总数 138333
作品 0
成都
程序员
私信 提问
Twitter 开源了数据实时分析平台 Heron

“去年才说Heron短时间内不会开源,这才一年时间就开源了。嘴上说着不要,身体倒是很诚实嘛~ 去年,Twitter对外宣布了新的分布式流计算系统Heron,随后消息称Twitter已经用Heron替换了Storm...

oschina
2016/05/28
8.4K
10
Apache Storm 0.10.0-beta 发布

Apache Storm 0.10.0-beta 发布,值得关注的更新如下: 安全,多租户部署: Kerberos Authentication with Automatic Credential Push and Renewal Pluggable Authorization and ACLs Multi-......

oschina
2015/06/16
1K
0
Storm入门 第三章 Storm安装部署步骤

本文以Twitter Storm官方Wiki为基础,详细描述如何快速搭建一个Storm集群,其中,项目实践中遇到的问题及经验总结,在相应章节以“注意事项”的形式给出。 3.1 Storm集群组件 Storm集群中包含...

坏坏一笑
2014/12/03
68
0
如何在eclipse调试storm程序

一、介绍 storm提供了两种运行模式:本地模式和分布式模式。本地模式针对开发调试storm topologies非常有用。 Storm has two modes of operation: local mode and distributed mode. In loca...

cloud-coder
2014/02/16
10.1K
1
Storm笔记整理(三):Storm集群安装部署与Topology作业提交

[TOC] Storm分布式集群安装部署 概述 Storm集群表面类似Hadoop集群。但在Hadoop上你运行的是”MapReduce jobs”,在Storm上你运行的是”topologies”。”Jobs”和”topologies”是大不同的,...

xpleaf
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部