我有两个Bolt课BoltX
和BoltY
。 BoltY
收到来自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
相同的任务?
答案 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方法。等对象总是具有相同的哈希码,但是两个不同的对象可以具有相同的哈希码。