风暴中接收到的不平衡数据

hrirmatl  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(337)

我发现在我的拓扑中有一些不平衡的数据流。从一个流接收的数据量远小于从同一个流接收数据的另一个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%。
那么这个问题的原因是什么呢?

jjjwad0x

jjjwad0x1#

经过几天的观察,我终于找到了原因。
名为realtime的流是由较慢的redis io速度叠加而成的。在realtimebolt中,业务逻辑需要一些redis io操作。被阻止的消息会影响流传输。相反,movingPoint部分没有减慢流速度的组件,因此它几乎消耗所有消息。

相关问题