如何测量Storm拓扑中的延迟和吞吐量

时间:2016-08-08 21:10:11

标签: java performance clojure cloud apache-storm

我用示例ExclamationTopology学习Storm。我想测量螺栓的延迟(将!!!添加到一个单词所需的时间)和吞吐量(比如,每秒通过一个螺栓的单词数)。

here开始,我可以计算单词的数量和执行螺栓的次数:

_countMetric = new CountMetric();
_wordCountMetric = new MultiCountMetric();


context.registerMetric("execute_count", _countMetric, 5);
context.registerMetric("word_count", _wordCountMetric, 60);

我知道Storm UI提供Process LatencyExecute Latency,而post可以很好地解释它们是什么。

但是,我想记录每个螺栓执行的延迟,并将此信息与word_count一起使用来计算吞吐量。

如何使用Storm Metrics来完成此操作?

1 个答案:

答案 0 :(得分:0)

虽然您的问题很直接,肯定会引起很多人的兴趣,但它的答案并不像应有的那么简单。首先,我们需要澄清,我们究竟想要测量什么。吞吐量和延迟是很容易理解的术语,但在 Storms 分布式环境中,事情变得更加复杂。

正如这个优秀的 blog post 所描述的,每个 Storm 主管至少有 3 个线程来完成不同的任务。当 Worker Receiver Thread 等待传入的数据元组并将它们聚合成一个块时,它们被发送到 Worker Executor Thread。这包含用户逻辑(在您的情况下是 ExclamationBolt 和一个负责处理传出消息的发送者。最后,在每个主管节点上,都有一个 Worker Send Thread 来聚合即将到来的消息来自所有执行者,聚合它们并将它们发送到网络。

当然,每个线程都有自己的延迟和吞吐量。对于 Sender 和 Receiver Thread,它们在很大程度上取决于缓冲区大小,您可以调整这些大小。在您的情况下,您只想测量一个(执行)螺栓的延迟和吞吐量 - 这是可能的,但请记住,其他线程会对这个螺栓产生影响。

我的方法: 为了获得延迟和吞吐量,我使用了旧的 Storm Builtin Metrics。因为我发现文档不是很清楚,所以我在这里划了一条线:我们使用新的Storm Metric API v2,我们使用{{3} }.

  1. 通过将以下内容放入您的 storm.yaml 来激活 Storm Logging:
topology.metrics.consumer.register:
  - class: "org.apache.storm.metric.LoggingMetricsConsumer"
    parallelism.hint: 1
  1. 您可以使用以下命令设置报告间隔:topology.builtin.metrics.bucket.size.secs: 10

  2. 运行您的查询。所有指标每 10 秒记录在特定的指标日志文件中。找到这个日志文件并非易事。 Storm 创建一个 LoggingMetricsConsumer-Bolt 并将其分发到集群中。在这个节点上,你应该在 Storm 日志中找到相应的度量文件。

  3. 这个指标文件包含每个执行者的指标,你正在寻找,比如:complete-latencyexecute-latency 等等。对于吞吐量,我将使用包含例如:arrival_rate_secs 的队列指标作为每秒插入多少元组的估计。照顾好在每个主管上执行的多个线程。

祝你好运!