簡體   English   中英

Spark流(Spark 1.6)與結構化流(Spark 2.2)

[英]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.

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