我发现拓扑中存在一些不平衡的数据流。从流接收的数据量远小于从同一流接收数据的另一个螺栓的数据量。 这是我的拓扑结构:
// 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统计数据: SpoutApcc,SpoutApmm,SpoutApsm分别发出STREAM_APCC,STREAM_APMM,STREAM_APSM。 RealTimeBolt仅从STREAM_APMM获取数据,MovingPointMapBolt从所有三个流中获取数据。
如果一切正确,RealTimeBolt的执行量应等于SpoutAPMM的发射量(或其转移量的一半)。即使它可能存在机器性能问题,MovingPointMapBolt和RealtimeBolt之间执行次数的比例应该与三个流的数据量的比例相似。
但是,realtimebolt执行的消息数远远小于MovingpointmapBolt的消息数,后者只有不到1%。
那么这个问题的原因是什么?
答案 0 :(得分:0)
经过几天的观察,我终于找到了原因。
名为RealTime的Stream由缓慢的Redis io速度堆叠。在RealTimeBolt中,业务逻辑需要一些Redis IO操作。被阻止的消息会影响RedisBolt之前的流传输。相反,MovingPointPoint部件没有组件减慢流速度,因此它几乎消耗所有消息。