我用示例ExclamationTopology
学习Storm。我想测量螺栓的延迟(将!!!
添加到一个单词所需的时间)和吞吐量(比如,每秒通过一个螺栓的单词数)。
从here开始,我可以计算单词的数量和执行螺栓的次数:
_countMetric = new CountMetric();
_wordCountMetric = new MultiCountMetric();
context.registerMetric("execute_count", _countMetric, 5);
context.registerMetric("word_count", _wordCountMetric, 60);
我知道Storm UI提供Process Latency
和Execute Latency
,而post可以很好地解释它们是什么。
但是,我想记录每个螺栓执行的延迟,并将此信息与word_count
一起使用来计算吞吐量。
如何使用Storm Metrics来完成此操作?
答案 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} }.
storm.yaml
来激活 Storm Logging:topology.metrics.consumer.register:
- class: "org.apache.storm.metric.LoggingMetricsConsumer"
parallelism.hint: 1
您可以使用以下命令设置报告间隔:topology.builtin.metrics.bucket.size.secs: 10
运行您的查询。所有指标每 10 秒记录在特定的指标日志文件中。找到这个日志文件并非易事。 Storm 创建一个 LoggingMetricsConsumer
-Bolt 并将其分发到集群中。在这个节点上,你应该在 Storm 日志中找到相应的度量文件。
这个指标文件包含每个执行者的指标,你正在寻找,比如:complete-latency
、execute-latency
等等。对于吞吐量,我将使用包含例如:arrival_rate_secs
的队列指标作为每秒插入多少元组的估计。照顾好在每个主管上执行的多个线程。
祝你好运!