簡體   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