【问题标题】:Storm Spout / Topology PerformanceStorm Spout / 拓扑性能
【发布时间】:2016-03-09 15:25:22
【问题描述】:

我遇到了 Apache Storm 性能问题,主要来自 spout。

我有一个从红隼队列中发出项目的拓扑。我获取了大约 2000 个项目,每次在 spout 中调用 nextTuple 时,我都会发出一个。

在 i7 Macbook Pro 上的本地集群中运行时,我看到我每秒发出大约 20 个元组,并且该风暴将每 50 毫秒调用一次 nextTuple

我正在使用 1 个 spout 任务和 1 个 spout 执行器运行。我将setMaxSpoutPending 设置为 10。

为什么每次调用nextTuple 之间会有如此大的时间间隔? outputCollector 是否在发出新的元组之前等待收到每个元组的回复?

我正在运行 java 8 和风暴版本 0.9.4

【问题讨论】:

    标签: java apache-storm


    【解决方案1】:

    来自文档:https://storm.apache.org/apidocs/backtype/storm/spout/ISpout.html

    Storm 在同一个线程上执行 ack、fail 和 nextTuple。这意味着 ISpout 的实现者不需要担心这些方法之间的并发问题。但是,这也意味着实现者必须确保 nextTuple 是非阻塞的:否则该方法可能会阻塞等待处理的确认和失败。

    提示 1:在调用 nextTuple 时发出 1 个元组。 提示 2:不要在 nextTuple 中获取数据,在单独的线程中进行,并使用任何并发队列推送和轮询数据,以便 nextTuple 只会轮询。 提示 3:尝试将 setMaxSpoutPending 设置为 1。 技巧4:确保每个bolt的execute(tuple)方法都经过优化。

    【讨论】:

      【解决方案2】:

      您的模式很不正常...您应该只从队列中获取一个元组,或者发出您获取的所有 2000 个元组。这将遵循 Storm 的设计。

      使用额外的线程不符合 Storm 的设计。而且你没有理由不想一次发出所有 2000 个元组......

      是的,如果你在 Spout 中分配消息 ID 并设置 max.spout.pending,只要有超过 10 个元组在运行,即未确认,Storm 就不会对 Spout.nextTuple() 进行下一次调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多