streaming API java开发-1

streaming组件流程
streaming API java开发-1_第1张图片
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
    streaming API java开发-1_第2张图片
    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(不分组) 当前和随机分组相同

你可能感兴趣的:(streaming API java开发-1)