Twitter Storm源代码分析之ZooKeeper中的目录结构

Twitter Storm源代码分析之ZooKeeper中的目录结构

作者:  xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址:  http://xumingming.sinaapp.com/466/twitter-storm-code-analysis-zookeeper-dirs/

 
我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeeper上面写状态信息来分配任务,supervisor,task通过从zookeeper中读状态来领取任务,同时supervisor, task也会定义发送心跳信息到zookeeper, 使得nimbus可以监控整个storm集群的状态, 从而可以重启一些挂掉的task。ZooKeeper 使得整个storm集群十分的健壮 — 任何一台工作机器挂掉都没有关系,只要重启然后从zookeeper上面重新获取状态信息就可以了。本文主要介绍Twitter Storm在ZooKeeper中保存的数据目录结构,源代码主要是: backtype.storm.cluster, 废话不多说,直接看下面的结构图:

一个要注意的地方是,作者在代码里面很多地方用到的storm-id, 其实就是topology-id的意思。我在邮件列表里面问了他一下, 他说以前他把topology叫做storm, 代码里面还没有改过来。

帮助
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/-{storm-zk-root}           -- storm在zookeeper上的根
   |                            目录
   |
   |-/assignments            -- topology的任务分配信息
   |   |
   |   |-/{topology-id}      -- 这个下面保存的是每个
   |                            topology的assignments
   |                            信息包括: 对应的
   |                            nimbus上的代码目录,所有
   |                            task的启动时间,
   |                            每个task与机器、端口的映射
   |
   |-/tasks                  -- 所有的task
   |   |
   |   |-/{topology-id}      -- 这个目录下面id为
   |       |                    {topology-id}的topology
   |       |                    所对应的所有的task-id
   |       |
   |       |-/{task-id}      -- 这个文件里面保存的是这个
   |                            task对应的component-id:
   |                            可能是spout-id或者bolt-id
   |
   |-/storms                 -- 这个目录保存所有正在运行
   |   |                        的topology的id
   |   |
   |   |-/{topology-id}      -- 这个文件保存这个topology
   |                            的一些信息,包括topology的
   |                            名字,topology开始运行的时
   |                            间以及这个topology的状态
   |                            (具体看StormBase类)
   |
   |-/supervisors            -- 这个目录保存所有的supervisor
   |   |                        的心跳信息
   |   |
   |   |-/{supervisor-id}    -- 这个文件保存的是supervisor
   |                            的心跳信息包括:心跳时间,主
   |                            机名,这个supervisor上worker
   |                            的端口号运行时间
   |                            (具体看SupervisorInfo类)
   |
   |-/taskbeats              -- 所有task的心跳
   |   |
   |   |-/{topology-id}      -- 这个目录保存这个topology的所
   |       |                    有的task的心跳信息
   |       |
   |       |-/{task-id}      -- task的心跳信息,包括心跳的时
   |                            间,task运行时间以及一些统计
   |                            信息
   |
   |-/taskerrors             -- 所有task所产生的error信息
       |
       |-/{topology-id}      -- 这个目录保存这个topology下面
           |                    每个task的出错信息
           |
           |-/{task-id}      -- 这个task的出错信息
此条目发表在  clojure,  java,  storm,  源代码分析 分类目录。将 固定链接加入收藏夹。

Twitter Storm源代码分析之ZooKeeper中的目录结构》有 19 条评论

  1. xiaoyu  说:

    顶…

    回复
  2. Pingback 引用通告: Twitter Storm源代码分析之Worker本地目录结构简介 | 徐明明

  3. Pingback 引用通告: Twitter Storm源代码分析之Topology的执行过程 | 徐明明

  4. 陈均  说:

    /taskerrors/{topology-id} /{task-id}下面还有一级目录 是发生错误的时间{time}

    回复
  5. rainbow  说:

    请教一个简单问题:”storm在zookeeper上的根目录”是在zookeeper的哪个目录下?我怎么找不到对应的这些目录?难道是因为我在查看这些目录之前,样例程序已经执行完并将这些目录已经删除了?所以看不到。多谢!

    回复
    • xumingming  说:

      1). 这个目录是可以指定的,默认是在/storm
      2). 你可以在topology正在运行的时候去查看呀。另外记得使用remote cluster哦。使用本地模式的时候zookeeper是线程内模拟的。

      回复
      • rainbow  说:

        谢谢,找到答案了。
        另外,能否给我们初学者介绍一下,如何将storm-starter例子导入eclipse工程,如何采用lein或maven进行编译并打包成jar,以便使用storm jar命令进行执行。

        回复
        • xumingming  说:

          storm-starter主页有详细介绍:https://github.com/nathanmarz/storm-starter

          回复
          • Megusta  说:

            Super jazzed about getting that knwooh-w.

  6. jeff  说:

    徐老师,storm状态的按理会保存storm.zookeeper.root: “/storm”下,但是服务起来后没有发现, 模式是storm.cluster.mode: “distributed”
    请教下怎么回事呢

    回复
    • xumingming  说:

      信息太少,解答不了。先确认一下你的topology都能正常工作么?storm ui上有显示么?

      回复
      • wcz  说:

        我也遇到同样的问题
        ui显示正常,topology工作正常
        但是zookeeper服务器上没有/storm目录
        是什么原因啊

        回复
  7. silver account  说:

    作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://xumingming.sinaapp.com/483/twitter-storm-code-analysis-local-dir/ 我们知道,storm集群里面工作机器分为两种一种是nimbus, 一种是supervisor, 他们通过zookeeper来进行交互,nimbus通过zookeeper来发布一些指令,supervisor去读zookeeper来执行这些指令,具体nimbus和supervisor在zookeeper上交换了哪些信息可以看一下这篇文章: Twitter Storm源代码分析之ZooKeeper中的目录结构。知道了他们在zookeeper存的信息之后,大家一定想知道nimbus和zookeeper在自己本机存了什么信息呢?这篇文章给你介绍。代码主要包括config.clj, nimbus.clj, supervisor.clj, worker.clj。 注意:下面目录结构里面, nimbus机器上面只有/nimbus目录,supervisor机器上面只有/supervisor目录和/workers目录。

    回复
  8. baijd11111  说:

    我也遇到了这个问题。我的storm配置文件是这样的:
    java.library.path: “/usr/local/lib:/opt/local/lib:/usr/lib”
    ### storm.* configs are general configurations
    # the local dir is where jars are kept
    storm.local.dir: “/var/lib/storm/data”
    storm.zookeeper.servers:
    - “10.4.124.144″
    storm.zookeeper.port: 2181
    storm.zookeeper.root: “/storm”
    storm.zookeeper.session.timeout: 20000
    storm.cluster.mode: “distributed” # can be distributed or local
    storm.local.mode.zmq: false
    ### nimbus.* configs are for the master
    nimbus.host: “10.4.124.144″
    nimbus.thrift.port: 6627
    nimbus.childopts: “-Xmx2048m”
    nimbus.task.timeout.secs: 30
    nimbus.supervisor.timeout.secs: 60
    nimbus.monitor.freq.secs: 10
    nimbus.task.launch.secs: 240
    nimbus.reassign: true
    nimbus.file.copy.expiration.secs: 600
    ui.port: 8080
    drpc.port: 3772
    supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
    supervisor.childopts: “-Xmx2048m”
    #how long supervisor will wait to ensure that a worker process is started
    supervisor.worker.start.timeout.secs: 240
    #how long between heartbeats until supervisor considers that worker dead and tries to restart it
    supervisor.worker.timeout.secs: 30
    #how frequently the supervisor checks on the status of the processes it’s monitoring and restarts if necessary
    supervisor.monitor.frequency.secs: 3
    #how frequently the supervisor heartbeats to the cluster state (for nimbus)
    supervisor.heartbeat.frequency.secs: 5
    supervisor.enable: true
    ### worker.* configs are for task workers
    worker.childopts: “-Xmx768m”
    worker.heartbeat.frequency.secs: 1
    task.heartbeat.frequency.secs: 3
    task.refresh.poll.secs: 10
    zmq.threads: 1
    zmq.linger.millis: 5000

    在编写topology时写的是:
    StormSubmitter.submitTopology(……)
    也是按照分布式部署。

    ui上也能显示,但就是在/storm 什么都没有~

    回复
    • plt  说:

      hi 不知道你的问题解决了没有 我在zookeeper下也没有找到storm

      回复
    • plt  说:

      hi 不知道你的问题解决了没有 我在zookeeper下也没有找到storm

      回复
  9. whpcrs  说:

    请问:assignment中task和机器、端口的映射能从zookeeper中看到吗?主要是想看看task具体在哪台机器上跑。

    回复
  10. Pingback 引用通告: IT-Homer 博客 » Storm 相关技术总结

  11. 从zk上获取supervisors下的子目录信息乱码  说:

    如题。使用zkCli的get命令想要获取supervisors下的某个子目录信息时候,返回乱码。请问这个节点力存的是二进制字节流吗?

    回复
    • kk  说:

      我也遇到乱码,有解决方法吗?

      回复

你可能感兴趣的:(Twitter Storm源代码分析之ZooKeeper中的目录结构)