Storm基础篇十-在生产集群中运行topology

253 阅读4分钟

在生产集群上运行topology任务

在生产集群上运行topologys和在本地模式运行相似,以下是步骤:

  1. 定义好topology。(如果用的是java的话,用TopologyBuilder
  2. StormSubmitter向storm集群提交topology。StormSubmitter接受“topology名字, topology配置, topology”作为参数。 例如:
Config conf = new Config();
conf.setNumWorkers(20);
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);
  1. 将你的代码打成jar包。你可以选择将topology所依赖的所有jar包都打包进jar(storm除外,storm相关jar包已添加到worker节点的classpath上)。可以利用 Storm 中的 Classpath handling 特性来使用外部库,而无需将它们捆绑到你的拓扑 JAR 中。

如果你使用的是maven,那么可以通过 Maven Assembly Plugin 来打包你的 topology,只需要在 pom.xml 文件中添加:

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>  
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.path.to.main.Class</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

然后执行mvn assembly:assembly来得到一个合适的jar包。确保 exclude Storm相关的jars(storm集群的类路径上已有)。 4. 使用storm提交topology到集群中,需要指明你jar所在路径,topology的主类名以及将使用的参数。例如:

storm jar path/to/allmycode.jar org.me.MyTopology arg1 arg2 arg3

其中,storm jar 会将 jar 提交到集群并配置 StormSubmitter 类来和正确的集群通信。 在此示例中,上传 jar 后,storm jar 使用参数“arg1”、“arg2”和“arg3”调用 org.me.MyTopology 上的主函数。

你可以通过 Setting up development environment 来了解如何配置你的 storm 客户端以正确的和storm集群通信。

常用配置

这里有一些常用的配置你可以在你的每个topology中设置。所以你可以设置的配置都可以在这里找到。可以在特定于拓扑的基础上覆盖以“TOPOLOGY”为前缀的那些(其他的是集群配置,不能被覆盖)。 以下是为拓扑设置的一些常见设置:

  1. Config.TOPOLOGY_WORKERS: 这个用于设置topology执行的 worker 的数量。例如,如果你设置为25,那么在集群中将会有25个java进程来执行所有的tasks。如果在拓扑中的所有组件上总计设置了 150 个并行度,则每个 worker 进程将有 6 个 task 作为线程在其中运行。
  2. Config.TOPOLOGY_ACKER_EXECUTORS: 这个配置项用于设置将跟踪元组树并检测 spout 元组何时被完全处理的执行器的数量。 Ackers 是 Storm 可靠性模型不可或缺的一部分,详情可参考Guaranteeing message processing。若不设置此变量或将其设置为 null,Storm 会将 acker 执行器的数量设置为等于为此拓扑配置的 worker 的数量。 如果此变量设置为 0,那么 Storm 将在元组离开 spout 时立即确认,从而有效地禁用可靠性。
  3. Config.TOPOLOGY_MAX_SPOUT_PENDING: 此变量用于设置一次可以在单个 spout 任务上挂起的 spout 元组的最大数量(挂起意味着元组还没有被确认或失败)。 强烈建议设置此配置以防止队列爆炸。
  4. Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS: 这是 spout 元组在被视为失败之前必须完全完成确认的最长时间。(也就是tuple超时时间) 该值默认为 30 秒,这对于大多数拓扑来说已经足够了。更多信息可参考Guaranteeing message processing
  5. Config.TOPOLOGY_SERIALIZATIONS: 你可以使用此配置向 Storm 注册更多序列化程序,以便可以在元组中使用自定义类型。

停止一个topology任务

若需要停止一个topology,仅需执行:

storm kill {stormname}

storm kill命令指定你提交topology时所使用的名称。 Storm 并不会立即将 topology 停止。相反,它会停用所有 spouts 以使它们不再发出任何元组,然后storm 将在等待Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS秒后销毁所有的 worker。 这使拓扑有足够的时间来完成它被停止时正在处理的任何元组。

更新正在运行的topology

如果需要更新正在运行的拓扑,目前唯一的选择是终止当前拓扑并重新提交新拓扑。 未来希望通过“storm swap”命令,将正在运行的拓扑与新拓扑进行交换,以确保最少的停机时间,并且两个拓扑不会同时处理元组。

监控 topologies

监控拓扑的最好的方法是使用 Storm UI。 Storm UI 提供有关任务中发生的错误的信息以及有关每个运行拓扑的每个组件的吞吐量和延迟性能的细粒度统计信息。

当然还可以查看集群机器上的工作日志。

该博客仅为初学者自我学习的记录,粗浅之言,如有不对之处,恳请指正。

参考资料