Spark Streaming中的Kafka createDirectStream

时间:2017-06-22 14:43:06

标签: apache-kafka spark-streaming spark-streaming-kafka

我正在尝试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()

谢谢!

2 个答案:

答案 0 :(得分:1)

最后,我解决了问题。这是答案:

  1. 主题中的数据是从控制台生成器生成的,控制台生成器是一个字符串列表。但是,数据的格式为[Array [Byte],Array [Byte]]。不是[String,String]。因此,如果我使用StringDeserializer,则不会收到任何数据。

  2. 我从控制台消费者源代码writeTo(consumerRecord:ConsumerRecord [Array [Byte],Array [Byte]],输出:PrintStream)中学习:单位

  3. 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的完整命令吗?