风暴中的多个字段分组

时间:2015-11-04 02:08:37

标签: java apache-storm

我有两个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相同的任务?

1 个答案:

答案 0 :(得分:4)

预计会在日志文件中看到很多组错误。从http://storm.apache.org/documentation/Concepts.html开始,字段分组说明

字段分组:流按分组中指定的字段进行分区。例如,如果流按“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方法。等对象总是具有相同的哈希码,但是两个不同的对象可以具有相同的哈希码。