基本概念
- worker:指一个node服务上运行的JVM进程
- Executor:线程
- task:spout或bolt的实例
一个topology会指定一个或多个worker执行;一个worker有多个excutor,默认一个executor分配一个task,但可以指定一个executor有几个task
- 数据分流
- 随机,shuffling:每个task接收的tuple相同
- 分组:按字段group by,字段相同的会落到同一个bolt的task处理
- 全局:所有tuple映射到唯一的task
事务保证
- 每个批次的数据自动ACK
- 失败重发:spout重发数据
- 事务信息:每个批次数据包含一个事务ID,在重发时,开发者根据事务信息判断数据第一次到达和重发时不同的处理逻辑,保证幂等性。
spout的可靠性
spout记录它发出去的所有原始tuple,当下游bolt处理tuple或子tuple失败时能够重新发送tuple。子tuple可以理解为经过bolt处理后作为结果发出去的tuple。
bolt每处理完一个tuple都要向上游发送失败或成功确认。spout收到ack做应答确认,fail做失败重发
这里又跟告警引擎里的 分发节点 分发某个规则的监控对象时,部分失败了,部分成功了,如何保证可靠性的问题 是类似的。
bolt可靠性
将收到和tuple和处理后的tuple绑定,方便失败时一级一级往上ack
如何保证 exactly once
实现 Exactly Once 语义,则需要在 At Least Once 的基础上进行状态的存储,用来防止重复发送的数据被重复处理,在 Storm 中使用 Trident API 实现。
Exactly Once 中,消息不丢失、不重复,因此需要在 At Least Once 的基础上保存相应的状态,表示上游的哪些消息已经成功发送到下游,防止同一条消息发送多次给下游的情况。
数据存储
- 中间表数据: 如计算UV时的明细数据。
- 结果表
- 维表
一般采用Habse存储,Hbase单张表大小可存储几TB或更大,而关系型数据库必须分库分表才能做到。并且Hbase多并发读写效率高。
但Habse 不支持like查询,多个维度时指定维度查询等