浅谈Storm在zookeeper上的目录结构
Storm的所有的状态信息都保存在Zookeeper里面,nimbus通过在zookeeper上面写状态信息来分配任务:
使得nimbus可以监控整个storm集群的状态,从而可以重启一些挂掉的task。ZooKeeper使得整个storm集群十分的健壮-—任何一台工作机器挂掉都没有关系,只要重启然后从zookeeper上面重新获取状态信息就可以了。那Storm在zookeeper里面存储了哪些状态呢?在JamesXu的文章中有所涉及,但是该文章讲述的已经过时了。本文主要介绍Storm在ZooKeeper中保存的数据目录结构,源代码主要是:backtype.storm.cluster。
关于storm操作zookeeper的详细分析请参见:源码阅读之storm操作zookeeper-cluster.clj
Zookeeper的操作
(defprotocolClusterState (set-ephemeral-node[thispathdata]) (delete-node[thispath]) (create-sequential[thispathdata]) (set-data[thispathdata]);;ifnodedoesnotexist,createpersistentwiththisdata (get-data[thispathwatch?]) (get-children[thispathwatch?]) (mkdirs[thispath]) (close[this]) (register[thiscallback]) (unregister[thisid]) )
Storm使用Zookeeper的操作
(defprotocolStormClusterState (assignments[thiscallback]) (assignment-info[thisstorm-idcallback]) (active-storms[this]) (storm-base[thisstorm-idcallback]) (get-worker-heartbeat[thisstorm-idnodeport]) (executor-beats[thisstorm-idexecutor->node+port]) (supervisors[thiscallback]) (supervisor-info[thissupervisor-id]);;returnsnilifdoesn'texist (setup-heartbeats![thisstorm-id]) (teardown-heartbeats![thisstorm-id]) (teardown-topology-errors![thisstorm-id]) (heartbeat-storms[this]) (error-topologies[this]) (worker-heartbeat![thisstorm-idnodeportinfo]) (remove-worker-heartbeat![thisstorm-idnodeport]) (supervisor-heartbeat![thissupervisor-idinfo]) (activate-storm![thisstorm-idstorm-base]) (update-storm![thisstorm-idnew-elems]) (remove-storm-base![thisstorm-id]) (set-assignment![thisstorm-idinfo]) (remove-storm![thisstorm-id]) (report-error[thisstorm-idtask-iderror]) (errors[thisstorm-idtask-id]) (disconnect[this]) )
Storm中在Zookeeper中存储的目录
(defASSIGNMENTS-ROOT"assignments") (defCODE-ROOT"code") (defSTORMS-ROOT"storms") (defSUPERVISORS-ROOT"supervisors") (defWORKERBEATS-ROOT"workerbeats") (defERRORS-ROOT"errors") (defASSIGNMENTS-SUBTREE(str"/"ASSIGNMENTS-ROOT)) (defSTORMS-SUBTREE(str"/"STORMS-ROOT)) (defSUPERVISORS-SUBTREE(str"/"SUPERVISORS-ROOT)) (defWORKERBEATS-SUBTREE(str"/"WORKERBEATS-ROOT)) (defERRORS-SUBTREE(str"/"ERRORS-ROOT))
1./assignments->任务分配信息
2./storms->正在运行的topology的ID
3./supervisors->所有的Supervisors的心跳信息
4./workerbeats->所有的Worker的心跳
5./errors->产生的出错信息
结构图
/-{storm-zk-root}--storm在zookeeper上的根目录(默认为/storm) | |-/assignments--topology的任务分配信息 || ||-/{topology-id}--这个目录保存的是每个topology的assignments信息包括:对应的nimbus上 |--的代码目录,所有task的启动时间,每个task与机器、端口的映射。操作为 |--(assignments)来获取所有assignments的值;以及(assignment-infostorm-id) |--来得到给定的storm-id对应的AssignmentInfo信息 |--在AssignmentInfo中存储的内容有: |--:executor->node+port:executor->start-time-secs:node->host |--具体定义在common.clj中的 |--(defrecordAssignment[master-code-dirnode->hostexecutor->node+portexecutor->start-time-secs]) | |-/storms--这个目录保存所有正在运行的topology的id || || ||-/{topology-id}--这个文件保存这个topology的一些信息,包括topology的名字,topology开始运行 |--的时间以及这个topology的状态。操作(active-storms),获得当前路径活跃的下 |--topology数据。保存的内容参考类StormBase;(storm-basestorm-id)得到给定的 |--storm-id下的StormBase数据,具体定义在common.clj中的 |--(defrecordStormBase[storm-namelaunch-time-secsstatusnum-workerscomponent->executors]) | |-/supervisors--这个目录保存所有的supervisor的心跳信息 || || ||-/{supervisor-id}--这个文件保存supervisor的心跳信息包括:心跳时间,主机名,这个supervisor上 |--worker的端口号,运行时间(具体看SupervisorInfo类)。操作(supervisors)得到 |--所有的supervisors节点;(supervisor-infosupervisor-id)得到给定的 |--supervisor-id对应的SupervisorInfo信息;具体定义在common.clj中的 | |--(defrecordSupervisorInfo[time-secshostnameassignment-idused-portsmetascheduler-metauptime-secs]) | |-/workerbeats--所有worker的心跳 || ||-/{topology-id}--这个目录保存这个topology的所有的worker的心跳信息 || ||-/{supervisorId-port}--worker的心跳信息,包括心跳的时间,worker运行时间以及一些统计信息 | |--操作(heartbeat-storms)得到所有有心跳数据的topology, |--(get-worker-heartbeatstorm-idnodeport)得到具体一个topology下 |--的某个worker(node:port)的心跳状况, |--(executor-beatsstorm-idexecutor->node+port)得到一个executor的心跳状况 | |-/errors--所有产生的error信息 | |-/{topology-id}--这个目录保存这个topology下面的错误信息。操作(error-topologies)得到出错 |--的topology;(errorsstorm-idcomponent-id)得到 |--给定的storm-idcomponent-id下的出错信息 |-/{component-id}
总结
以上就是本文关于浅谈Storm在zookeeper上的目录结构的全部内容,感兴趣的朋友可以参阅:apachezookeeper使用方法实例详解、为zookeeper配置相应的acl权限、zookeeperwatch机制的理解等,如有不足之处,欢迎留言指出,希望对大家有所帮助。感谢朋友们对本站的支持!