storm中分组策略Field Grouping简单总结笔记
刚遇到storm分组策略中的Field Grouping,费解了一些时间,简单做下笔记。
首先先讲下storm的元件组成吧,避免以后连基本的一个storm应用程序的流程都忘记了。
一.主要组件:tuple,stream,spout,bolt,topology
tuple(元组):元组(Tuple),是消息传递的基本单元,是一个命名的值列表,元组中的字段可以是任何类型的对象。Storm使用元组作为其数据模型,元组支持所有的基本类型、字符串和字节数组作为字段值,只要实现类型的序列化接口就可以使用该类型的对象。元组本来应该是一个key-value的Map,但是由于各个组件间传递的元组的字段名称已经事先定义好,所以只要按序把元组填入各个value即可,所以元组是一个value的List。
stream(流):流是Storm的核心抽象,是一个无界的元组系列。源源不断传递的元组就组成了流,在分布式环境中并行地进行创建和处理。
spout(水龙头) : 发送器,通过nextTuple方法不断往bolt写进数据
bolt(转接头): 在拓扑中所有处理都在Bolt中完成,Bolt是流的处理节点,从一个拓扑接收数据,然后执行进行处理的组件。Bolt可以完成过滤、业务处理、连接运算、连接与访问数据库等任何操作。
Bolt是一个被动的角色,七接口中有一个execute()方法,在接收到消息后会调用此方法,用户可以在其中执行自己希望的操作。
Bolt可以完成简单的流的转换,而完成复杂的流的转换通常需要多个步骤,因此需要多个Bolt。
Bolt可以发出超过一个的流。
topology(拓扑):一个topology为一个实时应用程序,与离线处理中的mapreduce中的job相对应。
二.分组策略:
这里只描述两种常用的分组策略:Shuffle Group , Field Group
1.Shuffle Group : 由名字可知,该分组为随机分组,它能尽可能地去对所有分组的bolt进行平均分配tuple,例如说发送了spout30个tuple,有4个bolt线程,那么每个bolt能接受到的tuple元组会尽可能地平均分配
2.Field Group:该分组为按字段分组,详细的话看代码:
以wordCount为例:
public class WordCountSpout extends BaseRichSpout {private SpoutOutputCollector collector;public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {this.collector = spoutOutputCollector;}public void nextTuple() {collector.emit(new Values("i am ximenqing love jinlian"));try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {outputFieldsDeclarer.declare(new Fields("love"));}
}
我们发送不断发送一句话来统计每个word出现的次数,首先通过nextTuple发送,并且睡眠一段时间(不然的话发送太猛)
public class WordCountSplitBolt extends BaseRichBolt {private OutputCollector collector;public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {this.collector = outputCollector;}public void execute(Tuple tuple) {String value = tuple.getString(0);String[] split = value.split(" ");for (String s : split) {collector.emit(new Values(s, 1));}}public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {outputFieldsDeclarer.declare(new Fields("word", "num"));}
}
spout发送之后,接受的自然就是bolt了,这里是第一个bolt,主要是进行切分单词的,所以这里bolt接收到数据就是刚才spout发送的那一句话,然后对这句话进行切分成一个个的单词,每一个单词发送一次,注意,在下面的declareOutputFields方法中声明了两个字段分别为word和num,这里的word对应的是上面execute方法的new values(s,1)中的s,即values对象里面的值与fields中的值是一一对应的。
bolt也能发送数据到下面的bolt,这样就连成了一条源源不断的链了,下面是第二个bolt,主要是进行单词数量汇总的:
public class WordCountBolt extends BaseRichBolt {private Map<String, Integer> map = new HashMap<String, Integer>();public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {}public void execute(Tuple tuple) {String word = tuple.getString(0);int num = tuple.getInteger(1);Integer count = map.get(word);if (count == null) {count = 1;map.put(word, count);}else{map.put(word,count + 1);}System.err.println(Thread.currentThread().getId() + " word:" + word + " num:" + map.toString());}public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {}
}
自然地这里用map来收集,key为word,value为num,这一个bolt为该topology的最后一个bolt
深入看一下不同的字段分组情况,这里引用一下网上的一篇文章:
https://yq.aliyun.com/ziliao/310484
1.现在又两个字段,按照第一个字段分组
spout:
bolt:
topology:
打印结果:
这里可以看出,因为我们是以第一个字段进行分组的,所以第一个字段相同的一定会分到同一个bolt,但是同一个bolt中的字段不一定相同,发送的数据就像(k,v),类似的,我们来回想下mapreduce,这里的第一个bolt发送数据给第二个bolt的处理相当mapreduce中的map阶段,第二个bolt相当于reduce。
2.以第二个字段为分组依据:
与第一种情况相同,不过是以第二个字段相同的分到一组而已,这里可以看上面引用的文章。
3.两个字段为分组依据:
其实也是一样的,当两个字段相同的时候,即(k,v)这一对数据,k和v都相同的才会分到同一个bolt中,其余的将会随机分到不同的bolt中,
打印结果:
个人感觉storm中的字段分组策略与mapreduce的思想是很相同的,不过mapreduce进行数据的输出输入规定为(k,v),在reduce中进行汇聚的是根据key是否相同,而Field Grouping 可以对多个字段进行分组,看你是对哪几个字段进行分组,这几个字段相同的就分到同一个bolt中,如果mapreduce中也要对几个字段分组的话就只能以这几个字段作为自定义对象的属性来作为key去在reduce端进行汇聚了。
以上仅是个人菜鸟作出的对Field Grouping分组策略的简单总结作为笔记,有误敬请原谅。
storm中分组策略Field Grouping简单总结笔记相关推荐
- storm自定义分组与Hbase预分区结合节省内存消耗
Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...
- 大数据技术之_17_Storm学习_Storm 概述+Storm 基础知识+Storm 集群搭建+Storm 常用 API+Storm 分组策略和并发度
大数据技术之_17_Storm学习 一 Storm 概述 1.1 离线计算是什么? 1.2 流式计算是什么? 1.3 Storm 是什么? 1.4 Storm 与 Hadoop 的区别 1.5 Sto ...
- storm的流分组策略
关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参 ...
- signalr中Group 分组群发消息的简单使用
前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...
- Storm中的DRPC简单概述
前边我们基Hadoop实现了RPC,下面将一下Storm中的DRPC DRPC:分布式RPC,Storm中的DRPC是使用Storm实时并行计算真正强大的函数,Storm拓扑作为输入接收函数参数流,并 ...
- 游戏设计模式思考:“穿越火线”中的“策略模式”
前言:在前段时间陆陆续续在博客园更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的文章中,我们在重构时用到了"工厂模式"."策略模式 ...
- 策略模式与简单工厂模式区别(转)
最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简 ...
- java策略设计模式_Java中的策略设计模式
java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...
- Java中的策略设计模式
策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...
- java 设计模式 示例_Java中的策略设计模式-示例教程
java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...
最新文章
- mysql程序设计排球比赛_Jsp+Ssh+Mysql实现的排球馆预约管理系统项目源码附带视频指导运行教程...
- 支持三个cpu的服务器,基于第三代至强可扩展处理器,宁畅G40系列服务器正式发布...
- rufus linux开机密码,使用Rufus 3.4制作Ubuntu 18.04.1 U盘启动盘的方法
- 由VMWorld2010想到的Social Media宣传
- mysql 最值复杂查询_MySQL高级查询
- Linux图片马PHP,php 根据请求生成缩略图片保存到Linux图片服务器的代码
- 【转】写给想学习自动化测试的新人
- 毫米波雷达障碍物检测算法介绍
- c 程序设计语言西电科大,西安电子科技大学
- String.intern()使用总结
- Android FrameWork——StatusBar
- SpriteBuilderamp;Cocos2D使用CCEffect特效实现天黑天亮过度效果
- 易建科技eKing Cloud招聘,快到碗里来~
- 信息安全密码学期末复习重点总结
- 【论文导读】Selecting Data Augmentation for Simulating Interventions
- 查看服务器阵列卡型号6,怎么查看 dell 阵列卡型号#如何通过服务器自检画面的信息查看当前阵列卡的型号...
- 目的地址和ARP地址应答中的源地址
- js 限制鼠标移动范围
- Gradient Descent
- 美团智能支付稳定性测试实战
热门文章
- 【概率密度函数估计】--- 最大似然估计与Parzen窗函数画法
- android .9图片如何引用,Android调用相机拍照并返回路径和调用系统图库选择图片...
- 1137. 第 N 个泰波那契数 动态规划
- uva 1339 题解
- python编写命令行框架_Python2和3的面向命令的命令行框架是什么?
- pwm 正弦波_增强型PWM抑制功能对于直列式电机控制的五大优势
- 特征向量的线性无关性
- 台式计算机如何封存,一种计算机用声卡封存装置的制作方法
- Raki的统计学习方法笔记0xF(15)章:奇异值分解
- 147.有序数组的TwoSum(力扣leetcode) 博主可答疑该问题