Scala Spark streaming for Kafka:如何从Kafka消费者数据流获取主题名称?
我在Scala中设置了Spark Kafka Consumer,它接收来自多个主题的消息:Scala Spark streaming for Kafka:如何从Kafka消费者数据流获取主题名称?,scala,apache-spark,apache-kafka,Scala,Apache Spark,Apache Kafka,我在Scala中设置了Spark Kafka Consumer,它接收来自多个主题的消息: val properties = readProperties() val streamConf = new SparkConf().setMaster("local[*]").setAppName("Kafka-Stream") val ssc = new StreamingContext(streamConf, Seconds(10)) val kafkaParams = Map("metadata
val properties = readProperties()
val streamConf = new SparkConf().setMaster("local[*]").setAppName("Kafka-Stream")
val ssc = new StreamingContext(streamConf, Seconds(10))
val kafkaParams = Map("metadata.broker.list" -> properties.getProperty("broker_connection_str"),
"zookeeper.connect" -> properties.getProperty("zookeeper_connection_str"),
"group.id" -> properties.getProperty("group_id"),
"auto.offset.reset" -> properties.getProperty("offset_reset")
)
// Kafka integration with receiver
val msgStream = KafkaUtils.createStream[Array[Byte], String, DefaultDecoder, StringDecoder](
ssc, kafkaParams, Map(properties.getProperty("topic1") -> 1,
properties.getProperty("topic2") -> 2,
properties.getProperty("topic3") -> 3),
StorageLevel.MEMORY_ONLY_SER).map(_._2)
我需要为每个主题的消息(将是JSON格式)开发相应的操作代码
我提到了以下问题,但其中的答案对我没有帮助:
那么,在接收到的数据流上是否有任何方法可以用来获取主题名称和消息,以确定应该执行什么操作
在此方面的任何帮助都将不胜感激。谢谢。请参阅下面的代码
您可以通过foreachRDD、DStream上的map操作获取主题名和消息
msgStream.foreachRDD(rdd => {
val pairRdd = rdd.map(i => (i.topic(), i.value()))
})
下面的代码是我正在使用的createDirectStream的示例源代码
val ssc = new StreamingContext(configLoader.sparkConfig, Seconds(conf.getInt(Conf.KAFKA_PULL_INTERVAL)))
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> conf.getString(Conf.KAFKA_BOOTSTRAP_SERVERS),
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> conf.getString(Conf.KAFKA_CONSUMER_GID),
"auto.offset.reset" -> conf.getString(Conf.KAFKA_AUTO_OFFSET_RESET),
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics: Array[String] = conf.getString(Conf.KAFKA_TOPICS).split(",")
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
Subscribe[String, String](topics, kafkaParams)
)
您使用的是什么版本的
spark
呢?spark-streaming_2.11->1.6.1,spark-streaming-kafka_2.11->1.6.1”和kafka_2.11->0.8.2.2 anks作为响应。但是它在(i.topic(),i.value())上抛出错误:value-topic不是字符串的成员。这些方法是topic()和value()吗出现在rdd元素上?很抱歉。如果你使用createStream,你不知道主题名称。如果你需要主题名称,你必须使用createDirectStream实现它。使用createDirectStream,你可以通过上面的代码获得主题名称。好的。在我在问题陈述中分享的另一个问题中,他使用了createDirectStream.Bu我在为它传递参数时遇到了问题。你能给我看看createDirectStream实现的工作代码吗,因为它有很多变体?非常感谢。我会在周一测试它,并告诉你我周末在家。如果你添加导入语句和任何必要的依赖项,那就太好了。再次感谢。它充满了错误。你能同时添加导入语句吗?