storm-内部细节


nimbus:topology提交
     - 命令行
          storm jar allmycode.jar org.me.MyTopology arg1 arg2 arg3
     - 执行步骤
          -  上传topology的代码
               - 由Nimbus$Iface的执行
                    - 通过beginFileUpload,uploadChunk,finishFileUpload上传jar包
                    - 上传到nimbus服务器的 nimbus/inbox/ 目录
          -  运行topology前置校验
               - storm是否运行中
               - 是否有同名topology
               - 因代码中会指定spout,bolt的id,所以storm要检查是否有其他spout,bolt使用相同id
          -  建立topology本地目录
               - 建立 nimbus/stormdist/下的
                    {topology-id}/
                         stormjar.jar          该topology的所有代码
                         stormcode.ser       该topology对象的序列化
                         stormconf.ser        该topology的配置
          - 建立topology在zookeeper上的心跳目录
               - 要求task向它提交心跳情况     
                    - 未及时提交心跳的task,其上任务会被重新分配
                         taskbeats/
                              {topology-id}/
                                   {task-id}
          - 计算topology工作量
               - 根据topology定义中的paramllelism hint
                    - 给spout/bolt设定task数目
                    - 分配对应task-id
                    - 将分配的task信息写入zookeeper的 task/ 目录
                    - 计算案例示意:
                         - 前提
                              topology中有,一个spout,一个bolt          
                              spout的 paramllelism = 2
                              bolt的 paramllelism = 4
                         - 结果
                              工作量 = 2 + 4 = 6
                              在task/{topology-id}/ 下有6个以不同 {task-id} 命名的文件
           - 将计算好的工作分配给supervisor执行
               - 将task分配给某server:port
                    - 分配信息会写入 zookeeper 的 assignments/{topology-id}
          - 启动执行
               - 对nimbus,将task信息写入zookeeper,就等于该工作完成

supervisor:执行任务
     -  定时查询是否有可执行的任务
          - 实现:supervisor.clj的synchronize-supervisor()和syncprocess()中
     - 步骤
          ( 可优化的:前两部分可以拆分出来执行)
          - 查询storm中是否有(新提交)未下载的topology代码
               - 有则去下载(无论该topology是否由该supervisor去执行)
          - 删除不再执行的topology代码
          - 查询nimbus分配的任务(nimbus生成的task-id,会对应到topology的spout/bolt)
               - supervisor启动worker以执行
                    
worker:实际的执行器
     - 步骤
          - 查询zookeeper,看分配的task-ids
          - 根据task-id查询对应的topology的spout/bolt
          - 根据2.中的spout/bolt得到task(supervisor:port)
          - 对3.中的task建立连接,发送所需信息

topolgy:终止
     - 命令行
          storm kill {stormname}
     - 步骤
          - 同步清理
               - zookeeper上的 /tasks, /assigements, /storms 相关数据
          - 异步清理                        
               - supervisor下次从zookeeper同步数据时清除
                    - zookeeper上的 /taskbeats, /taskerrors 下数据

你可能感兴趣的:(storm,大数据,机制,实时计算)