如何在KafkaSpout和螺栓之间实现字段分组

时间:2015-09-07 11:39:39

标签: apache-kafka apache-storm

我一直在向Kafka主题发送消息,这些消息在主题中是JSON,我使用KafkaSpout从Kafka获取消息并使用shuffle分组将其发送到bolt。现在我想实现KafkaSpout和bolt之间的字段分组。请有人帮我这个。如何在KafkaSpout和螺栓之间实现字段分组。

1 个答案:

答案 0 :(得分:2)

您需要实现backtype.storm.spout.scheme接口,基本上它看起来像这样:

public class FooScheme implements Scheme {

  public Values deserialize(final byte[] _line) {

     try{
           Values values = new Values();
           JSONObject msg = (JSONObject) JSONValue.parseWithException(new String(_line));
           values.add((String) msg.get("a"));
           values.add((String) msg.get("b"))
           values.add(msg)
        }
        catch(ParseException e) {
            //handle the exception
            return null;
        }

  }

  public Fields getOutputFields() {
     return new Fields("a", "b", "json");}
}

并将它与你的鲸鱼喷水一起使用:

SpoutConfig spoutConfig = new SpoutConfig( ... your config here ...);
spoutConfig.scheme = new SchemeAsMultiScheme(new FooScheme());
KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);
topology.setSpout("kafka-spout", 1).setNumTasks(1);

现在您已准备好使用“a”或“b”或两者分组的字段。

FooBolt bolt = new FooBolt();
topology.setBolt("foo-bolt", new FooBolt(), 1).setNumtasks(1)
         .fieldsGrouping("kafka-spout", new Fields("a","b"));

<强>享受