我试图将卡夫卡数据通过hdfs和 hive 中的 Storm 。我正在与hortonworks合作。因此,我具有以下结构,如在许多教程(http://henning.kropponline.de/2015/01/24/hive-streaming-with-storm/)中所见(经过一些修改):
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("kafka-spout", kafkaSpout);
builder.setBolt("hdfs-bolt", hdfsBolt).globalGrouping("kafka-spout");
builder.setBolt("parse-bolt", new ParseBolt()).globalGrouping("kafka-spout");
builder.setBolt("hive-bolt", hiveBolt).globalGrouping("parse-bolt");
我将kafka-spout数据直接发送到hdfs-bolt,当我仅使用hdfs-bolt时,该数据有效。当我添加parse-bolt来解析kafka-data并将其发送到hive-bolt时,整个系统会发疯。即使iam仅通过kafka发送一条消息,该消息也会被kafka-spout无限次复制,并被写入hdfs无限。
如果parse-bolt中有错误,hdfs-bolt是否仍能正常工作?我是这个话题的新手,有人可以看到一个简单的初学者错误吗?我很感谢任何建议。
最佳答案
您是否在两个 bolt 执行结束时都收到消息?
当您从 kafka-spout 中从同一流中读取消息时,消息将被 anchor 定到相同的spout,但具有唯一的messageId。因此,从本质上讲,即使您的parse-bolt的元组失败了,由于它已 anchor 定在同一个喷口上,它也会在喷口处重播。这将导致另一个tuple具有不同的messageId,但订阅的所有 bolt 均播放相同的内容,在您的情况下为 parse-bolt 和 hdfs-bolt 。
请记住,重播发生在Spout上,因此从Spout订阅到该流的所有内容都将获得冗余消息。
关于hadoop - Storm 不受控制的元组乘法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30051591/