【问题标题】:Do I need Kafka to have a reliable Storm spout?我是否需要 Kafka 才能拥有可靠的 Storm spout?
【发布时间】:2015-02-23 21:55:15
【问题描述】:

据我了解,ZooKeeper 将持久化 bolt 发出的元组,因此如果一个 bolt 崩溃(或者一个带有 bolt 的计算机崩溃,或者整个集群崩溃),bolt 发出的 tuple 不会丢失。一旦一切重新启动,元组将从 ZooKeeper 中获取,一切都会继续进行,就好像没有发生任何不好的事情一样。

我还不明白喷口是否也是如此。如果一个 spout 发出一个元组(即,一个 spout 中的 emit() 函数被执行),并且 spout 正在运行的计算机在此后不久崩溃,该元组会被 ZooKeeper 复活吗?还是我们需要 Kafka 来保证这一点?

附:我知道在调用 emit() 时,必须为 spout 发出的元组分配一个唯一 ID。

附言我在书中看到示例代码使用ConcurrentHashMap<UUID, Values> 之类的东西来跟踪哪些喷出的元组尚未被确认。这是否以某种方式自动与 ZooKeeper 保持一致?如果不是,那我真的不应该那样做,不是吗?我应该做什么呢?使用卡夫卡?

【问题讨论】:

    标签: apache-storm


    【解决方案1】:

    Florian Hussonnois 在thisstorm-user 线程中彻底而清晰地回答了我的问题。这是他的回答:

    实际上,元组并没有持久化到“zookeeper”中。如果你的 "spout" 发出一个具有唯一 id 的元组,它将自动 内部跟随风暴(即ackers)。因此,如果发出 tuple 由于 bolt 失败而失败,Storm 调用 以唯一 id 作为参数的 origin spout 任务的方法“失败”。

    然后由您决定重新发出失败的元组。

    在示例代码中,spout 使用 Map 来跟踪哪些元组是完全 由您的整个拓扑处理,以便能够重新发出 螺栓失效的情况。

    但是,如果故障不是来自螺栓而是来自喷口, 内存中的地图将丢失,您的拓扑将无法 汇出失败的元组。

    对于这种情况,您可以依赖 Kafka。事实上,Kafka Spout 将其读取偏移量存储到 Zookeeper 中。这样,如果一个 spout 任务 下降后,它将能够从 Zookeeper 读取其偏移量 正在重新启动。

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2017-08-24
      • 2020-05-01
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多