Scala 火花流+;卡夫卡:如何从卡夫卡消息中检查主题名称
我正在使用Spark Streaming阅读卡夫卡主题列表。 我现在正在关注官方的API。我使用的方法是:Scala 火花流+;卡夫卡:如何从卡夫卡消息中检查主题名称,scala,apache-kafka,spark-streaming,Scala,Apache Kafka,Spark Streaming,我正在使用Spark Streaming阅读卡夫卡主题列表。 我现在正在关注官方的API。我使用的方法是: val kafkaParams = Map("metadata.broker.list" -> configuration.getKafkaBrokersList(), "auto.offset.reset" -> "largest") val topics = Set(configuration.getKafkaInputTopic()) val stream = Kafka
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 = ???
})
我想知道遗嘱执行人将如何阅读来自
主题列表?他们的政策是什么?他们会阅读一个主题和内容吗
然后当他们完成时,消息会传递到其他主题吗
在直接流媒体方法中,驱动程序负责将偏移量读入您想要使用的卡夫卡主题。它所做的是在主题、分区和需要读取的偏移之间创建映射。在这之后,驱动程序会为每个工作人员分配一个范围,以便读入特定的卡夫卡主题。这意味着,如果一个工作者可以同时运行两个任务(仅为了本例,它通常可以运行更多),那么它就有可能同时读取卡夫卡的两个独立主题
调用此方法后,如何检查主题是什么
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())
您可以使用类似于var records=stream.map(record=>(record.topic))@israel.zing的映射,我认为
stream
中的元素是Tuple2[String,String]
。没有名为topicThank you@Yuval的参数或方法,但仍然是。在阅读卡夫卡作品时,我如何访问信息和主题。使用messageHandler
作为createDirectStream
的参数,看起来我无论如何都做不到。@salvob我的代码片段就是这样做的。输出将是一个DStream[(String,String)]
,其中第一个是主题名称。您的代码定义了一个流,其中假定包含每条记录的消息和主题。但是,当我试图打印元组的内容时(使用我问题中的代码片段-使用println(key+topic+message)
,什么都没有发生正确返回消息编号though@salvob你试过我的代码片段了吗?是的!不同的是,TopicsTopPartitions
需要是一个映射。我的流是一个InputStream
,甚至没有rdd。collect向我显示消息