如何在 Eclipse 中调试 Apache Storm?

Posted

技术标签:

【中文标题】如何在 Eclipse 中调试 Apache Storm?【英文标题】:How to debug Apache Storm in Eclipse? 【发布时间】:2015-11-20 11:01:13 【问题描述】:

我们可以使用特定的参数生成storm jar。但是,如果我们需要在本地和远程调试这个项目(实际上很远)?

如果是简单的jar,我们可以调试。但是,在这里我们使用以下命令部署 jar: storm jar project.jar main_class_name

不知道如何部署storm拓扑,以便在调试模式下进行storm项目?

请在下面找到更新的 yaml 文件:

 

    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements.  See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership.  The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License.  You may obtain a copy of the License at
    #
    # http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.

    ########### These MUST be filled in for a storm configuration
    # storm.zookeeper.servers:
    #     - "server1"
    #     - "server2"
    # 
    # nimbus.host: "nimbus"
    # 
    # 
    # ##### These may optionally be filled in:
    #    
    ## List of custom serializations
    # topology.kryo.register:
    #     - org.mycompany.MyType
    #     - org.mycompany.MyType2: org.mycompany.MyType2Serializer
    #
    ## List of custom kryo decorators
    # topology.kryo.decorators:
    #     - org.mycompany.MyDecorator
    #
    ## Locations of the drpc servers
    # drpc.servers:
    #     - "server1"
    #     - "server2"

    ## Metrics Consumers
    # topology.metrics.consumer.register:
    #   - class: "backtype.storm.metric.LoggingMetricsConsumer"
    #     parallelism.hint: 1
    #   - class: "org.mycompany.MyMetricsConsumer"
    #     parallelism.hint: 1
    #     argument:
    #       - endpoint: "metrics-collector.mycompany.org"

    worker.childopts:"-agentlib:jdwp=transport=dt_socket,server=y,address=8999,suspend=n"

【问题讨论】:

【参考方案1】:

如果要远程调试,需要在工作 JVM 中启用调试。有关正确的 Java 标志,请参见此处:Remote debugging a Java application

在 all/shared supervisor storm.yaml 中将此标志添加到条目 worker.childopts (可能需要重新启动 Storm 集群)。 您需要确保每个主机只启动一个工作线程! 否则,两个 JVM 想要打开同一个端口,其中一个当然会失败。

在 Eclipse 中,选择Run -> Debug Configuration 并创建一个新的Remote Java Application。指定要调试的正在运行的worker JVM的主机和端口(端口必须与worker.childopts中指定的相同)。

【讨论】:

谢谢。让我试试这个。 我正在使用默认的storm.yaml 文件来安装。为了向其中添加所需的参数,我添加了以下参数:worker.childopts:"java -agentlib:jdwp=transport=dt_socket,server=y,address=8999,suspend=n -jar application.jar" 这将导致以下错误:> 线程“main”中的异常 java.lang.ExceptionInInitializerError 原因:java.lang.ClassCastException:java.lang.String 无法转换为 java .util。在 backtype.storm.utils.Utils.(Utils. java:71) ... 57 更多找不到主类:backtype.storm.daemon.nimbus。程序将退出。 我想我还需要应用任何其他设置。 现在...是的。我可以通过 Eclipse 进行调试。似乎有两个问题:1。 nimbus,supervisor,ui没有正常运行,一个接一个地发射命令。我在执行中保持了 15 秒的延迟。 2. 部署拓扑后,如果我没有立即开始调试,则会出现连接拒绝错误。我能够解决它。非常感谢 Matthias 在这方面提供的帮助。赞赏!!!!【参考方案2】:

要启用跨各种主管虚拟机的调试,您只需编辑storm.yaml 文件并将worker.childopts 条目更新为:

worker.childopts: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5%ID%"

如果您的主管在 6700、6701、6702 等端口上,这将在 56700、56701、56702 等端口上创建一个调试端口。

【讨论】:

请记住,如果您不幸使用 Ambari,这将不起作用,因为 Ambari 不尊重 yaml 文件中使用的格式。 需要注意的是 6700... 是默认端口。 您是否知道 %ID% 是如何以及何时转换为主管的端口的? 离开太久了,抱歉。

以上是关于如何在 Eclipse 中调试 Apache Storm?的主要内容,如果未能解决你的问题,请参考以下文章

本地eclipse远程操作 hbase

调试期间无法在 Eclipse 的表达式视图中使用 org.apache.common.lang3.builder.toStringBuilder

[Tomcat源码分析] Eclipse中搭建Apache Tomcat源码调试环境

最终启动序列中的错误 - STM32L476 的 Eclipse 系统工作台调试

Xdebug 崩溃 apache

如何在win7下的eclipse中调试Hadoop2.2.0的程序