簡體   English   中英

跳過的階段對 Spark 作業有任何性能影響嗎?

[英]Does skipped stages have any performance impact on Spark job?

我正在運行一個 spark 結構化流式作業,其中涉及創建一個空的 dataframe,使用如下每個微批次對其進行更新。 每執行一次微批處理,階段數就會增加 4。為了避免重新計算,我在循環內的每次更新后將更新的 StaticDF 持久化到 memory 中。 這有助於跳過每個新微批次創建的額外階段。

我的問題-

1)即使總完成的階段保持不變,因為增加的階段總是被跳過,但它是否會導致性能問題,因為在一個時間點可能有數百萬個跳過的階段?
2)當緩存的RDD的一部分或全部不可用時會發生什么? (節點/執行器故障)。 Spark 文檔說,到目前為止,它並沒有具體化從多個微批次接收到的全部數據,這是否意味着它需要再次從 Kafka 讀取所有事件以重新生成 staticDF?

// one time creation of empty static(not streaming) dataframe
val staticDF_schema = new StructType()
      .add("product_id", LongType)
      .add("created_at", LongType)
var staticDF = sparkSession
.createDataFrame(sparkSession.sparkContext.emptyRDD[Row], staticDF_schema)

// Note : streamingDF was created from Kafka source
    streamingDF.writeStream
      .trigger(Trigger.ProcessingTime(10000L))
      .foreachBatch {
        (micro_batch_DF: DataFrame) => {

        // fetching max created_at for each product_id in current micro-batch
          val staging_df = micro_batch_DF.groupBy("product_id")
            .agg(max("created").alias("created"))

          // Updating staticDF using current micro batch
          staticDF = staticDF.unionByName(staging_df)
          staticDF = staticDF
            .withColumn("rnk",
              row_number().over(Window.partitionBy("product_id").orderBy(desc("created_at")))
            ).filter("rnk = 1")
            .drop("rnk")
              .cache()

          }

在此處輸入圖像描述

即使跳過的階段不需要任何計算,但我的工作在一定數量的批次后開始失敗。 這是因為每次批處理執行時 DAG 都會增長,使其無法管理並引發堆棧溢出異常。

為了避免這種情況,我不得不打破火花譜系,這樣每次運行的階段數都不會增加(即使它們被跳過)

暫無
暫無

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

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