流计算概念
实时获取来自不同数据源的海量数据经过实时分析处理,获得有价值的信息。
流计算基本理念
- 数据的价值会随着时间的流逝而降低
- 流计算处理引擎应该满足低延迟、可扩展、高可靠
流计算系统要求
高性能、海量式、实时性、分布式、易用性、可靠性
Storm
- 可以简单、高效、可靠地处理流数据,支持多种编程语言,处理非常灵活
- 可以非常方便地与现有的数据库系统产品进行融合,从而开发出非常强大的实时计算系统
Stream
- Storm将流数据Stream描述成一个无限的Tuple序列,这些Tuple序列会以分布式的方式并行地创建和处理
- 每个tuple是一堆值,每个值都有一个名字,并且每个值可以是任何类型
- Tuple本来应该是一个Key-Value的Map,但是由于各个组件之间传递的tuple的字段名称已经事先定义好了,所以tuple只需要按序填入各个Value,所以是一个Value List。
Spout
- Storm认为每个Stream都有一个源头,并且把则会个源头抽象为Spout
- 通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,发送到Stream中
- Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停地调用该函数
Bolt
- Storm将Stream的状态转换过程抽象为Bolt
- Bolt既可以处理Tuple,也可以将处理后的Tuple作为新的Streams发送给其他Bolt
- Bolt可以执行过滤、函数操作、Join、操作数据库等任何操作
- Bolt是一个被动的角色,其接口中有一个execute(Tuple input)方法,在接收到消息后会调用此函数,用户可以在此方法中执行自己的处理逻辑
- 总的来说Bolt的作用是:处理Tuples、创建Streams
- 往往是多个Bolt一起完成整个流处理
Topology
类似于Hadoop中的job
Stream Groupings
- ShuffleGrouping,随机分组,随机分发Stream中的Tuple,保证每个Bolt的Task接收Task接收Tuple的数量大致相等
- FieldsGrouping,按照字段分组,保证相同字段的Tuple分配到同一个Task中
- AllGrouping,广播发送,每一个Task都会收到所有的Tuple
- NonGrouping,不分组,和ShuffleGrouping类似,当前Task的执行会和它的订阅者在同一个线程中执行
- DirectGrouping,直接分组,直接指定由某个Task来执行Tuple的处理
- GlobalGrouping,全局分组,所有的Tuple都发送到同一个Task中
Storm框架设计
- Storm集群采用“Master-Worker”的节点方式
- Master节点运行名为“Nimbus”的后台程序(类似于Hadoop中的“JobTracker”),负责在集群范围内分发代码,为Worker分配任务和监测故障
- Worker节点运行名为“Supervisor”的后台程序,负责监听分配给他所在机器的工作,即根部Nimbus分配的任务来决定或启动Worker进程,一个Worker节点上同时运行若干个Worker进程
- Storm使用Zookeeper来作为分布式协调组件,负责Nimbus和多个Supervisor之间的所有协调工作
- 借助于Zookeeper,如果Nimbus进程或者Supervison进程意外终止,重启时也能读取、恢复之前的状态,并继续工作,使Storm极其稳定
- Executor,executor是产生于worker进程内部的线程,会执行同一个组件的一个或者多个task,通常来说,task会由并发数指定,而executor的数目会小于task数目,这很合理
- 实际的数据处理由Task完成
注:本内容为听课笔记