Storm中收到的数据不平衡

时间:2016-07-08 02:39:49

标签: stream apache-storm

我发现拓扑中存在一些不平衡的数据流。从流接收的数据量远小于从同一流接收数据的另一个螺栓的数据量。 这是我的拓扑结构:

        // 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统计数据: enter image description here SpoutApcc,SpoutApmm,SpoutApsm分别发出STREAM_APCC,STREAM_APMM,STREAM_APSM。 RealTimeBolt仅从STREAM_APMM获取数据,MovingPointMapBolt从所有三个流中获取数据。

如果一切正确,RealTimeBolt的执行量应等于SpoutAPMM的发射量(或其转移量的一半)。即使它可能存在机器性能问题,MovingPointMapBolt和RealtimeBolt之间执行次数的比例应该与三个流的数据量的比例相似。

但是,realtimebolt执行的消息数远远小于MovingpointmapBolt的消息数,后者只有不到1%。

那么这个问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

经过几天的观察,我终于找到了原因。

名为RealTime的Stream由缓慢的Redis io速度堆叠。在RealTimeBolt中,业务逻辑需要一些Redis IO操作。被阻止的消息会影响RedisBolt之前的流传输。相反,MovingPointPoint部件没有组件减慢流速度,因此它几乎消耗所有消息。