如何找出哪个螺栓在storm拓扑结构中没有确认?

2ic8powd  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(256)

我´我一直在研究风暴的拓扑结构´我面临一些元组失败。我怀疑其中一个螺栓在某个特定的情况下没有确认,导致这些故障超时。在apachestormapi(0.10.0)中有没有一种方法来识别哪个螺栓没有按预期进行确认?
让´假设我们有myspoutbolta和boltb作为这个拓扑的组件,myspoutboltb为两个bolt发出元组´处理完元组后,我们将返回ack。executetuple()方法中的bolta总是acking,但是boltb只对它接收到的偶数值进行acking。所有具有奇数值的元组在10分钟后都将失败。
在这个小样本中´很容易识别失败的流。但在一个复杂的系统中,我们可以跟踪几十个不同的流,并有多个螺栓´就像大海捞针。有什么聪明的方法可以找到这个失败吗?

public class MySpout extends BaseRichSpout {
    protected SpoutOutputCollector collector;
    //...
    @Override
    public void nextTuple() {
        Integer msgId = new Integer((int)(Math.random() * 5000 + 1));
        collector.emit(new Values(msgId), msgId);
    }
    @Override
    public void fail(Object msgId) {
        new Exception("Failed tuple. msgId="+msgId).printStackTrace();
    }
}

public class BoltA extends BaseRichBolt {
    private OutputCollector outputCollector;
    //...
    @Override
    protected void executeTuple(Tuple input) {
        Integer n = (Integer) input.getValues().get(0);
        outputCollector.ack(input);
    }
}

public class BoltB extends BaseRichBolt {
    private OutputCollector outputCollector;
    //...
    @Override
    protected void executeTuple(Tuple input) {
        Integer n = (Integer) input.getValues().get(0);
        if (n%2==0) {
            outputCollector.ack(input);
        }
    }
}

为此风暴配置了10分钟的超时值。

<!-- storm config -->
<property>
    <name>topology.enable.message.timeouts</name>
    <value>true</value>
</property>
<property>
    <!-- 10 mins -->
    <name>topology.message.timeout.secs</name>
    <value>600</value>
</property>

这是我们在元组失败时看到的堆栈跟踪。我试图提取元组失败流的一些信息。它没有´不要说任何对我有帮助的话。

java.lang.Exception: Failed tuple. msgId=1234
at MySpout.fail(MySpout.java:127) [myJar.jar:?]
at backtype.storm.daemon.executor$fail_spout_msg.invoke(executor.clj:401) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.daemon.executor$fn$reify__4467.expire(executor.clj:461) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.utils.RotatingMap.rotate(RotatingMap.java:73) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.daemon.executor$fn__4464$tuple_action_fn__4470.invoke(executor.clj:466) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.daemon.executor$mk_task_receiver$fn__4455.invoke(executor.clj:433) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.disruptor$clojure_handler$reify__4029.onEvent(disruptor.clj:58) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:125) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.utils.DisruptorQueue.consumeBatch(DisruptorQueue.java:87) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.disruptor$consume_batch.invoke(disruptor.clj:76) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.daemon.executor$fn__4464$fn__4479$fn__4510.invoke(executor.clj:578) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at backtype.storm.util$async_loop$fn__543.invoke(util.clj:475) [storm-core-0.10.0-beta1.jar:0.10.0-beta1]
at clojure.lang.AFn.run(AFn.java:22) [clojure-1.6.0.jar:?]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
amrnrhlw

amrnrhlw1#

喷口不知道是哪个螺栓导致元组失败,这就是为什么在堆栈跟踪中看不到任何东西。
我将使用1.2.2代码来响应。很可能在0.10.0中也可以这样做,但是这个版本很古老,我不想在其中到处挖掘。
调试的一种方法是在提交拓扑时启用storm的调试日志记录。

Config config = new Config();
config.setDebug(true);
//submit your topology using this Config

当一个元组失败时,您将得到一个类似于
2019-06-29 12:16:09.552 o.a.s.d.executor thread-11-word-executor[16 16][info]喷口故障3249602444700129:{:流“default”,:值[84 1561716922356 116]}原因:超时消息id:116
然后,您可以通过消除找出哪个螺栓没有确认元组。如果在日志中搜索元组id(这里是 32496024444700129 值),您将看到每个传输到该元组的一个螺栓的日志,例如。
2019-06-29 12:15:22.356 o.a.s.d.executor thread-11-word-executor[16][info]传输元组[dest:4元组:源:word:16,流:默认,id:{3249602444700129=592397874049352856},[841561716922356116]]
这说明元组已转移到任务4。当拓扑开始时,它记录了哪个螺栓是任务4,您也可以在storm ui中看到这一点。
2019-06-29 12:15:08.801 o.a.s.d.executor main[信息]加载执行器感叹号1:[4]
我可以看到任务4确认了元组,所以这不是元组超时的原因
2019-06-29 12:15:22.359 o.a.s.d.任务线程-17-EXPEIM1-EXCEUTOR[4][info]发出:EXPEIM1\uu确认\u确认[3249602444700129 7387867738466240036]
我还可以看到任务4将元组转移到了任务8
2019-06-29 12:15:22.359 o.a.s.d.executor thread-17-expoim1-executor[4][info]传输元组[dest:8元组:源:expoim1:4,流:默认,id:{3249602444700129=3796756412183316156},[84!!!]]
任务8处理了它
2019-06-29 12:15:22.363 o.a.s.d.executor thread-5-expoim2-executor[8][info]正在处理8元组的接收消息:源:expoim1:4,流:默认值,id:{3249602444700129=3796756412183316156},[84!!!]
任务8没有确认该元组的日志,因此任务8是未正确确认的螺栓。
我在日志中查找任务8
2019-06-29 12:15:08.446 o.a.s.d.executor main[信息]已加载执行器任务感叹2:[8]
所以“惊呼2”是我的拓扑结构中没有正确确认的螺栓。

相关问题