我正在尝试Spark Streaming + Kafka Integration Guide (Kafka broker version 0.10.0 or higher)中的示例代码。代码可以运行没有任何错误,但我不能收到任何记录。如果我运行kafka-console-consumer.sh - 从头开始,我可以获得记录。有谁知道原因?我的代码如下:
.container-fluid
我的SBT构建是:
val broker = "221.181.73.44:19092"
val topics = Array("connect-test")
val groupid = "SparkStreamingLoad3"
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> broker,
"group.id" -> groupid,
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"auto.offset.reset" -> "earliest", //earliest | latest
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val stream = KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParams))
stream.print()
ssc.start()
ssc.awaitTermination()
谢谢!
答案 0 :(得分:1)
最后,我解决了问题。这是答案:
主题中的数据是从控制台生成器生成的,控制台生成器是一个字符串列表。但是,数据的格式为[Array [Byte],Array [Byte]]。不是[String,String]。因此,如果我使用StringDeserializer,则不会收到任何数据。
我从控制台消费者源代码writeTo(consumerRecord:ConsumerRecord [Array [Byte],Array [Byte]],输出:PrintStream)中学习:单位
RDD中的键/值可以包含空值。在我的例子中,所有键都为空。我使用以下代码来获取数据:
stream = KafkaUtils.createDirectStream [Array [Byte],Array [Byte]](ssc,PreferConsistent,Subscribe [Array [Byte],Array [Byte]](topics,kafkaParams)) stream.map(rdd => new String(Option(rdd.key())。getOrElse(“null”.getBytes))+“||| delemiter |||”+ new String(Option(rdd.value() ).getOrElse( “NULL” .getBytes)))。打印()
答案 1 :(得分:0)
val broker = "221.181.73.44:19092"
默认端口为 9092 ,可能是问题所在。
"auto.offset.reset" -> "earliest"
和"enable.auto.commit" -> false
应始终从主题日志的开头读取,因为您的偏移量不会存储在任何位置。所以没有问题。
另外,我们可以看到您用于kafka-console-consumer.sh
的完整命令吗?