动态重定向元组的Apache Storm问题(对端到端延迟的影响令人困惑)

时间:2015-11-26 03:16:40

标签: java apache-storm

下面我将包含解释我在Storm中遇到的问题的文字。无论如何,我知道这是一个很长的帖子(只是一个抬头),任何评论/指示都非常受欢迎。有描述:

我在单个服务器上安装了Storm 0.9.4和ZooKeeper 3.4.6(2个带有Intel Xeon 8核芯片的插槽,96 GB ram运行CentOS)我已经设置了伪分布式单节点Storm运行时。我的配置包括1个zookeeper服务器,1个nimbus进程,1个管理程序进程和1个工作进程(提交拓扑时),所有这些都在同一台机器上运行。我的实验的目的是在输入负载在执行程序线程之间动态分配时,在单个节点设置上查看Storm的行为。

为了我的实验,我输入了由1个长整数值组成的元组。输入数据来自两个从磁盘文件读取元组的spout,我控制输入速率遵循以下模式: 前24秒(时间0 - 24秒)200元/秒 接下来的12秒(24 - 36秒)800元/秒 200个元组/秒再持续6秒(时间36-42秒) 转到我的拓扑结构,我有两种类型的螺栓:a)一个Dispatcher螺栓,它接收来自两个喷口的输入,以及(b)一个Consumer螺栓,它对元组执行操作并将一些元组维持为状态。 Dispatcher的并行性提示是一个(1个执行器/线程),因为我已经检查过它永远不会达到其容量的10%。对于Consumer bolt,我有两个并行性提示(该螺栓有2个执行器/线程)。选择我之前提到的输入速率,以便使用Consumer bolt上相应数量的执行程序监视小于10毫秒的端到端延迟。详细地说,我使用一个消费者执行器运行相同的拓扑,它可以处理200元组/秒的输入速率,端到端延迟<1。 10毫秒类似地,如果我再添加一个Consumer执行器(总共2个执行器),则拓扑结构可以消耗800个元组/秒,其中&lt; 10毫秒端到端延迟。此时,我不得不说如果我使用1个消费者执行程序来获得800元组/秒,那么端到端延迟最多可达2秒。顺便说一句,我必须提到我使用我的螺栓的ack()函数测量端到端延迟,并查看在拓扑中发送元组之间需要多长时间,直到其元组树被完全确认为止。 / p>

正如您现在意识到的那样,目标是看看我是否能够保持端到端延迟&lt;输入尖峰10毫秒,通过模拟添加另一个消费者执行器。为了模拟输入尖峰的处理资源的添加,我使用直接分组,在尖峰之前,我只将元组发送给两个消费者执行者中的一个。当在Dispatcher上检测到尖峰时,它也开始向另一个Consumer发送元组,以便在两个线程之间平衡输入负载。因此,我希望当我开始向另外的Consumer线程发送元组时,端到端延迟将回落到其可接受的值。但是,以前不会发生。

为了验证我的假设,即两个消费者执行者能够维持&lt;在尖峰期间10毫秒的延迟,我执行相同的实验,但这一次,我在实验的整个生命周期中将元组发送到两个执行器(线程)。在这种情况下,端到端延迟保持稳定并处于可接受的水平。所以,我不知道我的模拟中到底发生了什么。在将输入负载重定向到其他Consumer执行器的情况下,我无法确定导致端到端延迟恶化的原因。

为了更多地了解Storm的机制,我在较小的机器上进行了相同的设置并进行了一些分析。我看到大部分时间花在了lmax干扰器的BlockingWaitStrategy上,它占据了CPU的主导地位。我的实际处理函数(在Consumer bolt中)只占lmax BlockingWaitStrategy的一小部分。因此,我认为它是队列之间的I / O问题,而不是与消费者中的元组处理有关的事情。

对于出了什么问题的任何想法,我得到了这种激进/莫名其妙的行为?

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,感谢详细而精心设计的问题!我方有多条评论(不确定这是否已经是答案......):

  1. 你的实验很短(时间范围低于1分钟),我认为这可能无法显示可靠的数字。
  2. 你如何发现尖峰?
  3. 您是否对Storm中的内部缓冲机制感到敬畏(请看这里:http://www.michael-noll.com/blog/2013/06/21/understanding-storm-internal-message-buffers/
  4. 你配置了多少个ackers?
  5. 我认为在你的尖峰期间,在检测到尖峰之前,缓冲区会被填满,并且需要一些时间来清空它们。因此,延迟不会立即下降(可能会延长您上一期的时间来解决此问题)。
  6. 使用ack机制是由许多人完成的,但是,它是相当不精确的。首先,它显示平均值值(均值,分位数或最大值将更好地使用。此外,度量值不应被视为延迟后的延迟例如,如果你把一个元组保持在内部状态一段时间并且在元组从状态中移除之前不要使用它,那么Storm的“延迟”值会增加对延迟测量没有意义的东西。延迟的定义是获取结果元组的输出时间戳并减去源元组的发出时间戳(如果有多个源元组,则使用最年轻的---即最大---时间戳在所有源元组上)。棘手的部分是找出每个输出元组的相应源元组...作为替代方案,有些人会注入伪元组,这些元组将其发射时间戳作为数据。这些虚拟元组由每个操作员立即转发,接收器操作员可以轻松竞争延迟值,因为它可以访问发射时间随身携带的邮票。如前所述,这是对实际延迟的非常好的近似。
  7. 希望这会有所帮助。如果您有更多问题和/或信息,我可以稍后改进我的答案。