RequestBodyTooLarge viene visualizzato nel log dell'applicazione Apache Spark Streaming in HDInsight

Questo articolo descrive le procedure di risoluzione dei problemi e le possibili soluzioni per i problemi relativi all'uso di componenti Apache Spark nei cluster Azure HDInsight.

Problema

Si riceveranno gli errori seguenti in un log dell'applicazione Apache Spark Streaming

NativeAzureFileSystem ... RequestBodyTooLarge

Oppure

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)

Causa

I file creati tramite il driver ABFS creano BLOB bloccati nell'archiviazione di Azure. Il file di log eventi Spark raggiunge probabilmente il limite di lunghezza del file per WASB. Vedere 50.000 blocchi che un BLOB a blocchi può contenere al massimo.

In Spark 2.3 ogni app Spark genera un file di log eventi Spark. Il file di log eventi Spark per un'app di streaming Spark continua a crescere durante l'esecuzione dell'app. Oggi un file in WASB ha un limite di blocco di 50000 e le dimensioni predefinite del blocco sono 4 MB. Quindi, nella configurazione predefinita, le dimensioni massime del file sono 195 GB. Tuttavia, Archiviazione di Azure ha aumentato la dimensione massima del blocco a 100 MB, che ha effettivamente portato il limite di file singolo a 4,75 TB. Per altre informazioni, vedere Obiettivi di scalabilità e prestazioni per Archiviazione BLOB.

Risoluzione

Per questo errore sono disponibili quattro soluzioni:

  • Aumentare le dimensioni del blocco fino a 100 MB. Nell'interfaccia utente di Ambari modificare la proprietà fs.azure.write.request.size di configurazione HDFS (o crearla nella Custom core-site sezione). Impostare la proprietà su un valore più grande, ad esempio: 33554432. Salvare la configurazione aggiornata e riavviare i componenti interessati.

  • Arrestare periodicamente e inviare nuovamente il processo di streaming spark.

  • Usare HDFS per archiviare i log eventi Spark. L'uso di HDFS per l'archiviazione può causare la perdita di dati degli eventi Spark durante il ridimensionamento del cluster o gli aggiornamenti di Azure.

    1. Apportare modifiche a spark.eventlog.dir e spark.history.fs.logDirectory tramite l'interfaccia utente di Ambari:

      spark.eventlog.dir = hdfs://mycluster/hdp/spark2-events
      spark.history.fs.logDirectory = "hdfs://mycluster/hdp/spark2-events"
      
    2. Creare directory 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. Riavviare tutti i servizi interessati tramite l'interfaccia utente di Ambari.

  • Aggiungere --conf spark.hadoop.fs.azure.enable.flush=false in spark-submit per disabilitare lo scaricamento automatico

Passaggi successivi

Se il problema riscontrato non è presente in questo elenco o se non si riesce a risolverlo, visitare uno dei canali seguenti per ottenere ulteriore assistenza:

  • Ricevere risposte dagli esperti di Azure tramite la pagina Supporto della community per Azure.

  • Connessione con @AzureSupport - l'account ufficiale Microsoft Azure per migliorare l'esperienza dei clienti. Mette in contatto la community di Azure con le risorse giuste: risposte, supporto ed esperti.

  • Se serve ulteriore assistenza, è possibile inviare una richiesta di supporto dal portale di Azure. Selezionare Supporto nella barra dei menu o aprire l'hub Guida e supporto. Per informazioni più dettagliate, vedere Come creare una richiesta di supporto in Azure. L'accesso al supporto per la gestione delle sottoscrizioni e la fatturazione è incluso nella sottoscrizione di Microsoft Azure e il supporto tecnico viene fornito tramite uno dei piani di supporto di Azure.