下面我将包含解释我在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问题,而不是与消费者中的元组处理有关的事情。
对于出了什么问题的任何想法,我得到了这种激进/莫名其妙的行为?
谢谢。
答案 0 :(得分:1)
首先,感谢详细而精心设计的问题!我方有多条评论(不确定这是否已经是答案......):
希望这会有所帮助。如果您有更多问题和/或信息,我可以稍后改进我的答案。