• 附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









  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/shan13936/p/13838439.html
Copyright © 2020-2023  润新知