簡體   English   中英

時間窗口上的Spark結構化流groupByKey不起作用

[英]Spark Structured Streaming groupByKey on a time Window not working

我需要將我的Kafka流批處理到每個10分鍾的時間窗口中,然后對其進行一些批處理。

注意:以下記錄具有時間戳字段

   val records = spark.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", brokerPool)
      .option("subscribe", topic)
      .option("startingOffsets", kafkaOffset)
      .load()

我使用以下命令向每個記錄添加一個時間窗口,

.withColumn("window", window($"timing", windowDuration))

我創建了一些幫助器類,例如

  case class TimingWindow(
      start: java.sql.Timestamp,
      end: java.sql.Timestamp
  )
  case class RecordWithWindow(
      record: MyRecord,
      groupingWindow: TimingWindow
  )

現在我有一個[RecordWithWindow]類型的DF

所有這些都很好。

下一個,

metricsWithWindow
  .groupByKey(_.groupingWindow)
  //By grouping, I get several records per time window
  //resulting an object of the below type which I write out to HDFS

  case class WindowWithRecords(
      records: Seq[MyRecord],
      window: TimingWindow
  )

在我檢查HDFS的地方,

范例

預期 :每個WindowWithRecords對象都具有唯一的TimingWindow

WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB, MyRecordC))

實際 :具有相同TimingWindow的多個WindowWithRecords對象

WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB))
WindowWithRecordsB(TimingWindowA, Seq(MyRecordC))

看起來groupByKey邏輯運行不正常。

希望我的問題清楚。 任何指針都會有所幫助。

發現問題:

處理窗口時,我沒有使用顯式觸發器。 結果,Spark盡可能快地創建了微型批處理,而不是在窗口末尾進行。

streamingQuery
.writeStream
.trigger(Trigger.ProcessingTime(windowDuration))
...
.start

這是我誤解了Spark文檔的結果。

注意:groupByKey使用對象的哈希碼。 重要的是要確保對象的哈希碼是一致的。

暫無
暫無

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

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