我正在试图建立一个Kafka-Storm“Hello World”系统。我安装并运行了Kafka,当我向Kafka制作人发送数据时,我可以使用Kafka控制台消费者阅读它。
我从O'Reilly的“风暴入门”一书中获取了第02章的例子,并将其修改为使用KafkaSpout而不是常规的喷口。
当我运行应用程序时,kafka中的数据已经挂起,KafkaSpout的nextTuple没有收到任何消息 - 它进入,尝试迭代协调器下的空管理器列表,然后退出。
我的环境是一个相当古老的Cloudera虚拟机,有Storm 0.9和Kafka-Storm-0.9(最新版本),以及Kafka 2.9.2-0.7.0。
这就是我定义SpoutConfig和拓扑的方法:
String zookeepers = "localhost:2181";
SpoutConfig spoutConfig = new SpoutConfig(new SpoutConfig.ZkHosts(zookeepers, "/brokers"),
"gtest",
"/kafka", // zookeeper root path for offset storing
"KafkaSpout");
spoutConfig.forceStartOffsetTime(-1);
KafkaSpoutTester kafkaSpout = new KafkaSpoutTester(spoutConfig);
//Topology definition
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("word-reader", kafkaSpout, 1);
builder.setBolt("word-normalizer", new WordNormalizer())
.shuffleGrouping("word-reader");
builder.setBolt("word-counter", new WordCounter(),1)
.fieldsGrouping("word-normalizer", new Fields("word"));
//Configuration
Config conf = new Config();
conf.put("wordsFile", args[0]);
conf.setDebug(false);
//Topology run
conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 1);
cluster = new LocalCluster();
cluster.submitTopology("Getting-Started-Toplogie", conf, builder.createTopology());
有人可以帮我弄清楚为什么我没有收到任何东西吗?
谢谢, -G。
答案 0 :(得分:4)
如果您已经消费了该消息,那么除非您的制作人生成新消息,否则不应再读取该消息。这是因为您的代码中forceStartOffsetTime
调用了-1
。
表格storm-contrib文件:
喷口中另一个非常有用的配置是强制喷口回卷到前一个偏移的能力。你在spout配置上执行forceStartOffsetTime,如下所示:
spoutConfig.forceStartOffsetTime(-2);
它将选择围绕该时间戳写入的最新偏移量以开始消费。您可以通过传入-1来强制喷口始终从最新的偏移开始,并且可以通过传入-2来强制它从最早的偏移开始。
你的制作人怎么样?有一个片段会很有用。您可以将-2替换为-2并查看是否收到任何内容,如果您的生产者处于罚款状态,那么您应该可以使用。
答案 1 :(得分:1)
SpoutConfig spoutConf = new SpoutConfig(...)
spoutConf.startOffsetTime = kafka.api.OffsetRequest.LatestTime();
答案 2 :(得分:0)
SpoutConfig spoutConfig = new SpoutConfig(new SpoutConfig.ZkHosts(zookeepers, "/brokers"),
"gtest", // name of topic used by producer & consumer
"/kafka", // zookeeper root path for offset storing
"KafkaSpout");
您正在使用“gtest”主题来接收数据。确保您是由制作人从本主题发送数据。
在螺栓中,打印出那样的元组
public void execute(Tuple tuple, BasicOutputCollector collector) {
System.out.println(tuple);
}
它应该在kafka中打印待处理的数据。
答案 3 :(得分:0)
我经历了一场让风暴和卡夫卡融为一体的悲痛。这些都是快速移动和相对年轻的项目,因此很难找到工作示例来开始您的开发。
为了帮助其他开发人员(并希望让其他人提供我可以使用的有用示例),我启动了一个github项目,用于存储与Storm / Kafka(和Esper)开发相关的代码片段。
欢迎您在此处查看> https://github.com/buildlackey/cep
(点击storm + kafka目录,查看应该启动并运行的示例程序。)