背景:目前就职于国内最大的IT咨询公司,恰巧又是毕业季,所在部门招了100多个应届毕业生,本人要跟部门新人进行为期一个月的大数据入职培训,特此将整理的文档分享出来。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/7275406.html

微信:intsmaze

集群环境

storm机器有4台节点(物理机),三台是supervisor,每一台supervisor上面启动4个work进程(JVM进程),一共有12个work进程。

Topology程序

public class WordCountTopologyMain {
    public static void main(String[] args) throws Exception {
        TopologyBuilder intsmaze= new TopologyBuilder();
        intsmaze.setSpout("spout", new RandomSentenceSpout(),3);
        intsmaze.setBolt("split", new SplitSentenceBolt(),9).shuffleGrouping("spout");
        intsmaze.setBolt("count", new WordCountBolt(),3).fieldsGrouping("split",new Fields("word"));

        Config conf = new Config();
        conf.setDebug(false);
        //定义你希望集群分配多少个工作进程给你来执行这个topology,这里3个进程(work)来运行15个execute(线程)
          conf.setNumWorkers(3);
        StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
    }
}
  程序中指定需要三个work来执行一共15个任务。客户端提交任务给nimbus后,nimbus从12个空闲的worker中挑选3个worker去运行15个任务。
 
  疑问:nimbus怎么知道集群中的supervisor中有多少个work,以及空闲的work?
  supervisor中的work数量在配置文件中定义好了,supervisor启动后会把本机的work信息存放到zookeeper目录下,这样nimbus就可以到zookeeper目录下获取work信息,也就知道哪些work可以使用了。
 
  哪些task运行在哪些worker上?task的命名和分配到work的算法代码在哪里?
  对这3组不同的task(一共15个task),进行编号,按照一个全局顺序编号,对编号根据设置的work数量进行取余来选择放到哪一个work上。
supervisor1上面的task编号为1(spout); ,,(bolt task split); (bolt task wordcount)
supervisor2上面的task编号为2(spout); ,,(bolt task split); (bolt task wordcount)
supervisor3上面的task编号为3(spout); ,,(bolt task split); (bolt task wordcount)
  这是一种最优解,这样可以保证每一个 spout task任务发送数据给下一个bolt任务能最大限度在同一个进程间传递信息,避免了向另一台节点的bolt发送消息带来的网络开销。所以为了保证能最大程度在本地local传递数据,设置的task的总数最好能整除worker数,每一个组件(spout/bolt)的并行度最好能整除worker数。

  一个worker只属于一个拓扑程序,这是因为,这个worker启动了,它就不是空闲的了,nimbus再分配新的拓扑程序时,只会从空闲的worker中选择。

Topology程序

public class WordCountTopologyMain {
    public static void main(String[] args) throws Exception {
        TopologyBuilder intsmaze= new TopologyBuilder();

        intsmaze.setSpout("spout", new RandomSentenceSpout(),3).setNumTasks(9);
        //3是说明该spout启动几个线程来运行。该组件每个线程执行3个task.

        intsmaze.setBolt("split", new SplitSentenceBolt(),9).shuffleGrouping("spout");
        //不指定默认一个线程一个task任务
         intsmaze.setBolt("count", new WordCountBolt(),3).fieldsGrouping("split",new Fields("word"));

        Config conf = new Config();
        conf.setDebug(false);
        //定义你希望集群分配多少个工作进程给你来执行这个topology,这里3个进程(work)来运行15个execute(线程)
          conf.setNumWorkers(3);
        StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
    }
}
  程序中指定需要三个work十五个线程来执行二十一个任务。客户端提交任务给nimbus后,nimbus从12个空闲的worker中挑选3个worker去调用十五个线程来执行二十一个任务。
  这个时候怎么分配,因为在spout中会有3个task在一个线程中。所以在spout的task中三个task算一组进程work选择。
  哪些task运行在哪些worker上?
  对这3组不同的task(一共21个task),进行编号,按照一个全局顺序编号,对编号根据设置的work数量进行取余来选择放到哪一个work上。
supervisor1上面的task编号为spout -,spout1-(spout); split -, split -, split -(bolt task split); wordcount -(bolt task wordcount)
supervisor2上面的task编号为spout2-,spout -(spout); split -, split -, split -(bolt task split); wordcount -(bolt task wordcount)
supervisor3上面的task编号为spout -,spout -(spout); split -, split -, split -(bolt task split); wordcount -(bolt task wordcount)

配置并行度

对于并发度的配置, 在storm里面可以在多个地方进行配置, 优先级为:
efaults.yaml < storm.yaml < topology-specific configuration < internal component-specific configuration < external component-specific configuration 
worker processes的数目, 可以通过配置文件和代码中配置, worker就是执行进程, 所以考虑并发的效果, 数目至少应该大于machines的数目。
executor的数目, component的并发线程数,只能在代码中配置(通过setBolt和setSpout的参数), 例如, setBolt("green-bolt", new GreenBolt(), 2) 。
tasks的数目, 可以不配置, 默认和executor1:1, 也可以通过setNumTasks()配置。
Topology的worker通过config设置,即执行该topology的worker(java)进程数。它可以通过storm rebalance 命令任意调整。
 

3个组件的并发度加起来是10,就是说拓扑一共有10个executor,一共有2个worker,每个worker产生10 / 2 = 5条线程。绿色的bolt配置成2个executor和4个task。为此每个executor为这个bolt运行2个task。

storm从入门到放弃(二),任务分配过程-核心机密的更多相关文章

  1. hive从入门到放弃(二)——DDL数据定义

    前一篇文章,介绍了什么是 hive,以及 hive 的架构.数据类型,没看的可以点击阅读:hive从入门到放弃(一)--初识hive 今天讲一下 hive 的 DDL 数据定义 创建数据库 CREAT ...

  2. storm从入门到放弃(一),storm介绍

    背景:目前就职于国内最大的IT咨询公司,恰巧又是毕业季,所在部门招了100多个应届毕业生,本人要跟部门新人进行为期一个月的大数据入职培训,特此将整理的文档分享出来. 原文和作者一起讨论:http:// ...

  3. storm从入门到放弃(三),放弃使用《StreamId》特性。

    序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...

  4. Go语言从入门到放弃(二) 优势/关键字

    本来这里是写数据类型的,但是规划了一下还是要一步步来,那么本篇就先介绍一下Go语言的 优势/关键字 吧 本章转载  <The Way to Go>一书 Go语言起源和发展 Go 语 言 起 ...

  5. storm从入门到放弃(三),放弃使用 StreamId 特性

    序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...

  6. FlaskWeb开发从入门到放弃(二)

    第5章 章节五 01 内容概要 02 内容回顾 03 面向对象相关补充:metaclass(一) 04 面向对象相关补充:metaclass(二) 05 WTforms实例化流程分析(一) 06 WT ...

  7. robotium从入门到放弃 二 第一个实例

    1.导入被测试的源码 我们先下载加你计算器源码,下载地址: https://robotium.googlecode.com/files/AndroidCalculator.zip 如果地址被墙无法现在 ...

  8. MyBatis从入门到放弃二:传参

    前言 我们在mapper.xml写sql,如果都是一个参数,则直接配置parameterType,那实际业务开发过程中多个参数如何处理呢? 从MyBatis API中发现selectOne和selec ...

  9. Ldap 从入门到放弃(二)

    OpenLDAP 服务器安装与配置 本文内容是自己通过官网文档.网络和相关书籍学习和理解并整理成文档,其中有错误或者疑问请在文章下方留言. 一.概述 本文以Centos 6.8(64bit)为例介绍 ...

随机推荐

  1. canvas学习总结三:绘制路径-线段

    Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRect(),虽然strokezText(),fillText() ...

  2. 什么是nginx?

    1.nginx是一款服务器软件 2.nginx是一个高性能的HTTP和反向代理服务器: 3.nginx是一个代理邮件服务器: 4.nginx还可以实现负载均衡: nginx的优缺点: 优点:可以实现高 ...

  3. Linux下重启多个 tomcat 服务的脚本

    由于修改tomcat的配置文件或手动操作数据库数据后,tomcat的缓存和redis的缓存很严重,需要经常重启tomcat来释放缓存,经常就是手动重启. # .查找tomcat的进程ID ps -ef ...

  4. SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

    (一)为什么选择7z              7z 是一种主流高效的压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.该格式最初被7-Zip实现并采 ...

  5. [leetcode-617-Merge Two Binary Trees]

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  6. WPF 杂谈——Trigger触发器

    笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...

  7. chart.js使用常见问题

    Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 在使用过程中新手可能会遇到很多问题导致图标无法显示.下面我们来看一下在使用过程中可能会遇到的问题. 刚开始用chart.j ...

  8. tp5框架的获取器

    tp5的获取器功能很强大,一下子就喜欢上了,你可以在模块里任意定义表里不存在的字段,在前台调用很方便.话不多说直接上demo: 1.命名规则   get + 属性名的驼峰命名+ Attr 直接就能在m ...

  9. 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】

    Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...

  10. CentOS 6.5 下安装 Redis 2.8.7(转载)

    wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...