• 附3、Storm课程学习整体思路及问题 ---没用


    问题:
    1、集群如何启动,任务如何执行?
    java -server nimubs,supervisor
    client--->createTopology(序列化)--->提交jar到nimbuinbox--->nimbus分配任务(task总数/worker数)---写到zk。
    启动worker<------识别自己的任务<----supervisor---->watch----zk
    启动Spout/Bolt----TaskInfo<------worker---->zk
    集群架构中的各个模块如何启动?
    nimbus:用户启动
    supervisor:用户启动
    worker:supervisor启动
    Task:worker启动

    任务如何分配,如何执行?
    看图说话

    2、集群如何通信?
    集群架构中的各个模块是如何通信的?外部通信
    拓扑程序中的各个Task是如何通信的?内部通信

    3、如何保证消息的不丢失
    ack-fail机制如何实现的?
    成功:ack方法
    失败:fail方法

    4、[动手练习]尝试自己实现一个类似storm数据执行的框架

    1,任务分配
    ----->Task总数
    ----->可用worker数量
    2,通信机制
    ----->去zk获取每个组件的任务
    ----->启动不同服务
    nimbus,手动 java -server xxx.jar main-class
    superv,手动 java -server xxx.jar main-class
    worker,supervisor启动------java -server xxx.jar main-class(main(Worker.mk_work(new Worker())))
    Task, Worker启动Task--------Jvm--->Task.mk_Task()
    3,心跳机制
    10:18 client:thread1---zk ---tag=true{object{javaBean}}
    10:19 server:thread2------>thread1tag=true------thread1tag=false
    10:19 30s client:thread1------>thread1tag=true------thread1tag=false------thread1tag=true
    10:20 server:thread2------>thread1tag=true------thread1tag=false------thread1tag=true------thread1tag=false

    4、任务执行(数据流)
    spout.nextTuple(tuple)----streamGrouping---> incomingQueue-------->bolt1.exeute(tuple)-----streamGrouping----> incomingQueue-------->bolt2.exeute(tuple)

    [实现数据执行的框架]
    spout-----线程1
    incomingQueue------queue
    bolt1-----线程2
    incomingQueue------queue
    bolt2-----线程3

    需要技术:
    线程池----->Exeutes.newFixPool(3)
    队列------->ArrayBolckingQueue(1000)

    伪代码:

    MyStrom{
    main(){
    //1、配置一个线程池
    //2、向线程池中提交任务
    spoutOutPutQueue = new ArrayBolckingQueue(1000)
    submit(new MySpout(spoutOutPutQueue))------collector.emit(tuple)------spoutOutPutQueue
    bolt1OutPutQueue = new ArrayBolckingQueue(1000)
    submit(new MyBolt1(spoutOutPutQueue,bolt1OutPutQueue))------>spoutOutPutQueue---->bolt1.execute(),collector.emit(tuple)------bolt1OutPutQueue
    submit(new MyBolt1(bolt1OutPutQueue))------>spoutOutPutQueue---->bolt1.execute()
    }
    }
    5、Storm ack-fail机制源码核心类
    com.alibaba.jstorm.task.execute.spout.SpoutBatchCollector
    sendSpoutMsg 将新的tuple保存到缓存中
    sendBatch 发送数据-----发送两类数据---(dataTuple,ackTuple) dataTuple中包含一个messageID对象
    -ack-init
    com.alibaba.jstorm.task.execute.BoltBatchCollector
    sendBatch 批量发送,从messageID对象解析并ackTuple
    -ack_ack
    com.alibaba.jstorm.task.acker.Acker
    -ack-init
    -ack_ack









  • 相关阅读:
    Don’t Cross 32 GB!
    Kafka 是如何保证数据可靠性和一致性
    水塘抽样(Reservoir Sampling)问题
    实际场景HBase读写设计与实践
    Spark2.3整合kafka010手动管理offset
    周期性清除Spark Streaming流状态的方法
    Spark状态管理State的应用
    Effective C++
    马尔科夫链模型
    非线性规划
  • 原文地址:https://www.cnblogs.com/shan13936/p/13838439.html
Copyright © 2020-2023  润新知