本文可作为 <<Storm-分布式实时计算模式>>一书1.4节的读书笔记

在Storm中,一个task就可以理解为在集群中某个节点上运行的一个spout或者bolt实例。

记住一个task是一个实例。 实例明白吧

Class Person 是一个类, persona,personb都是Person的一个实例。





在集群运行运行中,topology主要有四个组成部分。

他们从低到高分别是task(bolt/spout实例),Executor(线程),Workers(JVM虚拟机),Nodes(服务器)





task上面已经说过,task的nextTuple和execute方法会被executor线程调用

Executor是jvm进程中运行的一个java线程,多个task可以分配给同一个executor来执行。也就是说executor与task是一对多的关系。不过,除非明确指定,Storm会默认给每个executor分配一个task。默认是一对一。

Workers,指的是node上独立的jvm进程。每个node可以配置运行一个或者多个worker。一个topology会分配到一个或者多个worker上运行。

Nodes,指配置在一个 Storm 集群中的服务器,会执行 topology 的一部分运算。一个 Storm 集群可以包括一个或者多个工作 node。

我们看下面的例子

package Storm.blueprints.chapter1.v1;

import backtype.Storm.Config;
import backtype.Storm.LocalCluster;
import backtype.Storm.topology.TopologyBuilder;
import backtype.Storm.tuple.Fields;
import static Storm.blueprints.utils.Utils.*;

public class WordCountTopology {

    private static final String SENTENCE_SPOUT_ID = "sentence-spout";
    private static final String SPLIT_BOLT_ID = "split-bolt";
    private static final String COUNT_BOLT_ID = "count-bolt";
    private static final String REPORT_BOLT_ID = "report-bolt";
    private static final String TOPOLOGY_NAME = "word-count-topology";

    public static void main(String[] args) throws Exception {

        SentenceSpout spout = new SentenceSpout();
        SplitSentenceBolt splitBolt = new SplitSentenceBolt();
        WordCountBolt countBolt = new WordCountBolt();
        ReportBolt reportBolt = new ReportBolt();

        TopologyBuilder builder = new TopologyBuilder();

        builder.setSpout(SENTENCE_SPOUT_ID, spout);
        // SentenceSpout --> SplitSentenceBolt
        builder.setBolt(SPLIT_BOLT_ID, splitBolt)
                .shuffleGrouping(SENTENCE_SPOUT_ID);
        // SplitSentenceBolt --> WordCountBolt
        builder.setBolt(COUNT_BOLT_ID, countBolt)
                .fieldsGrouping(SPLIT_BOLT_ID, new Fields("word"));
        // WordCountBolt --> ReportBolt
        builder.setBolt(REPORT_BOLT_ID, reportBolt)
                .globalGrouping(COUNT_BOLT_ID);

        Config config = new Config();

        LocalCluster cluster = new LocalCluster();

        cluster.submitTopology(TOPOLOGY_NAME, config, builder.createTopology());
        waitForSeconds(10);
        cluster.killTopology(TOPOLOGY_NAME);
        cluster.shutdown();
    }
}

程序执行完毕后,在控制台可以看到类似以下的输出:

很简单,就是就经典的数单词数量的topology,大家根据各个类的名字,应该也能猜出来内部的逻辑。

里面的代码,我就不贴出来了,大家自己都能找到很多。

我们知道在设置spout/bolt的时候如果不设置parallelism_hint,就默认为1

它的整体的并行图,如下:





正如在图中看到的,唯一的并发机制出现在线程级。每个任务在同一个 JVM 的不同线程中执行。如何增加并发度以充分利用硬件能力?让我们来增加分配给topology 的

worker 和 executer 的数量。





配置executor和task

我们把  sentencespout的并发度调成2,并且worker不变。代码如下:

//这个2 指的是有两个executor 和task的数量无关 不过在这行代码里,我们没有指定task的数量,因为executor为2 那么task也就是2
 builder.setSpout(SENTENCE_SPOUT_ID, spout, 2);  

那么它的并行图如下:





配置worker数量

  这个很简单,我们在config里设置一下就OK

        Config config = new Config();

        config.setNumWorkers(2);

下一步,我们给语句分割 bolt SplitSentenceBolt 设置 4 个 task 和 2 个 executor。每个executor 线程指派 2 个 task 来执行(4/2=2)。还将配置单词计数 bolt 运行四个 task,每个task 由一个 executor 线程执行:

	 builder.setBolt(SPLIT_BOLT_ID, splitBolt, 2)
                .setNumTasks(4)
                .shuffleGrouping(SENTENCE_SPOUT_ID);
        // SplitSentenceBolt --> WordCountBolt
        builder.setBolt(COUNT_BOLT_ID, countBolt, 4)
                .fieldsGrouping(SPLIT_BOLT_ID, new Fields("word"));
        // WordCountBolt --> ReportBolt

这么一来,整体的运行图就是下面的样子了

此时,运行代码,每个单词的计数比原topology 要多:

结果如下:

书中的代码

http://download.csdn.net/detail/zhuzhiyunzzy/8336583

本文所引用的例子在Chapter01中

Storm并发机制详解的更多相关文章

  1. 干货 | Dart 并发机制详解

    Dart 通过 async-await.isolate 以及一些异步类型概念 (例如 Future 和 Stream) 支持了并发代码编程.本篇文章会对 async-await.Future 和 St ...

  2. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  3. JVM的垃圾回收机制详解和调优

    JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...

  4. 转 Java虚拟机5:Java垃圾回收(GC)机制详解

    转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...

  5. hibernate缓存机制详解

    hiberante面试题—hibernate缓存机制详解   这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...

  6. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  7. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  8. 从mixin到new和prototype:Javascript原型机制详解

    从mixin到new和prototype:Javascript原型机制详解   这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...

  9. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

随机推荐

  1. [HNOI2011]赛车游戏

    题目描述 名歌手LAALA最近迷上了一款赛车游戏,游戏中开车的玩家在不同的路段需要选择不同的速度,使得自己在最短的时间内到达终点.开始游戏时,车内的初始油量为f,所以游戏的关键是如何在速度和耗油量之间 ...

  2. [HNOI2004]树的计数

    题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...

  3. Go学习——defer、panic

    defer: 延迟到ret之前,通常用于IO的关闭 or 错误处理. 在延迟出现的异常可以被后面的捕捉,但是只有最后一个. defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时 ...

  4. 51nod 1364 最大字典序排列(线段树)

    1364 最大字典序排列基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个1至N的排列,允许你做不超过K次操作,每次操作可以将相邻的两个数交换,问能够得到的字 ...

  5. 阿里2019实习内推,五轮技术面+一轮HR面,Java岗面经

    在牛客网上获取到很多知识和信息,现在反馈一波,希望能对广大找实习的同学有所帮助. 个人情况:EE方向渣硕,二月末内推了阿里集团某部门Java岗,约三周完成了所有面试. 面经如下: 一面 (简历评估): ...

  6. php+xdebug远程调试(单人)

    目录 服务器上安装 XDebug 及配置 客户端 PHPstorm 配置 浏览器安装插件 服务器上安装 XDebug 及配置 XDebug 安装 略 配置: 打开 php.ini 配置文件: vim ...

  7. div,margin,padding

    <!-- 类比礼品盒里装方块月饼.月饼的食用部分(我们把它称之为月饼肉身)要装在小包装盒里,月饼肉身即为content.月饼肉身与直接包裹它的小包装盒(我们把它叫做月饼的衣服)之间的距离叫pad ...

  8. 开源小工具 - swagger API访问代码生成器(js/typescript)

    现在流行前后端分离,后端通常会使用swagger生成api文档,提供给前端的同事来调用,一般前端是查看这个文档,根据文档说明编写调用代码.其实,swagger已经提供了足够多的描述信息,我们可以基于s ...

  9. AleNet模型笔记

    谁创造了AlexNet? AlexNet是有Hinton大神的弟子Alex Krizhevsky提出的深度卷积神经网络.它可视为LeNet的更深更宽的版本. AlexNet主要用到的技术 成功使用Re ...

  10. 78. Subsets(中等,集合的子集,经典问题 DFS)

    Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...