RequestBodyTooLarge 出現在 HDInsight 中的 Apache Spark 串流應用程式記錄中

本文說明在 Azure HDInsight 叢集中使用 Apache Spark 元件時,疑難排解步驟和可能的解決方案。

問題

您會在 Apache Spark 串流應用程式記錄檔中收到下列錯誤

NativeAzureFileSystem ... RequestBodyTooLarge

Or

java.io.IOException: Operation failed: "The request body is too large and exceeds the maximum permissible limit.", 413, PUT, https://<storage account>.dfs.core.windows.net/<container>/hdp/spark2-events/application_1620341592106_0004_1.inprogress?action=flush&retainUncommittedData=false&position=9238349177&close=false&timeout=90, RequestBodyTooLarge, "The request body is too large and exceeds the maximum permissible limit. RequestId:0259adb6-101f-0041-0660-43f672000000 Time:2021-05-07T16:48:00.2660760Z"
        at org.apache.hadoop.fs.azurebfs.services.AbfsOutputStream.flushWrittenBytesToServiceInternal(AbfsOutputStream.java:362)
        at org.apache.hadoop.fs.azurebfs.services.AbfsOutputStream.flushWrittenBytesToService(AbfsOutputStream.java:337)
        at org.apache.hadoop.fs.azurebfs.services.AbfsOutputStream.flushInternal(AbfsOutputStream.java:272)
        at org.apache.hadoop.fs.azurebfs.services.AbfsOutputStream.hflush(AbfsOutputStream.java:230)
        at org.apache.hadoop.fs.FSDataOutputStream.hflush(FSDataOutputStream.java:134)
        at org.apache.spark.scheduler.EventLoggingListener$$anonfun$logEvent$3.apply(EventLoggingListener.scala:144)
        at org.apache.spark.scheduler.EventLoggingListener$$anonfun$logEvent$3.apply(EventLoggingListener.scala:144)
        at scala.Option.foreach(Option.scala:257)
        at org.apache.spark.scheduler.EventLoggingListener.logEvent(EventLoggingListener.scala:144)

原因

透過 ABFS 驅動程式建立的檔案會在 Azure 儲存體中建立區塊 Blob。 您的 Spark 事件記錄檔可能達到 WASB 的檔案長度限制。 請參閱區塊 Blob 最多可以保存的 50,000 個區塊

在 Spark 2.3 中,每個 Spark 應用程式都會產生一個 Spark 事件記錄檔。 Spark 串流應用程式的 Spark 事件記錄檔會在應用程式執行時持續成長。 目前 WASB 上的檔案有 50000 個區塊限制,而預設區塊大小為 4 MB。 因此,在預設設定中,檔案大小上限為 195 GB。 不過,Azure 儲存體已將區塊大小上限增加到 100 MB,這有效地將單一檔案限制提升為 4.75 TB。 如需詳細資訊,請參閱 Blob 儲存體的延展性和效能目標

解決方法

此錯誤有四個可用的解決方案:

  • 將區塊大小增加到最多 100 MB。 在 Ambari UI 中,修改 HDFS 組態屬性 fs.azure.write.request.size(或在 Custom core-site 區段中加以建立)。 將屬性設定為較大的值,例如:33554432。 儲存更新的組態並重新啟動受影響的元件。

  • 定期停止並重新提交 Spark 串流作業。

  • 使用 HDFS 來儲存 Spark 事件記錄。 在叢集調整或 Azure 升級期間,使用 HDFS 進行儲存可能會導致 Spark 事件資料遺失。

    1. 透過 Ambari UI 對 spark.eventlog.dirspark.history.fs.logDirectory 進行變更:

      spark.eventlog.dir = hdfs://mycluster/hdp/spark2-events
      spark.history.fs.logDirectory = "hdfs://mycluster/hdp/spark2-events"
      
    2. 在 HDFS 上建立目錄:

      hadoop fs -mkdir -p hdfs://mycluster/hdp/spark2-events
      hadoop fs -chown -R spark:hadoop hdfs://mycluster/hdp
      hadoop fs -chmod -R 777 hdfs://mycluster/hdp/spark2-events
      hadoop fs -chmod -R o+t hdfs://mycluster/hdp/spark2-events
      
    3. 透過 Ambari UI 重新啟動所有受影響的服務。

  • 在 spark-submit 中新增 --conf spark.hadoop.fs.azure.enable.flush=false 以停用自動排清

下一步

如果您沒有看到您的問題,或無法解決您的問題,請瀏覽下列其中一個管道以取得更多支援:

  • 透過 Azure 社群支援獲得由 Azure 專家所提供的解答。

  • 連線至 @AzureSupport,這是用來改善客戶體驗的官方 Microsoft Azure 帳戶。 將 Azure 社群連線到正確的資源:解答、支援和專家。

  • 如果需要更多協助,您可在 Azure 入口網站提交支援要求。 從功能表列中選取 [支援] 或開啟 [說明 + 支援] 中樞。 如需詳細資訊,請參閱如何建立 Azure 支援要求。 Microsoft Azure 訂用帳戶包括訂用帳戶管理及帳務支援的存取權,而技術支援由其中一項 Azure 支援方案提供。