RequestBodyTooLarge wird im Apache Spark-Streaming-Anwendungsprotokoll in HDInsight angezeigt.

In diesem Artikel werden Schritte zur Problembehandlung und mögliche Lösungen für Probleme bei der Verwendung von Apache Spark-Komponenten in Azure HDInsight-Clustern beschrieben.

Problem

Sie erhalten nachstehende Fehler in einem Apache Spark Streaming-Anwendungsprotokoll

NativeAzureFileSystem ... RequestBodyTooLarge

oder

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)

Ursache

Dateien, die über den ABFS-Treiber erstellt wurden, erstellen Blockblobs in Azure-Speicher. Die Größe Ihrer Spark-Ereignisprotokolldatei übersteigt vermutlich die Dateilänge für WASB. Siehe 50.000 Blöcke, die ein Blockblob maximal aufnehmen kann.

In Spark 2.3 generiert jede Spark-App eine Spark-Ereignisprotokolldatei. Die Spark-Ereignisprotokolldatei für eine Spark-Streaming-App wird während der App-Ausführung immer größer. Heutzutage gilt für eine Datei in WASB ein Blocklimit von 50.000, und die Standardblockgröße beträgt 4 MB. Also beträgt die maximale Dateigröße in der Standardkonfiguration 195 GB. In Azure Storage wurde jedoch die maximale Blockgröße auf 100 MB angehoben und dadurch die Beschränkung für einzelne Dateien auf 4,75 TB erhöht. Weitere Informationen finden Sie unter Skalierbarkeits- und Leistungsziele für Blob Storage.

Lösung

Für diesen Fehler gibt es vier Lösungen:

  • Vergrößern Sie die Blockgröße auf bis zu 100 MB. Ändern Sie auf der Ambari-Benutzeroberfläche die HDFS-Konfigurationseigenschaft fs.azure.write.request.size (oder erstellen Sie sie im Abschnitt Custom core-site). Legen Sie die Eigenschaft auf einen größeren Wert fest, z. B. 33554432. Speichern Sie die aktualisierte Konfiguration, und starten Sie die betroffenen Komponenten neu.

  • Beenden Sie den Spark-Streamingauftrag regelmäßig, und übermitteln Sie ihn erneut.

  • Verwenden Sie HDFS zum Speichern der Spark-Ereignisprotokolle. Die Verwendung von HDFS für die Speicherung kann zu einem Verlust von Spark-Ereignisdaten während der Clusterskalierung oder bei Azure-Upgrades führen.

    1. Nehmen Sie auf der Ambari-Benutzeroberfläche Änderungen an spark.eventlog.dir und spark.history.fs.logDirectory vor:

      spark.eventlog.dir = hdfs://mycluster/hdp/spark2-events
      spark.history.fs.logDirectory = "hdfs://mycluster/hdp/spark2-events"
      
    2. Erstellen Sie Verzeichnisse in 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. Starten Sie alle betroffenen Dienste über die Ambari-Benutzeroberfläche neu.

  • Hinzufügen von --conf spark.hadoop.fs.azure.enable.flush=false in spark-submit zum Deaktivieren der automatischen Leerung

Nächste Schritte

Wenn Ihr Problem nicht aufgeführt ist oder Sie es nicht lösen können, besuchen Sie einen der folgenden Kanäle, um weitere Unterstützung zu erhalten:

  • Nutzen Sie den Azure-Communitysupport, um Antworten von Azure-Experten zu erhalten.

  • Setzen Sie sich mit @AzureSupport in Verbindung, dem offiziellen Microsoft Azure-Konto zum Verbessern der Kundenfreundlichkeit. Verbinden der Azure-Community mit den richtigen Ressourcen: Antworten, Support und Experten.

  • Sollten Sie weitere Unterstützung benötigen, senden Sie eine Supportanfrage über das Azure-Portal. Wählen Sie dazu auf der Menüleiste die Option Support aus, oder öffnen Sie den Hub Hilfe und Support. Ausführlichere Informationen hierzu finden Sie unter Erstellen einer Azure-Supportanfrage. Zugang zu Abonnementverwaltung und Abrechnungssupport ist in Ihrem Microsoft Azure-Abonnement enthalten. Technischer Support wird über einen Azure-Supportplan bereitgestellt.