Apache storm 卡夫卡喷口的字段分组

Apache storm 卡夫卡喷口的字段分组,apache-storm,apache-kafka,Apache Storm,Apache Kafka,可以对卡夫卡喷口发出的元组进行字段分组吗?如果是,那么Storm是如何知道卡夫卡记录中的字段的?Storm中的字段分组(以及通常的分组)是针对螺栓的,而不是针对喷口的。这是通过InputDeclarer类完成的。 在TopologyBuilder上调用setBolt()时,将返回InputDeclarer。Kafka Spout与任何其他组件一样声明其输出字段。我的解释是基于卡夫卡普特的最新理论 在KafkaSpout.java类中,我们看到declareOutputFields方法调用kafk

可以对卡夫卡喷口发出的元组进行字段分组吗?如果是,那么Storm是如何知道卡夫卡记录中的字段的?

Storm中的字段分组(以及通常的分组)是针对螺栓的,而不是针对喷口的。这是通过
InputDeclarer
类完成的。

TopologyBuilder
上调用
setBolt()
时,将返回
InputDeclarer

Kafka Spout与任何其他组件一样声明其输出字段。我的解释是基于卡夫卡普特的最新理论

在KafkaSpout.java类中,我们看到declareOutputFields方法调用kafkanconfig方案的getOutputFields()方法

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(_spoutConfig.scheme.getOutputFields());
}
默认情况下,Kafkanconfig使用以这种方式实现此方法的

  @Override
  public Fields getOutputFields() {
    return new Fields("bytes");
  }
那么这意味着什么呢?如果您声明了bolt,它使用fieldGrouping从KafkaSpout读取元组,那么您知道包含等于字段“字节”的每个元组都将由同一个任务执行。如果您想发出任何字段,您应该根据需要实施新方案。

TL:DR KafkaSpout的默认实现在
declareOutputFields
中声明以下输出字段:

新字段(“主题”、“分区”、“偏移量”、“键”、“值”)

因此,在构建拓扑代码时,请直接执行以下操作:

topologyBuilder.setSpout(spoutName, mySpout, parallelismHintSpout);
topologyBuilder.setBolt(boltName, myBolt, parallelismHintBolt).fieldsGrouping(spoutName, new Fields("key"));
详细信息:稍微查看一下代码就可以知道:

在卡夫卡喷口中,
declareOutputFields
的方式如下:

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    RecordTranslator<K, V> translator = kafkaSpoutConfig.getTranslator();
    for (String stream : translator.streams()) {
        declarer.declareStream(stream, translator.getFieldsFor(stream));
    }
}
因此,我们可以在拓扑代码中的字段分组中直接使用
字段(“键”)

topologyBuilder.setBolt(boltName, myBolt, parallelismHintBolt).fieldsGrouping(spoutName, new Fields("key"));

我的错,我是故意的。也就是说,我有一个卡夫卡喷口,它将向后续的螺栓发射元组。现在,对于包含在风暴分布中的卡夫卡喷口,我必须首先知道它发射的场。这些字段ID是否与卡夫卡出版商发布的相同?
topologyBuilder.setBolt(boltName, myBolt, parallelismHintBolt).fieldsGrouping(spoutName, new Fields("key"));