我发现在我的拓扑中有一些不平衡的数据流。从一个流接收的数据量远小于从同一个流接收数据的另一个bolt的数据量。以下是我的拓扑结构:
// Create 3 spouts for APMM APCC APSM respectively
builder.setSpout(GlobalStorm.SPOUT_APMM, new UniversalApSpout(GlobalStorm.APMM));
builder.setSpout(GlobalStorm.SPOUT_APCC, new UniversalApSpout(GlobalStorm.APCC));
builder.setSpout(GlobalStorm.SPOUT_APSM, new UniversalApSpout(GlobalStorm.APSM));
// Create moving point bolt connecting three streams above
builder.setBolt(GlobalStorm.MovingPointMapBolt, new MovingPointMapBolt(), 9)
.shuffleGrouping(GlobalStorm.SPOUT_APMM, GlobalStorm.STREAM_MM)
.shuffleGrouping(GlobalStorm.SPOUT_APCC, GlobalStorm.STREAM_CC)
.shuffleGrouping(GlobalStorm.SPOUT_APSM, GlobalStorm.STREAM_SM);
// Real time bolt connecting APMM only
builder.setBolt(GlobalStorm.RealTimeBolt, new RealTimeBolt(), 9).
shuffleGrouping(GlobalStorm.SPOUT_APMM, GlobalStorm.STREAM_MM);
// Redis bolt that saving data from moving point bolt and real time bolt together.
builder.setBolt(GlobalStorm.RedisStoreBolt, new RedisStoreBolt(), 9)
.shuffleGrouping(GlobalStorm.MovingPointMapBolt, GlobalStorm.STREAM_MOVING_POINT)
.shuffleGrouping(GlobalStorm.RealTimeBolt, GlobalStorm.STREAM_REAL_TIME);
下面是storm ui统计数据:
分别发射流\ apcc、流\ apmm、流\ apsm。realtimebolt仅从流apmm获取数据,movingpointmapbolt从所有三个流获取数据。
如果一切都是正确的,那么realtimebolt的执行量应该等于spoutapmm的发出量(或其传输量的一半)。即使可能存在机器性能问题,movingpointmapbolt和realtimebolt之间的执行数比例也应该与三个流的数据量比例相似。
然而,realtimebolt的执行消息数远小于movingpointmapbolt的执行消息数,movingpointmapbolt的执行消息数仅为movingpointmapbolt的1%。
那么这个问题的原因是什么呢?
1条答案
按热度按时间jjjwad0x1#
经过几天的观察,我终于找到了原因。
名为realtime的流是由较慢的redis io速度叠加而成的。在realtimebolt中,业务逻辑需要一些redis io操作。被阻止的消息会影响流传输。相反,movingPoint部分没有减慢流速度的组件,因此它几乎消耗所有消息。