我正在使用Spark Streaming从Kafka主题列表中读取。 我正在关注此link的官方API。我正在使用的方法是:
val kafkaParams = Map("metadata.broker.list" -> configuration.getKafkaBrokersList(), "auto.offset.reset" -> "largest")
val topics = Set(configuration.getKafkaInputTopic())
val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, topics)
我想知道执行者将如何从主题列表中读取消息?他们的政策是什么?他们会阅读一个主题,然后当他们完成消息传递给其他主题吗?
最重要的是,在调用此方法后,我怎样才能检查RDD中消息的主题是什么?
stream.foreachRDD(rdd => rdd.map(t => {
val key = t._1
val json = t._2
val topic = ???
})
答案 0 :(得分:0)
我想知道遗嘱执行人将如何从消息中读取消息 主题列表?他们的政策是什么?他们会阅读一个主题吗? 然后当他们完成消息传递给其他主题?
在直接流方式中,驱动程序负责读取您要使用的Kafka主题的偏移量。它的作用是在主题,分区和需要读取的偏移之间创建映射。在此之后,驱动程序会为每个工作人员分配范围以读取特定的Kafka主题。这意味着如果一个工作者可以同时运行2个任务(仅仅是为了示例,它通常可以运行更多),那么它可能同时从两个独立的Kafka主题中读取。
在调用此方法后,我怎样才能检查a的主题是什么 RDD中的消息?
您可以使用createDirectStream
的重载,该重载需要MessageHandler[K, V]
:
val topicsToPartitions: Map[TopicAndPartition, Long] = ???
val stream: DStream[(String, String)] =
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc,
kafkaParams,
topicsToPartitions,
mam: MessageAndMetadata[String, String]) => (mam.topic(), mam.message())