《Storm分布式实时计算模式》——1.5 理解数据流分组

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介:

本节书摘来自华章计算机《Storm分布式实时计算模式》一书中的第1章,第1.5节,作者:(美)P. Taylor Goetz Brian O’Neill 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 理解数据流分组

看了前面的例子,你会纳闷为什么没有增加ReportBolt的并发度。答案是,这样做没有任何意义。为了理解其中的原因,需要了解Storm中数据流分组的概念。
数据流分组定义了一个数据流中的tuple如何分发给topology中不同bolt的task。举例说明,在并发版本的单词计数topology中,SplitSentenceBolt类指派了四个task。数据流分组决定了指定的一个tuple会分发到哪个task上。
Storm定义了七种内置数据流分组的方式:

  • Shuffle grouping(随机分组):这种方式会随机分发tuple给bolt的各个task,每个bolt实例接收到的相同数量的tuple。
  • Fields grouping(按字段分组):根据指定字段的值进行分组。比如说,一个数据流根据“word”字段进行分组,所有具有相同“word”字段值的tuple会路由到同一个bolt的task中。
  • All grouping(全复制分组):将所有的tuple复制后分发给所有bolt task。每个订阅数据流的task都会接收到tuple的拷贝。
  • Globle grouping(全局分组):这种分组方式将所有的tuples路由到唯一一个task上。Storm按照最小的task ID来选取接收数据的task。注意,当使用全局分组方式时,设置bolt的task并发度是没有意义的,因为所有tuple都转发到同一个task上了。使用全局分组的时候需要注意,因为所有的tuple都转发到一个JVM实例上,可能会引起Storm集群中某个JVM或者服务器出现性能瓶颈或崩溃。
  • None grouping(不分组):在功能上和随机分组相同,是为将来预留的。
    Direct grouping(指向型分组):数据源会调用emitDirect()方法来判断一个tuple应该由哪个Storm组件来接收。只能在声明了是指向型的数据流上使用。
  • Local or shuffle grouping(本地或随机分组):和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task(如果worker内有接收数据的bolt task)。其他情况下,采用随机分组的方式。取决于topology的并发度,本地或随机分组可以减少网络传输,从而提高topology性能。

除了预定义好的分组方式之外,还可以通过实现CustomStreamGrouping(自定义分组)接口来自定义分组方式:


<a href=https://yqfile.alicdn.com/f2e2e58a3937d8f22b3e66c66ca1cacba5fab5c3.png
" >

prepare()方法在运行时调用,用来初始化分组信息,分组的具体实现会使用这些信息决定如何向接收task分发tuple。WorkerTopologyContext对象提供了topology的上下文信息,GlobalStreamId提供了待分组数据流的属性。最有用的参数是targetTasks,是分组所有待选task的标识符列表。通常,会将targetTasks的引用存在变量里作为chooseTasks()的参数。
chooseTasks()方法返回一个tuple发送目标task的标识符列表。它的两个参数是发送tuple的组件的id和tuple的值。
为了说明数据流分组的重要性,我们在topology中引入一个bug。首先,修改SentenceSpout的nextTuple()方法,使每个句子只发送一次:


d5b286f5a0326a8883c1dbcde77014458df50879

程序的输出是这样的:


<a href=https://yqfile.alicdn.com/20abac2e6b8ea5fa2dc3f129f5f13ad3b09ef5ee.png
" >


dae3f3e2a2ee2078955116b77407f7ecbd5221ec

然后将CountBolt中按字段分组方式修改为随机分组方式:


588378cc2c452e37e0a4788b2c2969e9ddbde01e

运行程序的结果是这样的:


<a href=https://yqfile.alicdn.com/4a768e6f173acb4230fd61b9f0b90d0317760b24.png
" >

结果是错误的,因为CountBolt的参数是和状态相关的:它会对收到的每个单词进行计数。这个例子中,在并发状况下,计算的准确度取决于是否按照tuple的内容进行适当的分组。我们引入的bug只会在CountBolt并发实例超过一个时出现。这也是我们为什么一再强调,要在不同的并发度配置下测试topology。
通常,需要避免将信息存在bolt中,因为bolt执行异常或者重新指派时,数据会丢失。一种解决方法是定期对存储的信息快照并放在持久性存储中,比如数据库。这样,如果task被重新指派就可以恢复数据。
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
1月前
|
分布式计算 资源调度 大数据
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(一)
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(一)
52 0
|
1月前
|
分布式计算 资源调度 大数据
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(二)
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(二)
69 0
|
18天前
|
监控
Saga模式在分布式系统中保证事务的隔离性
Saga模式在分布式系统中保证事务的隔离性
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
62 4
|
2月前
Saga模式在分布式系统中如何保证事务的隔离性
Saga模式在分布式系统中如何保证事务的隔离性
|
1月前
|
资源调度 分布式计算 大数据
大数据-111 Flink 安装部署 YARN部署模式 FlinkYARN模式申请资源、提交任务
大数据-111 Flink 安装部署 YARN部署模式 FlinkYARN模式申请资源、提交任务
90 0
|
3月前
|
存储 分布式计算 算法
探索Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式
在配置Hadoop集群之前,了解这三种模式的特点、适用场景和配置差异是非常重要的。这有助于用户根据个人需求和资源情况,选择最适合自己的Hadoop运行模式。在最初的学习和开发阶段,单机模式和伪分布式模式能为用户提供便利和成本效益。进而,当用户要处理大规模数据集时,完全分布式模式将是理想的选择。
183 2
|
3月前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
32 0
|
3月前
|
关系型数据库 MySQL 数据处理
实时计算 Flink版产品使用问题之mini-cluster模式下,怎么指定checkpoint的时间间隔
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
资源调度 算法 Java
Flink四种集群模式原理
Flink四种集群模式原理
104 0