Storm学习

基础概念

topology

应用程序的所有逻辑会被打包到Storm的topology中。

Storm 的 topology 类似于 MapReduce 的 job。两者之间的一个不同点就是 MapReduce 的 job 最终会结束,而topology则会一直运行下去,除非人为的kill掉。

topology中定义了spouts、bolts以及数据流的分组。

stream

消息流
一个消息流是一个没有边界的tuple序列,而这些tuples会被以一种分布式的方式并行地创建和处理

spout

spout是 topology 的数据入口,连接到数据源,将数据转换为一个个的tuple,然后将tuple作为数据流发射emit

spout发射tuple用两种情况,一种是如果发射tuple失败,那么spout会尝试重试emit一下这个tuple,第二种情况是,不考虑发射成功与否,直接干下一个tuple

一个spout可以发射给多个stream,发射到多个流的时候需要指定发给哪个流

spout的主要方法是 nextTuple,该方法会发射一个新的 tuple,如果没有 tuple 可以发射,则直接返回不做任何操作。

nextTuple 不应被阻塞,也就是说当使用 nextTuple 方法时,要发射一个新元组,要么快速返回,不应该执行任何可能导致延迟的操作。 因为 Storm 会在同一个线程上调用一个 spout 的所有方法,比如 nextTuple、ack、fail。如果你的 nextTuple 方法被阻塞,那么其他方法的调用都会被阻塞。

总的来说,在使用 nextTuple 方法时,需要注意避免任何形式的阻塞。

发射成功时,会调用 ack 方法,失败时会调用 fail 方法。在可靠性要求的场景下才需要,不需要高可靠性的时候可以不采用。

bolt

拓扑中的所有处理都在 bolt 中完成,一个 bolt 可以subscribe 多个由 spout 或其他 bolt 发射的数据流。bolt可以将一个或者多个数据流作为输入,对数据实施运算后,选择性地输出一个或者多个数据流

bolt 的主要方法是 execute 方法,任务在一个新的元组输入时执行该方法。bolt 使用 OutputCollector 对象发射新的元组。bolt 必须对每个处理的元组调用 OutputCollector 的 ack 方法,因此 storm 知道这个元组完成处理(并且能最终确定 ack 原始元组是安全的)。一般情况,处理一个输入元组,基于此元组再发射 0-N 个元组,然后 ack 输入元组。storm 提供了一个 IBasicBolt 接口自动调用 ack 方法。

tuple

storm 最基础的数据结构,内部采用了一个 List 来保存各种类型的数据

stream groupings

流分组定义了数据如何从一个组件(spout 或 bolt) 发送到另一个组件。决定了 tuple 如何路由到下游的 bolt 实例。

1、Shuffle Grouping

随机地将元组分配给下游Bolt的所有任务,目的是为了实现负载均衡。每个Bolt实例接收大致相同数量的元组。

2、Fields Grouping

根据元组中的某些字段值来决定将元组发送给哪个Bolt实例。意味着具有相同字段值的元组总是被发送到同一个Bolt实例,这对于需要聚合操作的数据非常有用。

3、All Grouping

将元组发送给所有下游Bolt的任务。适用于需要每个Bolt实例都收到相同的输入数据的情况,比如广播消息。

。。。

tasks

task 是一个执行单元,负责运行用户定义的逻辑,每个 task 都是 spout 或者 bolt 的一个实例

每个 spout 或者bolt 在整个集群中会执行多个任务,每个任务都会对应一个线程去执行

一个线程可以运行一个或多个任务,默认情况下是一个,但也可以配置一下让一个线程去运行多个任务,尽管比较少见。

可以通过 TopologyBuilder 的 setSpout 和 setBolt 方法来设置他们的并行性。比如设置为4,那么对应的 spout 或者 bolt 就会有4个线程

worker

拓扑在一个或多个 worker 进程中执行。每个 worker 进程都是一个独立的 JVM 进程,执行拓扑的所有任务的一个子集。一个 worker 进程可以启动多个线程来执行拓扑中的 spout 或 bolt 组件。

集群中的每个物理节点可以运行多个 worker,取决于物理节点 (Supervisor) 配置的 slot 数量,每个 slot 对应一个 worker

例如,如果拓扑的综合并行度为 300,并分配了 50 个 worker,那么每个 worker 将执行 6 个任务(作为 worker 内的线程)。Storm 会尽量将任务平均分配给所有 worker。

当一个 topology 被提交到 storm 集群时,Nimbus(主节点)会决定如何在集群中分配 worker。然后,Supervisor(工作节点)会根据Nimbus的指示启动相应的worker进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值