【问题标题】:Resource clean up after killing storm topology杀死风暴拓扑后的资源清理
【发布时间】:2019-03-06 14:01:39
【问题描述】:

我们有一个与 MariaDB 数据库交互的风暴拓扑。我们的 Bolts 实现了IRichBolt 接口并覆盖了生命周期方法。我们在prepare 方法中打开一个数据库连接,并在cleanup 方法中关闭它。 cleanup 方法文档说:

当 IBolt 将要关闭时调用。没有保证会调用清理,因为主管杀死了集群上 -9 的工作进程。 保证调用 cleanup 的一种情况是在本地模式下运行 Storm 时终止拓扑

kill -9 命令会在不清理任何资源的情况下终止进程。所以我们得出这样的结论,在杀死拓扑时,不需要调用cleanup 方法并关闭数据库连接。

所以继续我的问题,我们有一个用于拓扑部署的 shell 脚本,它在执行时会以 0 的超时时间终止当前拓扑并部署一个新的拓扑。我们在数据库级别面临一个问题,即打开了许多连接,这提示我们以前的连接没有关闭。 (在上一个拓扑中打开的那个)。

我们的假设正确吗?增加超时时间会清理所有资源吗?

【问题讨论】:

    标签: apache-storm apache-storm-topology


    【解决方案1】:

    没有。增加拓扑超时不会影响您的工作人员必须清理多长时间。当你使用例如一个 30 秒的超时,这只是关闭了 spout,并给了拓扑的其余部分 30 秒来完成处理。

    你想要的是增加 Storm 允许工人在强制杀戮之前花多长时间关闭。 https://github.com/apache/storm/blob/b07413670fa62fec077c92cb78fc711c3bda820c/storm-server/src/main/java/org/apache/storm/DaemonConfig.java#L780 选项允许您指定 Storm 在发送 kill -9 之前将等待多长时间。默认值为 3 秒。您需要在storm.yaml 中设置此选项,在拓扑配置中设置将无效。

    【讨论】:

    • 嗨,stig,当storm kill 命令执行时,它会在螺栓上调用cleanup 方法吗?如果不是,我们如何在关闭之前清理诸如打开的数据库连接之类的资源。当我们终止拓扑时,db 上的threads_connected 计数不会减少,这使我们相信它不会在关闭时关闭连接
    • 对不起,我错了。 Storm 确实会在 worker 关闭时调用 cleanup,但它也只允许 worker 花费 1 秒的时间来关闭(shutdown hook 有 1 秒的时间运行,然后运行时被杀死)。 IMO 我们可以在这里配置延迟github.com/apache/storm/blob/…。为此,请随时在issues.apache.org/jira/secure/Dashboard.jspa 提出问题。如果您想研究它,请查看github.com/apache/storm/blob/master/DEVELOPER.md
    • 那么这意味着在 1 秒内如果数据库连接没有关闭,它将保持打开状态。这并不能完全确保所有资源都已被清理
    猜你喜欢
    • 2018-06-09
    • 2018-07-19
    • 2014-01-14
    • 1970-01-01
    • 2018-08-08
    • 2015-11-14
    • 2013-08-06
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多