簡體   English   中英

如何在Spark Streaming作業的每批中使用不同的Kafka主題?

[英]How to consume from a different Kafka topic in each batch of a Spark Streaming job?

我很確定沒有簡單的方法可以做到這一點,但這是我的用例:

我有一個Spark Streaming作業(版本2.1.0),每個微型批次的持續時間為5秒。

我的目標是,在每個微批處理間隔中,從250個Kafka主題中消耗1個不同主題的數據。 您可以將下面的代碼作為一個簡單的示例:

 val groupId:String = "first_group"
 val kafka_servers:String =  "datanode1:9092,datanode2:9092,datanode3:9092"

 val ss:SparkSession = SparkSession.builder().config("spark.streaming.unpersist","true").appName("ConsumerStream_test").getOrCreate()
 val ssc:StreamingContext= new StreamingContext(ss.sparkContext,Duration(5000))

val kafka_parameters:Map[String,Object]=Map(
"bootstrap.servers"       -> kafka_servers,
"key.deserializer"        -> classOf[StringDeserializer],
"value.deserializer"      -> classOf[ByteArrayDeserializer],
"heartbeat.interval.ms"   -> (1000:Integer),
"max.poll.interval.ms"    -> (100:Integer),
"enable.auto.commit"      -> (false: java.lang.Boolean),
"autoOffsetReset"         -> OffsetResetStrategy.EARLIEST,
//"connections.max.idle.ms" -> (5000:Integer),
"group.id"                -> groupId
)

val r = scala.util.Random
val kafka_list_one_topic=List("topic_"+ r.nextInt(250))

val consumer:DStream[ConsumerRecord[String,Array[Byte]]] = KafkaUtils.createDirectStream(ssc, LocationStrategies.PreferBrokers, ConsumerStrategies.
Subscribe[String, Array[Byte]](kafka_list_one_topic , kafka_parameters))

consumer.foreachRDD( eachRDD => {
     // DOING SOMETHING WITH THE DATA...
  })
ssc.start()
ssc.awaitTermination()

但是這種方法的問題在於,Spark只運行一次初始代碼(foreachRDD命令之前的所有內容)一次,以創建Kafka使用者DStream,但是在以下微型批處理中,它僅運行“ foreachRDD”語句。

例如,假設r.nextInt(250)返回40。Spark Streaming作業將連接到topic_40並處理其數據。 但是在下一個微型批處理中,它仍將連接到topic_40,並忽略foreachRDD語句之前的所有命令。

我想這是預料之中的,因為foreachRDD語句之前的代碼僅在Spark驅動程序上運行。

我的問題是,有沒有一種方法可以不必每5秒重新啟動一個Spark應用程序?

謝謝。

我的方法非常簡單,如果您希望它是隨機的並且不關心任何其他后果,請將kafka_list_one_topic設為可變變量,然后在流式代碼中對其進行更改。

val r = scala.util.Random
var kafka_list_one_topic=List("topic_"+ r.nextInt(250))

val consumer:DStream[ConsumerRecord[String,Array[Byte]]] = 
KafkaUtils.createDirectStream(ssc, LocationStrategies.PreferBrokers, 
ConsumerStrategies.
Subscribe[String, Array[Byte]](kafka_list_one_topic , kafka_parameters))

consumer.foreachRDD( eachRDD => {
 // DOING SOMETHING WITH THE DATA...
 kafka_list_one_topic=List("topic_"+ r.nextInt(250))
 })
ssc.start()
ssc.awaitTermination()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM