storm的八种Grouping策略

在这里,将会提到storm的七种grouping策略,并且编码逐一实现。

首先,需要一个集群(希望尽量模仿真实环境,故就不用本地模式了)。详细的安装方法大家可以查看本人的另外一篇博文:storm集群和zookeeper集群的部署过程

OK。现在有三个节点。一个作为nimbus,两个作为supervisor。到这里先介绍一下storm逻辑上有两个component,一个是Spout,另一个是Bolt。stream由Spout发出,在不同的Bolt之间进行处理,在其中传递的是storm的基本处理单位:Tuple。由Spout发出一个一个Tuple,然后Bolt接收Tuple进行各种各样的处理。这一整个过程构成一个DAG。在storm里面叫做Topology。当使用远程模式向集群提交一个Topology之后,如果不kill掉的话,将会一直运行到。。。我也不知道尽头。。貌似没有尽头。

好了,来看一个简单的Topology。将使用这个Topology来实现那几种Grouping策略。

上图中spout的处理逻辑是将一句话发出给下一个Bolt,然后下一个Bolt做句子的单词分割,下一个做计数,最后的Bolt做汇总显示。这里可以有多个Bolt或者Spout进行并行处理。这是关于并行度的设置。

好了,所谓的grouping策略就是在Spout与Bolt、Bolt与Bolt之间传递Tuple的方式。总共有七种方式:

1)shuffleGrouping(随机分组)

2)fieldsGrouping(按照字段分组,在这里即是同一个单词只能发送给一个Bolt)

3)allGrouping(广播发送,即每一个Tuple,每一个Bolt都会收到)

4)globalGrouping(全局分组,将Tuple分配到task id值最低的task里面)

5)noneGrouping(随机分派)

6)directGrouping(直接分组,指定Tuple与Bolt的对应发送关系)

7)Local or shuffle Grouping

8)customGrouping (自定义的Grouping)

OK,下面逐个来试试!

首先是使用shuffleGrouping策略。

启动后所得的结果。

可以看到如storm这个单词被随机分配到了两个counter里面,分别是h2和h3两个节点里面。可再做一次提交,又会看到不一样的结果。将与下面的fieldGrouping形成对比。

然后换成fieldsGrouping。

启动后的结果如图。图中wordcount2和wordcount3就是我两次提交的topology的名字。

下面是两次提交的结果。可以看出,使用fieldsGrouping策略,被分配到每个wordcounterbolt的单词没有变化。

下面是第二次提交的结果。

再换成noneGrouping策略。

提交集群运行。

运行结果如图。noneGrouping和shuffleGrouping是基本一样的。都是随机的。

替换成allGrouping策略。

提交集群运行。

运行结果如图。可以看到。两个bolt所接收到的单词是一样的,都是全部的单词。

最后,替换成globalGrouping策略。

提交集群运行。

从上图可以看到,主要分配到了h3这个节点。从下面的结果得以验证。

好了,就先做到这里吧!剩下的grouping策略需要在修改一个代码,就下次再做了。本来不想上这么多图的,不过,不是说有图有真相嘛!哈哈~

时间: 2024-10-10 13:18:37

storm的八种Grouping策略的相关文章

Storm的并行度、Grouping策略以及消息可靠处理机制简介

概念: Workers (JVMs): 在一个节点上可以运行一个或多个独立的JVM 进程.一个Topology可以包含一个或多个worker(并行的跑在不同的machine上), 所以worker process就是执行一个topology的子集, 并且worker只能对应于一个topology Executors (threads): 在一个worker JVM进程中运行着多个Java线程.一个executor线程可以执行一个或多个tasks.但一般默认每个executor只执行一个task.

ThreadPoolExecutor八种拒绝策略浅析

转自:http://www.kailing.pub/article/index/arcid/255.html 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用FixedThreadPool还是CachedThreadPool其背后实现都是ThreadPoolExecutor.ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有

if-else代码优化的八种方案

前言 代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案. 优化方案一:提前return,去除不必要的else 如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅. 优化前: if(condition){ //doSomething }else{ return ; } 优化后: if(!condition){ return ; } //doSometh

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

Selenium Webdriver元素定位的八种常用方式

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下. 1. By.name() 假设我们要测试的页面源码如下: <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><

八种主流NoSQL数据库对比

摘要:虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举.详见我的IT-Homer博客: 八种主流NoSQL数据库对比 简介 NoSQL,是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储.现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改变这一现状.目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数

【Selenium 3+Java自动化(4)】-八种元素定位

1 package com.mypro.jase; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.WebElement; 6 7 public class FindElement { 8 WebDriver driver; 9 String url = "http://www.baidu.com"; 10 11 /** 12

敏捷教练的八种失败角色

踏入敏捷圈很久了,参加了很多活动,和众多一线的敏捷教练进行交流,对敏捷教练的八种失败角色有了一些新的感悟,这里再次把这八种失败角色拉出来晒一晒,各位教练请对号入座: 1.   侦探型: 适当观察团队,带着观察的信息,消失在黑暗之中,团队断断续续能感觉到教练的存在,但是似乎看得见摸不着.教练偶尔发出一些观察的信息和建议,但是当团队想找教练沟通时,侦探教练总是神神秘秘. 2.   海鸥型:猛然扎进站立会中,用善意的观察和建议冲击整个团队,然后便飞走了,留下团队在身后,满脸迷茫,不知所措.海鸥教练得到

java基本数据类型四类八种

第1类:整型:byte.short.int.long 第2类:浮点型:float.double 第3类:逻辑型:boolean 第4类:字符型:char 字节长度从小到大: boolean型: 1/8 byte字节类型:1 char字符型:2 一个字符能存储一个中文汉字 short短整型:2 int整数类型:4 float浮点类型(单精度):4 long长整型:8 double双精度类型(双精度)8 注:java中默认的整数类型是int类型,若要定义为float型,加上l或L; 默认的浮点型也是