emr-5.20.0 Spark 2.4.0 запись партера в s3 занимает слишком много времени - PullRequest
0 голосов
/ 13 января 2019

Я использую:

  • ЭЙ-5.20.0
  • Hadoop 2.8.5
  • Spark 2.4.0

Одна из моих работ Spark записывает данные паркета в s3, что, кажется, выполняется за 20-30 минут с 90% обработки, но в течение последних 5-10% требуется 2 часа, чтобы закончить. Я прочитал много форумов и узнал, что EMR использует оптимизированный обработчик вывода, но он все еще занимает слишком много времени. Я пытаюсь настроить пользовательский коммиттер, но работа всегда использует EmrOptimizedSparkSqlParquetOutputCommitter, как я могу отключить это и добавить пользовательский коммиттер .... ниже приведены журналы:

19/01/12 23:17:11 INFO FileOutputCommitter: File Output Committer Algorithm version is 2
19/01/12 23:17:11 INFO FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: true
19/01/12 23:17:11 INFO SQLHadoopMapReduceCommitProtocol: Using user defined output committer class com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter
19/01/12 23:17:11 INFO EmrOptimizedParquetOutputCommitter: EMR Optimized Committer: ENABLED
19/01/12 23:17:11 INFO EmrOptimizedParquetOutputCommitter: Using output committer class org.apache.hadoop.mapreduce.lib.output.FileSystemOptimizedCommitter
19/01/12 23:17:11 INFO FileOutputCommitter: File Output Committer Algorithm version is 2
19/01/12 23:17:11 INFO FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: true
19/01/12 23:17:11 INFO FileOutputCommitter: File Output Committer Algorithm version is 2
19/01/12 23:17:11 INFO FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: true
19/01/12 23:17:11 INFO SQLHadoopMapReduceCommitProtocol: Using output committer class com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter
19/01/12 23:17:11 INFO FileSystemOptimizedCommitter: Nothing to setup as successful task attempt outputs are written directly.```

How do i disbale EMR to not use its own optimized EmrOptimizedSparkSqlParquetOutputCommitter

--conf spark.hadoop.mapred.output.committer.class = ai.peritus.training.preprocess.PeritusS3PartitionedOutputFormat 
--conf spark.hadoop.mapreduce.use.directfileoutputcommitter=false 
--conf spark.hadoop.spark.sql.parquet.output.committer.class= com.netflix.bdp.s3.S3PartitionedOutputCommitter 
--conf mapreduce.fileoutputcommitter.algorithm.version=1


1 Ответ

0 голосов
/ 25 января 2019

Я из команды EMR, поэтому я немного предвзят в отношении этой функции, хотя есть некоторые свидетельства того, что она хорошо работает для других клиентов. См. Например, https://stackoverflow.com/a/54350777/2205987.

Однако я сначала отвечу на вопрос, который вы задали. Чтобы использовать собственный класс коммиттера, вам нужно установить свойство spark.sql.parquet.output.committer.class. В приведенном выше примере вы неправильно используете spark.hadoop.spark.sql.parquet.output.committer.class.

Тем не менее, я думаю, что мы должны сначала подтвердить, что ваше приложение вообще использует оптимизатор EMRFS S3 в первую очередь. Если вы испытываете медлительность в конце задания, возможно, что оптимизированный коммиттер на самом деле не используется или что есть другая причина замедления в вашей работе, такая как перекос данных, вызывающий очень долгое выполнение задачи.

В некоторых случаях оптимизатор EMRFS S3 не будет фактически использоваться, даже если он включен. Это поможет узнать немного больше информации о вашем приложении, например пример кода. Кроме того, если вы сможете предоставить пример идентификатора кластера (j-ABC123), это поможет кому-нибудь из EMR отладить вашу проблему.

...