storm编程模型
Topologies
Streams
Spouts
Bolts
Storm核心组件
Topologies
Streams
Spouts
Bolts
Stream groupings
Reliability
Tasks
Workers
具体介绍如下:
topology 是storm中运行的一个实时应用程序的名称(拓扑),因为各个组件间的消息流动而形成逻辑上的拓扑结构。
stream 表示数据的流向,流式Storm的核心抽象。一个流是一个无界Tuple序列,Tuple可以包含整性、长整型、短整型、字节、字符、双精度数、浮点数、布尔值和字节数组。用户可以通过定义序列化器,在本机Tuple使用自定义类型;
spout 在一个topology中获取源数据流的组件,通常情况下spout会从外部数据源读取数据,然后转换为topology内部的源数据;
bolt 接收数据,然后执行处理的组件,用户可以其中执行自己想要的操作(Bolt可以完成过滤、业务处理、连接运算、连接访问数据库等业务);
stream grouping(流分组) 流分组是拓扑定义的一部分,为每个Bolt指定应该接收哪个流作为输入。在bolt的任务中定义流应该如何分区,Storm有7个内置的流分组接口(随机分组(Shuffle grouping)、字段分组(Fields grouping)、全部分组(All grouping)、全局分组(Global grouping)、无分组(None grouping)、直接分组(Direct grouping)、本地或随机分组(Local or shuffle grouping))
Worker(工作进程)是Spout/Bolt中运行具体处理逻辑的进程。Topology跨一个或多个Worker节点的进程执行,每个Worker节点的进程是一个物理的JVM和Topology执行所有任务的子集。
Task(任务) Worker中每一个Spout/Bolt的线程称为一个任务。每个spout或bolt在集群执行许多任务,每个任务对应一个线程的执行,流分组定义如何从一个任务集到另一个任务集发送Tuple。可通过TopologyBuilder类的setSoupt()和setBolt()方法来设置每个spout或bolt的并行度(parallelism)。
总结如下:
Topologies:
拓扑结构对象
storm是以topologies为单位,来运行作业
Spouts:
数据的产生源头
Bolts:
处理数据的逻辑
tuples:传输数据,此数据是封装到tuples对象实现
分析storm编程核心的api
配置pom文件
ISpout接口
ISpout是实现Spout的核心接口, Spout负责将数据送到topology中处理, Storm 会跟踪Spout发出的tuple的DAG:
当Storm发现tuple的DAG成功的执行处理, 会发送一个ack message给spout,
当执行失败, 会发送以fail message 给spout;
ISpout接口特点
1.Spout每次释放tuple, 都会用一个id标记该tuple, 这个id可以是任何类型, 当storm ack 或fail一个message, 就会通过id来追溯到和那个Spout相关联,如果spout省略了id,或设置一个null, 那么storm就不追溯到这个tuple信息, 那就无法反馈ack或fail信息,spout也无法收到信息。
2.Storm在相同的线程中执行ack , fail , nextTuple,这意味着ISpout的实现者不用考虑这些方法的并发性问题, 但是,同时要保证nextTuple方法不能阻塞,否侧导致ack, fail被阻塞,等待执行,然而fail的timeout决定不能被阻塞。
ISpout方法
//当Spout组件初始化时,触发调用此方法
//SpoutOutputCollector:用于发送数据到下游组件
void open(Map conf, TopologyContext context, SpoutOutputCollector collector);
//产生数据,并且发送数据到下游组件
void nextTuple();
//数据发送成功,则回调此方法
void ack(Object msgId);
//数据发送失败,则回调此方法
void fail(Object msgId);
IBolt接口
职责:接收tuple处理,并进行相应的处理(filter/join/....) hold住tuple再处理IBolt会在一个运行的机器上创建,使用Java序列化它,然后提交到主节点(nimbus)上去执行nimbus会启动worker来反序列化,调用prepare方法,然后才开始处理tuple处理
prepare:初始化
execute:处理一个tuple,tuple对象中包含了元数据信息
cleanup:shutdown之前的资源清理操作
bolt 接收数据,然后执行处理的组件,用户可以其中执行自己想要的操作(Bolt可以完成过滤、业务处理、连接运算、连接访问数据库等业务);
stream grouping(流分组) 流分组是拓扑定义的一部分,为每个Bolt指定应该接收哪个流作为输入。在bolt的任务中定义流应该如何分区,Storm有7个内置的流分组接口(随机分组(Shuffle grouping)、字段分组(Fields grouping)、全部分组(All grouping)、全局分组(Global grouping)、无分组(None grouping)、直接分组(Direct grouping)、本地或随机分组(Local or shuffle grouping))
//当bolt组件初始化时,触发此方法
void prepare(Map stormConf, TopologyContext context, OutputCollector collector);
//此方法接受上游数据,并且处理数据
void execute(Tuple input);
void cleanup();