[英]Spark Streaming (Spark 1.6) vs Structured Streaming (Spark 2.2)
在Spark 2.2中,我將Spark流與Kafka一起使用,如下所示:
val conf = new SparkConf()
.setAppName("Test")
.setMaster("local[*]")
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(60))
val kafkaParams = Map[String, String](
"metadata.broker.list" -> "host1:port1,host2:port2",
"group.id" -> "group",
"auto.offset.reset" -> "largest")
val dstream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicsSet).map(_._2)
dstream.foreachRDD(rdd => { ...
})
ssc.start()
ssc.awaitTermination()
現在我需要使用Spark 2.2做同樣的事情。 我在閱讀有關結構化流的信息。 我是否正確理解我應該創建流式DataFrame而不需要使用ssc.start()
和ssc.awaitTermination()
?
這將完全替代上面顯示的代碼嗎?
val spark = SparkSession
.builder()
.appName("Test")
.enableHiveSupport()
.getOrCreate()
val df = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "topic1")
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)").as[(String, String)]
在哪里定義"group.id" -> group
和"auto.offset.reset" -> "largest"
?
更新:
我還發現了一些不同的方法:
val rawData: DataFrame = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", metadataBrokerList)
.option("subscribe", inputKafkaTopic)
.option("startingOffsets", "latest")
.option("failOnDataLoss", "true")
.load()
.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)").as[(String, String)]
然后可以將rawData
用作rawData.foreachRDD(rdd => { ... })
不會的 您仍然需要一個查詢(接收器)。 最簡單的形式
val keyValueDf = df
.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
val query = keyValueDf
.writeStream
.format("console")
.start()
和awaiTermination
(或等效的其他地方,例如spark.streams.awaitAnyTermination
)
query.awaitTermination()
要在接收器中執行foreachRDD
代碼(例如foreachRDD
),您可以嘗試writeStream.foreach
並定義ForeachWriter
:
val writer: ForeachWriter[Row]
df.writeStream.foreach(writer).start()
有關選項,請參閱Kafka特定配置 。
group.id
對於查詢是唯一的:
group.id:Kafka源將自動為每個查詢創建一個唯一的組ID。
應該使用startingOffsets
代替auto.offset.reset
:
auto.offset.reset :設置源選項startingOffsets以指定從何處開始。 結構化流管理在內部管理哪些偏移量,而不是依靠kafka使用者來執行此操作。 這將確保在動態訂閱新主題/分區時不會丟失任何數據。 請注意,startingOffsets僅在啟動新的流查詢時適用,並且恢復將始終從查詢中斷的地方開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.