【问题标题】:Storm Bolt Database ConnectionStorm Bolt 数据库连接
【发布时间】:2014-01-03 11:35:56
【问题描述】:

我正在使用带有 Cassandra 的 Storm (java)。

我的一个 Bolts 将数据插入 Cassandra。有没有办法在这个 bolt 的实例化之间保持与 Cassandra 的连接打开?

我的应用程序的写入速度很快。螺栓需要每秒运行几次,并且由于每次都连接到 Cassandra,因此性能受到了阻碍。

如果我可以有一个保持打开的静态连接,它会运行得更快,但我不确定在风暴中实现这一点。

澄清问题:

风暴拓扑中静态连接的范围是什么?

与其他消息系统不同,其他消息系统的“工作”在循环中进行,或者回调可以在循环外使用变量(可能是静态连接),风暴螺栓似乎在每次被调用时都会被实例化并且不能将参数传递给它们,那么如何使用与 cassandra 相同的连接?

【问题讨论】:

  • 这个问题在没有 cmets 的情况下被否决了,这太荒谬了,如果需要,请向我询问更多信息。
  • 感谢投票给 0 的人
  • 大部分 Cassandra 驱动程序/客户端支持连接池。我认为您不需要保持连接打开。
  • 据我了解,这不是连接池的用途。如果我有一个客户端应用程序,并且我实际上正在调用连接和断开连接,那么连接池对此不会有任何影响。
  • 作为问题的扩展:何时以及如何在风暴拓扑中关闭与数据库的连接?例如如果我启动一个拓扑并且它运行了 6 个月,它会保持连接打开而不释放资源吗?

标签: cassandra connection apache-storm


【解决方案1】:

与其他消息系统不同,其他消息系统的“工作”在循环中进行,或者回调可以在循环外使用变量(可能是静态连接),风暴螺栓似乎每次都被实例化它们被调用并且不能将参数传递给它们

说风暴螺栓得到他们调用的instantiated each time 并不完全正确。例如,prepare 方法只在初始化阶段被调用,即只有一次。从文档中它说
当该组件的任务在集群上的工作人员中初始化时被调用。它为bolt提供了bolt执行的环境。

所以最好的办法是将初始化代码放在准备或打开(在 spout 的情况下)方法中,因为它们将在任务开始时被调用。但是你需要让它成为线程安全的,因为它会被每个任务在它自己的线程中同时调用。

另一方面,execute(Tuple tuple) 方法实际上负责处理逻辑,并在每次从相应的 spout 或 bolt 接收到元组时调用。(所以这实际上是每次 bolt 调用的内容运行)


当一个 IBolt 将要关闭时,cleanup 方法被调用,文档说

没有保证会调用 cleanup,因为 主管在集群上杀死 -9 的工作进程。一个上下文 保证会调用 cleanup 是在拓扑被终止时 当在本地模式下运行 Storm

因此,不能将变量传递给它是不正确的,您可以使用 prepare 方法实例化任何实例变量,然后在处理过程中使用它。

关于数据库连接,我不太确定您的用例,因为您没有放置任何代码,但维护资源池对我来说是个不错的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多