Skip to content
This repository has been archived by the owner on Jun 16, 2023. It is now read-only.

如何本地调试 JStorm 程序

John Fang edited this page Jun 5, 2016 · 3 revisions

如何本地调试 JStorm 程序?

JStorm 提供了两种运行模式:本地模式和分布式模式。本地模式针对开发调试storm topologies非常有用。

如果你还在用日常的web ui提交拓扑这种远古的方式进行调试测试,那就赶快阅读本文吧。本文将介绍在本机不安装JStorm环境的情况下,开发、调试JStorm程序。

  1. 单机模式主要是在代码中加入:

    import backtype.storm.LocalCluster;
    
    LocalCluster cluster = new LocalCluster();
    
    //建议加上这行,使得每个bolt/spout的并发度都为1
    conf.put(Config.TOPOLOGY_MAX_TASK_PARALLELISM, 1);
    
    //提交拓扑
    cluster.submitTopology("SequenceTest", conf, builder.createTopology());
    
    //等待1分钟, 1分钟后会停止拓扑和集群, 视调试情况可增大该数值
    Thread.sleep(60000);		
    		
    //结束拓扑
    cluster.killTopology("SequenceTest");
    
    cluster.shutdown();

    用LocalCluster来模拟集群环境,你可以在LocalCluster对象上调用submitTopology方法来提交拓扑,submitTopology(String topologyName, Map conf, StormTopology topology)接受一个拓扑名称,一个拓扑的配置,以及一个拓扑的对象。就像StormSubmitter一样。你还可以调用killTopology来结束一个拓扑。对应的还有active,deactive,rebalance等方法。由于JStorm是个不会停止的程序,所以我们最后需要显示地停掉集群。

  2. 修改pom.xml

    以jstorm 2.1.1版本为例。

    <dependency>
      <groupId>com.alibaba.jstorm</groupId>
      <artifactId>jstorm-core</artifactId>
      <version>2.1.1</version>
      <!-- keep jstorm out of the jar-with-dependencies -->
      <!-- <scope>provided</scope> -->
    </dependency>

    注意要注释掉jstorm依赖中的<scope>provided</scope>而提交的时候必须记得将这行改回来! 否则会报多个defaults.yaml的错误。

    注:如果依赖的是 0.9.x 版本的jstorm,会有三个依赖包,将这三个依赖的provided都注释掉。

  3. Re-import 项目, 然后运行main class就可以了。

    为了更好的代码组织,建议将本地运行和集群运行写成两个方法,根据参数/配置来调用不同的运行方式。更多可以参照SequenceTopology的例子

  4. 注意点

    本地调试主要是用于测试应用逻辑的,因此有一些限制,如classloader是不起作用的。此外,还需要注意一下你的应用中log4j的依赖,如果应用的依赖中自带了log4j.properties,则有可能导致将jstorm默认的本地测试的log4j配置覆盖掉,从而导致调试时控制台没有任何输出。

Clone this wiki locally