文章目录
一、Storm 是什么
Storm 是一个分布式、实时计算框架,适用于处理无边界的流数据。
无边界就是指 Storm 可以无限制地接收流数据,分布式是指可以实时添加设备来增加运算能力。
二、Strom 架构
Nimbus:Nimbus 是运行在 master node 上的进程,它负责任务分配以及监控任务。
Supervisor:Supervisor 是运行在 worker node 上的进程,它负责监听 Nimbus 下发的任务并且启动和停止任务(Storm 中一个任务就是一个 topology ,类似于 Hadoop 中的任务 Map Reduce Job),一个 Superviosr 可能只执行一个 topology 中的一部分。
Zookeeper:Nimbus 和 Supervisor 通过 Zookeeper 来进行合作。而且,Nimbus 和 Superviosr 不会保存运行状态,Zookeeper 把它们的状态存到了磁盘中,如果它们挂掉了,那么可以通过 Zookeeper 来快速恢复。
Topology:拓扑是一个计算图,节点但代表一些独立的计算,边代表节点之间数据的传递。
三、Strom 编程模型
Tuple:Tuple 是拓扑中节点传输数据的形式,它本身是一个有序的数值序列,其中每个数值都会被赋予一个命名。注:虽然元组中的每一个值都被命名,但这并不意味着一个元组是一个键值对列表。以为如果一个元组是键值对列表,那将意味着键名有合适元组的一部分,但实际上,元组只是数值列表,并没存键名,Storm 通过一种机制来为数值赋值命名。
Stream:在拓扑中,一个流是拓扑中两个节点间一个无边界的元组序列,拓扑中可以有任意数量的流,除了拓扑中的第一个节点是从数据源读取数据外,其它节点可以接收多个流作为输入。
Spout:一个 Spout 是拓扑的流数据源头,Spout 通常会从外部数据源读取数据并且向拓扑中发射元组,它可以监听包括消息队列、数据库或其他数据输入源。
Bolt:Bolt 可以从输入流接收元组,对元组进行操作,以及可能会发生新的元组形成输出流。
四、并行度
4.1 基础概念
worker process:worker process 是 JVM 进程,一个节点中可以有一个或多个 worker process,它负责处理拓扑的部分或全部。
Executor:Executor 是 worker process 中的线程,它负责具体细节的处理,一个 executor 只能执行 topo 中的一个 spout 或一个 bolt。executor 的个数可以在 topology 运行中动态改变。
tasks:task 是 Storm 中最小粒度的单位,一个 executor 中可以有多个 task,每一个 task 是 spout 或 bolt 的实例。
4.2 设置并行度
集群中运行拓扑的并行度与上述三者都有关系:
五、Stream 分组
考虑一个问题,一个 executor 负责一个 spout 或 bolt 的执行,而一个 executor 中可能有多个 task,每一个 task 就是一个 spout 或者 一个 bolt 的实例,那么当 bolt 接收数据流的时候,应该是哪一个 task 来接受呢?这就涉及到了分组的问题,Storm 提供了不同的分组策略。
5.1 shuffle 分组(随机分组)
随机分组把 tuple 随机地分发到 task,每个 task 得到的同样数量的 task,适合于每个 task 都做同样事情的情形,例如:在 wordCount 中把字符串拆分。
5.2 Field 分组(按照字段分组)
按照字段分组,把某个字段的 tuple 都流入到一个 task 中,适合于 task 做特定事情的情形,例如:在 wordCount 对 word 进行计数,每个 task 负责不同 word 的计数。
**注意:在 Field 分组中,只能保证具有相同字段的 tuple 流向同一个 task,而不能保证一个 task 只接受一个字段的 tuple,因为在进行字段分组的时候是根据字段的 hash 值来分的,公式:hash(fields) % (no. of tasks),例如:task = 2,字段为 X,取值可能为 A 或 B,那么分组的时候就是根据 hash(A) % 2和 hash(B) % 2来分的,如果 hash(A) = hash(B) ,那么这两个字段就被分到了一个 task 中。
5.3 ALL 分组
tuple 被复制到 Bolt 的所有 task 中。
5.4 global 分组
全部流都分配到 bolt 的同一个 task,id 最小的 task中。