Storm基础篇八-本地模式

483 阅读3分钟

Local Mode

本地模式是一种模拟 Storm 集群的工作方式,有益于开发和测试拓扑。在本地模式运行拓扑以模拟拓扑在集群中运行。

有两种方式可以在本地模式运行拓扑。最常用的方式是通过 storm local 执行拓扑而不是 storm jar

这将创建一个本地模拟集群,并且强制所有与nimbus之间的交互都通过本地集群而不是一个单独的进程。默认情况下,拓扑将在模拟集群上运行20s然后关闭集群。你可以通过 --local-ttl 命令行参数来设置拓扑运行的秒数。

Programmatic

如果想进行一些自动化测试,但不实际启动storm群集,那么可以在内部使用与“storm local”相同的类来完成。
为此,首先需要引入访问这些类所需的依赖项。对于java API,应该依赖于'storm server'作为'test'依赖项。
要创建进程内集群,只需使用LocalCluster类,示例如下。此外,LocalCluster类除默认构造器外,还可传入一个已存在的zookeeper集群来创建 LocalCluster,如 LocalCluster(String zkHost, Long zkPort)

import org.apache.storm.LocalCluster;

...

try (LocalCluster cluster = new LocalCluster()) {
    //Interact with the cluster...
}

然后就可以通过LocalCluster对象的submitTopology方法提交拓扑。与StormSubmitter上的相应方法一样,submitTopology方法接收拓扑名称、拓扑配置以及拓扑对象作为输入参数,代码如下。然后可以使用killTopology方法传入拓扑名称作为参数的方式来终止拓扑。

public static void submitTopology(String name,
                                  Map<String,Object> topoConf,
                                  StormTopology topology,
                                  SubmitOptions opts,
                                  StormSubmitter.ProgressListener progressListener)
                           throws AlreadyAliveException,
                                  InvalidTopologyException,
                                  AuthorizationException

本地集群是自动关闭的,也可以调用close来关闭。许多 Nimbus API 也可以通过 LocalCluster 获得。

使用IDE调试拓扑

本地模式最大的用处在于可以使用IDE遍历执行你的 bolts 和 spouts 代码。你可以在命令行传递给 jdwp 的参数后添加--java-debug选项来实现这一点。这使得在启用-agentlib:jdwp=的情况下启动本地集群变得简单。
在通过IDE运行时,可以通过调用LocalCluster.withLocalModeOverride来修改代码运行。

public static void main(final String args[]) {
    LocalCluster.withLocalModeOverride(() -> originalMain(args), 10);
}

或者也可以修改IDE,使其在启动时运行“org.apache.storm.LocalCluster”而不是主类,并将类的名称作为参数传递给它。这也将触发本地模式,这就是storm local的幕后作用。

本地模式的常用配置

你可以在这里找到完整的配置选项。以下是几个比较有用的配置项说明:

  1. Config.TOPOLOGY_MAX_TASK_PARALLELISM:该配置项设置了单个组件(bolt/spout)的线程数上限。生产环境下的拓扑往往含有很高的并行度(数百个线程),导致在本地模式下测试拓扑时会有较大的负载。这个配置项可以让你很容易地控制并行度。
  2. Config.TOPOLOGY_DEBUG:此配置项设置为 true 时,Storm 会打印出 spout 或者 bolt 每一次发送消息的日志记录。这个功能对于调试拓扑很有用。

与所有其他配置一样,在使用“-c”标志启动拓扑时,可以在命令行上设置这些配置。该标志的形式为-c<conf_name>=<JSON_VALUE>,在本地模式下启动拓扑调试时也一样。

These, like all other configs, can be set on the command line when launching your topology with the -c flag. The flag is of the form -c <conf_name>=<JSON_VALUE> so to enable debugging when launching your topology in local mode you could run

storm local topology.jar <MY_MAIN_CLASS> -c topology.debug=true

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

参考资料