streaming组件流程
Worker的启停:如果死掉了就死掉了 自动重试 不是自己 而是nimbus通过zookeeper接受worker的心跳得知
1.客户端提交任务jar包给nimbus
2.nimbus上交给zookeeper
3.supervisor 得知有任务之后从zookeeper下载 到nimbus上下载jar包
4.启动worker 向zookeeper注册
5.如果故障则通过心跳线传给zookeeper nimbus通过监视器得知 重启
6.supervisor 的死活:nimbus
接口和类的区别
接口是对动作的抽象,抽象类是对根源的抽象
抽象类表示的是:这个对象是什么
接口表示的是:这个对象能做什么
男人,女人 | |
---|---|
类 | 抽象类:人,说明他们都是人 |
接口 | 人可以吃东西 狗也可以吃东西,把“吃东西”定义成一个接口让类去实现 |
so | 一个类只能继承一个类(抽象类),正如人不可能同时是生物和非生物,但能实现多个接口 |
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的
-
ispout接口:
实现spout的核心接口 Spout负责将数据送到topology中处理 Storm会跟踪Spout发出的tuple的DAG
成功:发送ack message---->spout失败:发送 fail message------>spout -
特点:spout每次释放tuple都会用id标记该tuple ,id可以是任意类型 当storm ack 或fail 一个message 就会通过id来追溯spout
Storm 在相同的线程中执行ack,fail nextTuple Ispout的实现者不用考虑这些方法的并发性 nextTuple方法不能阻塞 -
方法:
open(Map conf,TopologyContext context,SpoutOutCollector collector)
初始化时被调用 提供spout 运行环境
conf:对spout的配置
context:可以获得任务的信息 如task id ,component(元件) id 输入输出信息等
collector:可以发送tuple -
Close() Spout被shutdown时调用 不能保证一定被调用
-
activate():当spout从未激活状态激活时调用,接下来会调用nextTuple方法
-
deactivate()spout失效时被调用
-
nextTuple():当storm需要spout发射tuple时调用 循环调用 读一个发一个
-
ack() 当tuple完全处理结束调用 整个生命周期都成功处理 如果成功,回调ack方法
-
fail() 处理失败时调用 如果失败,回调fail 重发失败的tuple
-
declareoutputField() 宣称key
IBolt接口 是Bolt的基础接口 IrichBolt:实现了ibolt和icomponent Ibasebolt:直接实现icomponent接口 -
职责:接收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();
类
BaseRichSpout | 隐式实现了ack方法和fail方法,抽象类 人类{呼吸()吃饭(){}说话(){}} | BaseRichBolt | 实现了IrichBolt接口 |
---|---|---|---|
RandomsenteceSpout | 类继承了BaseRichSpout类 非抽象类,必须实现父类中全部抽象的方法 | BaseBasicBolt | IbasicBolt接口 |
分组类型
- FieldGrouping(字段分组) 按照消息的哈希值分组发送给目标bolt的task
- globalGrouping(全局分组) 所有消息都发送给目标bolt的固定一个task
- shuffleGrouping(随机分组) 消息发送给目标bolt的随机一个task
- localOrShuffleGrouping(本地或者随机分组) 如果目标bolt和本Spout/bolt在同一个工作进程存在一个或多个task,数据会随机分配给这些task
,否则,改分组方式与随机分组方式相同 - allGrouping(广播分组) 消息发给目标bolt的所有task
- directGrouping(直接分组) 由数据生产者决定数据发送给目标bolt的哪个task,需在发送时使用emitDirect(taskID,tuple)接口指定TaskID
- partialKeyGrouping(局部字段分组) 更均衡的字段分组
- noneGrouping(不分组) 当前和随机分组相同