ŻądanieBodyTooLarge jest wyświetlane w dzienniku aplikacji przesyłania strumieniowego platformy Apache Spark w usłudze HDInsight

W tym artykule opisano kroki rozwiązywania problemów i możliwe rozwiązania problemów podczas korzystania ze składników platformy Apache Spark w klastrach usługi Azure HDInsight.

Problem

W dzienniku aplikacji przesyłania strumieniowego platformy Apache Spark zostaną wyświetlone poniższe błędy

NativeAzureFileSystem ... RequestBodyTooLarge

Lub

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)

Przyczyna

Pliki utworzone za pośrednictwem sterownika ABFS tworzą blokowe obiekty blob w usłudze Azure Storage. Plik dziennika zdarzeń platformy Spark prawdopodobnie osiąga limit długości pliku dla usługi WASB. Zobacz 50 000 bloków, które blokowy obiekt blob może przechowywać maksymalnie.

W usłudze Spark 2.3 każda aplikacja Spark generuje jeden plik dziennika zdarzeń platformy Spark. Plik dziennika zdarzeń platformy Spark dla aplikacji przesyłania strumieniowego platformy Spark nadal rośnie, gdy aplikacja jest uruchomiona. Obecnie plik w usłudze WASB ma 50000 limit bloków, a domyślny rozmiar bloku to 4 MB. Dlatego w konfiguracji domyślnej maksymalny rozmiar pliku to 195 GB. Jednak usługa Azure Storage zwiększyła maksymalny rozmiar bloku do 100 MB, co skutecznie ograniczyło limit pojedynczego pliku do 4,75 TB. Aby uzyskać więcej informacji, zobacz Cele dotyczące skalowalności i wydajności dla usługi Blob Storage.

Rozwiązanie

Dla tego błędu są dostępne cztery rozwiązania:

  • Zwiększ rozmiar bloku do 100 MB. W interfejsie użytkownika systemu Ambari zmodyfikuj właściwość fs.azure.write.request.size konfiguracji systemu plików HDFS (lub utwórz ją w Custom core-site sekcji). Ustaw właściwość na większą wartość, na przykład: 33554432. Zapisz zaktualizowaną konfigurację i ponownie uruchom składniki, których dotyczy problem.

  • Okresowo zatrzymywać i ponownie przesyłać zadanie przesyłania strumieniowego spark-streaming.

  • Używanie systemu plików HDFS do przechowywania dzienników zdarzeń platformy Spark. Korzystanie z systemu plików HDFS dla magazynu może spowodować utratę danych zdarzeń platformy Spark podczas skalowania klastra lub uaktualnień platformy Azure.

    1. Wprowadź zmiany w spark.eventlog.dir interfejsie użytkownika systemu Ambari i spark.history.fs.logDirectory za pośrednictwem go:

      spark.eventlog.dir = hdfs://mycluster/hdp/spark2-events
      spark.history.fs.logDirectory = "hdfs://mycluster/hdp/spark2-events"
      
    2. Tworzenie katalogów w systemie plików 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. Uruchom ponownie wszystkie usługi, których dotyczy problem za pośrednictwem interfejsu użytkownika systemu Ambari.

  • Dodawanie --conf spark.hadoop.fs.azure.enable.flush=false do przesyłania na platformie Spark w celu wyłączenia automatycznego opróżniania

Następne kroki

Jeśli nie widzisz problemu lub nie możesz rozwiązać problemu, odwiedź jeden z następujących kanałów, aby uzyskać więcej pomocy technicznej:

  • Uzyskaj odpowiedzi od ekspertów platformy Azure za pośrednictwem pomocy technicznej platformy Azure Community.

  • Połączenie z @AzureSupport — oficjalne konto Microsoft Azure w celu poprawy jakości obsługi klienta. Łączenie społeczności platformy Azure z odpowiednimi zasobami: odpowiedziami, pomocą techniczną i ekspertami.

  • Jeśli potrzebujesz dodatkowej pomocy, możesz przesłać wniosek o pomoc techniczną z Azure Portal. Wybierz pozycję Pomoc techniczna na pasku menu lub otwórz centrum Pomoc i obsługa techniczna . Aby uzyskać bardziej szczegółowe informacje, zobacz Jak utworzyć żądanie pomoc techniczna platformy Azure. Dostęp do zarządzania subskrypcjami i obsługi rozliczeń jest dołączony do subskrypcji Microsoft Azure, a pomoc techniczna jest zapewniana za pośrednictwem jednego z planów pomocy technicznej platformy Azure.