繁体   English   中英

Apache Storm 2.1.0 本地 DRPC 不返回任何响应,尽管元组由最后一个螺栓很好地发送到收集器

[英]Apache Storm 2.1.0 local DRPC does not return any response although a tuple is well emitted to the collector by the last bolt

我在尝试运行包含一个螺栓的 DRPC 拓扑并通过本地集群查询它时遇到问题。 使用 IntelliJ 调试后,确实执行了 bolt,但是 JCQueue 在执行 bolt 之后陷入无限循环,直到将超时发送到服务器。

以下是用于构建拓扑构建器的代码:

public static LinearDRPCTopologyBuilder createBuilder()
{
    var bolt = new MRedisLookupBolt(createRedisConfiguration(), new RedisTurnoverMapper());
    var builder = new LinearDRPCTopologyBuilder("sales");
    builder.addBolt(bolt, 1).localOrShuffleGrouping();
    return builder;
}

MRedisLookupBolt 只是对 Jedis 执行 hget 命令的 IBasicBolt 的一个非常简单的实现。 MRedisLookupBolt 的execute方法只是发出一个Values实例,其中包含两个字段的值,这两个字段声明如下:

declarer.declare(new Fields("id", "Value"));

拓扑是在这样的单元测试中构建和查询的:

Config conf = new Config();
conf.setDebug(true);
conf.setNumWorkers(1);

try(LocalDRPC drpc = new LocalDRPC())
{
       LocalCluster cluster = new LocalCluster();
       var builder = BasicRedisRPCTopology.createBuilder();
       LocalCluster.LocalTopology topo = cluster.submitTopology(
              "Sales-fetch", conf, builder.createLocalTopology(drpc));
       var result = drpc.execute("sales", "XXXXX");
       System.out.println("################ Result: " + result);
}
catch (Exception e)
{
       e.printStackTrace();
}

阅读日志时,我确定数据是红色的,并且所有内容都已发出在此处输入图像描述

但最后,我用我的测试方法轻轻地打印出了这个堆栈跟踪。 当然,没有值分配给 result 变量,过程永远不会到达最后的打印指令:

在此处输入图像描述

我在这里缺少一些东西。 我的理解是:BoltExecutor 用来检索要执行的 bolt 的 id 的 JCQueue 永远不会结束,尽管只有一个参数发送到本地 DRPC 并且只有一个 bolt 声明到拓扑中。 我已经尝试向拓扑添加更多螺栓或更改用于创建它的构建器实现,但没有成功。

我使用 Apache Storm 2.1.0 找到了适合我的用例的解决方案。

似乎按照文档的建议调用本地集群的submitTopology方法并没有使用LinearDRPCTopologyBuilder构建拓扑正确地结束执行器版本 2.1.0。

通过仔细查看源代码,可以了解如何将LinearDRPCTopologyBuilder逻辑直接应用于TopologyBuilder

这是应用于createBuilder方法的更改:

    public static TopologyBuilder createBuilder(ILocalDRPC localDRPC)
    {
        var spout = Optional.ofNullable(localDRPC)
                .map(drpc -> new DRPCSpout("sales", drpc))
                .orElse(new DRPCSpout("sales"));
        var bolt = new MRedisLookupBolt(createRedisConfiguration(), new RedisTurnoverMapper());
        var builder = new TopologyBuilder();
        builder.setSpout("drpc", spout);
        builder.setBolt("redisLookup", bolt, 1)
               .shuffleGrouping("drpc");
        builder.setBolt("return", new ReturnResults())
               .shuffleGrouping("redisLookup");
        return builder;
    }

这是一个执行示例:

        Config conf = new Config();
        conf.setDebug(true);
        conf.setNumWorkers(1);

        try(LocalDRPC drpc = new LocalDRPC())
        {
            LocalCluster cluster = new LocalCluster();
            var builder = BasicRedisRPCTopology.createBuilder(drpc);
            cluster.submitTopology("Sales-fetch", conf, builder.createTopology());
            var result = drpc.execute("sales", "XXXXX");
            System.out.println("################ Result: " + result);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

不幸的是,该解决方案不允许使用LinearDRPCTopologyBuilder的所有嵌入式工具,并且意味着要“手动”构建所有拓扑流。 有必要将映射器行为更改为,因为字段的显示顺序与以前不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM