【问题标题】:multiple fields grouping in storm [duplicate]风暴中的多个字段分组[重复]
【发布时间】:2018-03-28 17:23:30
【问题描述】:

我有两个 Bolt 类 BoltXBoltYBoltY 接收来自 BoltX 的元组。 BoltX 声明输出有多个字段,每个元组包含 4 个字符串:

class BoltX implements IBasicBolt {
    ...
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("A","B","C","D"));
    }
}

BoltY:

class BoltX implements IBasicBolt {
    boolean hasReceive = false;
    String A = null;
    String B = null;
    ...
    public void execute(Tuple input, BasicOutputCollector collector) {
        if (!hasReceive) {
            hasReceive = true;
            A = input.getString(0);
            B = input.getString(1);
        }

        if (!input.getString(0).equals(A) || !input.getString(1).equals(B)) {
            LOG.error("group error");
            return;
        }
        ...
    }
    ...
}

在拓扑中:

...
builder.setBolt("x", new BoltX(), 3);
builder.setBolt("y", new Bolty(), 3).fieldsGrouping("x", new Fields("A", "B"));
...

我认为 x 具有相同字段“A”和“B”的输出将用于 BoltY 的相同任务。

但是,拓扑日志显示很多“组错误”。

那么如何将具有相同字段“A”和“B”的输出分组到BoltY的相同任务?

【问题讨论】:

标签: java apache-storm


【解决方案1】:

预计会在日志文件中看到很多组错误。来自http://storm.apache.org/documentation/Concepts.html Field Grouping 的描述说

字段分组:流按分组中指定的字段进行分区。例如,如果流按“user-id”字段分组,具有相同“user-id”的元组将始终执行相同的任务,但具有不同“user-id”的元组可能会执行不同的任务. 这意味着字段 A 和 B 具有相同值的元组将始终执行相同的任务,但这并不意味着字段 A 和 B 具有其他值的元组不能执行相同的任务。例如如果您的输入数据有以下元组

1、2、3、4

1、2、5、6

3、4、5、6

在上述场景中,前两个元组保证会执行相同的任务,但第三个元组也可以执行相同的任务,特别是当 BoltY 的并行提示设置为 1 时。没有其他任务。把它想象成java中的hashcode方法。相同的对象总是有相同的哈希码,但两个不同的对象可以有相同的哈希码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多