zoukankan      html  css  js  c++  java
  • [zz]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的出错信息

    我们知道,storm集群里面工作机器分为两种一种是nimbus, 一种是supervisor, 他们通过zookeeper来进行交互,nimbus通过zookeeper来发布一些指令,supervisor去读zookeeper来执行这些指 令。上面主要是nimbus和supervisor在zookeeper上交换了哪些信息,下面是nimbus和zookeeper在自己本机存的信息。代码主要包括config.clj, nimbus.clj, supervisor.clj, worker.clj

    注意:下面目录结构里面, nimbus机器上面只有/nimbus目录,supervisor机器上面只有/supervisor目录和/workers目录。

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    /{storm-local-dir}
      |
      |-/nimbus
      |   |
      |   |-/inbox                     -- 从nimbus客户端上传的jar包
      |   |  |                            会在这个目录里面
      |   |  |
      |   |  |-/stormjar-{uuid}.jar    -- 上传的jar包其中{uuid}表示
      |   |                               生成的一个uuid
      |   |
      |   |-/stormdist
      |      |
      |      |-/{topology-id}
      |         |
      |         |-/stormjar.jar        -- 包含这个topology所有代码
      |         |                         的jar包(从nimbus/inbox里
      |         |                         面挪过来的)
      |         |
      |         |-/stormcode.ser       -- 这个topology对象的序列化
      |         |
      |         |-/stormconf.ser       -- 运行这个topology的配置
      |
      |-/supervisor
      |   |
      |   |-/stormdist
      |   |   |
      |   |   |-/{topology-id}
      |   |      |
      |   |      |-/resources          -- 这里保存的是topology的
      |   |      |                        jar包里面的resources目录
      |   |      |                        下面的所有文件
      |   |      |
      |   |      |-/stormjar.jar       -- 从nimbus机器上下载来的
      |   |      |                        topology的jar包
      |   |      |
      |   |      |-/stormcode.ser      -- 从nimbus机器上下载来的
      |   |      |                        这个topology对象的序列
      |   |      |                        化形式
      |   |      |
      |   |      |-/stormconf.ser      -- 从nimbus机器上下载来的
      |   |                               运行这个topology的配置
      |   |
      |   |-/localstate                -- supervisor的localstate
      |   |
      |   |-/tmp                       -- 临时目录,从Nimbus上下
      |      |                            载的文件会先存在这个目
      |      |                            录里面,然后做一些简单
      |      |                            处理再copy到
      |      |                            stormdist/{topology-id}
      |      |                            里面去
      |      |-/{uuid}
      |         |
      |         |-/stormjar.jar        -- 从Nimbus上面download下
      |                                   来的工作jar包
      |
      |-/workers
          |
          |-/{worker-id}
              |
              |-/pids                  -- 一个worker可能会起多个子
              |   |                       进程所以可能会有多个pid
              |   |
              |   |-/{pid}             -- 运行这个worker的JVM的pid
              |
              |-/heartbeats            -- 这个supervisor机器上的
                 |                        worker的心跳信息
                 |
                 |-/{worker-id}        -- 这里面存的是一个worker
                                          的心跳:主要包括心跳时
                                          间和worker的id
  • 相关阅读:
    Php compiler for .NET framework
    C++ Virtual Inheritance Memory Layout
    MIT公开课汉化
    OpenGL like Vulkan
    C++ Chrono Timer
    VisTools: C++模仿Java体系
    Lua IDE
    PHP调试
    Decoda
    JSRDB
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2851313.html
Copyright © 2011-2022 走看看