Коммиттер Apache Spark s3a - стек потоков - проблемы с нехваткой памяти

0

Вопрос

Мне действительно нужна помощь здесь:

Мы используем Spark3.1.2 с использованием автономного кластера. С тех пор как мы начали использовать коммиттер каталогов s3a, стабильность и производительность наших заданий spark значительно выросли!

Однако в последнее время мы совершенно сбиты с толку устранением этой проблемы с фиксатором каталогов s3a в течение нескольких дней и задаемся вопросом, есть ли у вас какие-либо идеи о том, что происходит?

Наши задания spark завершаются неудачно из-за ошибки Java OOM (или, скорее, ограничения процесса) :

 An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.

: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
    at java.base/java.lang.Thread.start0(Native Method)
    at java.base/java.lang.Thread.start(Thread.java:803)
    at java.base/java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:937)
    at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1343)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
    at java.base/java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:714)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.$anonfun$new$1(MessageLoop.scala:174)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.$anonfun$new$1$adapted(MessageLoop.scala:173)
    at scala.collection.immutable.Range.foreach(Range.scala:158)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.<init>(MessageLoop.scala:173)
    at org.apache.spark.rpc.netty.Dispatcher.liftedTree1$1(Dispatcher.scala:75)
    at org.apache.spark.rpc.netty.Dispatcher.registerRpcEndpoint(Dispatcher.scala:72)
    at org.apache.spark.rpc.netty.NettyRpcEnv.setupEndpoint(NettyRpcEnv.scala:136)
    at org.apache.spark.storage.BlockManager.<init>(BlockManager.scala:231)
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:394)
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:189)
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:277)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:458)
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:238)
    at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
    at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.base/java.lang.Thread.run(Thread.java:834)

Дамп потоков Spark показывает более 5000 потоков коммиттеров в драйвере spark! Вот пример:

Thread ID   Thread Name Thread State    Thread Locks
1047    s3-committer-pool-0 WAITING 
1449    s3-committer-pool-0 WAITING 
1468    s3-committer-pool-0 WAITING 
1485    s3-committer-pool-0 WAITING 
1505    s3-committer-pool-0 WAITING 
1524    s3-committer-pool-0 WAITING 
1529    s3-committer-pool-0 WAITING 
1544    s3-committer-pool-0 WAITING 
1549    s3-committer-pool-0 WAITING 
1809    s3-committer-pool-0 WAITING 
1972    s3-committer-pool-0 WAITING 
1998    s3-committer-pool-0 WAITING 
2022    s3-committer-pool-0 WAITING 
2043    s3-committer-pool-0 WAITING 
2416    s3-committer-pool-0 WAITING 
2453    s3-committer-pool-0 WAITING 
2470    s3-committer-pool-0 WAITING 
2517    s3-committer-pool-0 WAITING 
2534    s3-committer-pool-0 WAITING 
2551    s3-committer-pool-0 WAITING 
2580    s3-committer-pool-0 WAITING 
2597    s3-committer-pool-0 WAITING 
2614    s3-committer-pool-0 WAITING 
2631    s3-committer-pool-0 WAITING 
2726    s3-committer-pool-0 WAITING 
2743    s3-committer-pool-0 WAITING 
2763    s3-committer-pool-0 WAITING 
2780    s3-committer-pool-0 WAITING 
2819    s3-committer-pool-0 WAITING 
2841    s3-committer-pool-0 WAITING 
2858    s3-committer-pool-0 WAITING 
2875    s3-committer-pool-0 WAITING 
2925    s3-committer-pool-0 WAITING 
2942    s3-committer-pool-0 WAITING 
2963    s3-committer-pool-0 WAITING 
2980    s3-committer-pool-0 WAITING 
3020    s3-committer-pool-0 WAITING 
3037    s3-committer-pool-0 WAITING 
3055    s3-committer-pool-0 WAITING 
3072    s3-committer-pool-0 WAITING 
3127    s3-committer-pool-0 WAITING 
3144    s3-committer-pool-0 WAITING 
3163    s3-committer-pool-0 WAITING 
3180    s3-committer-pool-0 WAITING 
3222    s3-committer-pool-0 WAITING 
3242    s3-committer-pool-0 WAITING 
3259    s3-committer-pool-0 WAITING 
3278    s3-committer-pool-0 WAITING 
3418    s3-committer-pool-0 WAITING 
3435    s3-committer-pool-0 WAITING 
3452    s3-committer-pool-0 WAITING 
3469    s3-committer-pool-0 WAITING 
3486    s3-committer-pool-0 WAITING 
3491    s3-committer-pool-0 WAITING 
3501    s3-committer-pool-0 WAITING 
3508    s3-committer-pool-0 WAITING 
4029    s3-committer-pool-0 WAITING 
4093    s3-committer-pool-0 WAITING 
4658    s3-committer-pool-0 WAITING 
4666    s3-committer-pool-0 WAITING 
4907    s3-committer-pool-0 WAITING 
5102    s3-committer-pool-0 WAITING 
5119    s3-committer-pool-0 WAITING 
5158    s3-committer-pool-0 WAITING 
5175    s3-committer-pool-0 WAITING 
5192    s3-committer-pool-0 WAITING 
5209    s3-committer-pool-0 WAITING 
5226    s3-committer-pool-0 WAITING 
5395    s3-committer-pool-0 WAITING 
5634    s3-committer-pool-0 WAITING 
5651    s3-committer-pool-0 WAITING 
5668    s3-committer-pool-0 WAITING 
5685    s3-committer-pool-0 WAITING 
5702    s3-committer-pool-0 WAITING 
5722    s3-committer-pool-0 WAITING 
5739    s3-committer-pool-0 WAITING 
6144    s3-committer-pool-0 WAITING 
6167    s3-committer-pool-0 WAITING 
6289    s3-committer-pool-0 WAITING 
6588    s3-committer-pool-0 WAITING 
6628    s3-committer-pool-0 WAITING 
6645    s3-committer-pool-0 WAITING 
6662    s3-committer-pool-0 WAITING 
6675    s3-committer-pool-0 WAITING 
6692    s3-committer-pool-0 WAITING 
6709    s3-committer-pool-0 WAITING 
7049    s3-committer-pool-0 WAITING 

Это с учетом того, что наши настройки не позволяют использовать более 100 потоков… Или мы чего-то не понимаем…

Вот наши конфигурации и настройки:

fs.s3a.threads.max  100 
fs.s3a.connection.maximum  1000 
fs.s3a.committer.threads 16   
fs.s3a.max.total.tasks  5
fs.s3a.committer.name   directory
fs.s3a.fast.upload.buffer                 disk
io.file.buffer.size                                1048576
mapreduce.outputcommitter.factory.scheme.s3a    - org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory

Мы пробовали разные версии облачной библиотеки spark Hadoop, но проблема неизменно одна и та же.

https://repository.cloudera.com/content/repositories/releases/org/apache/spark/spark-hadoop-cloud_2.11/2.4.0-cdh6.3.2/spark-hadoop-cloud_2.11-2.4.0-cdh6.3.2.jar

https://repository.cloudera.com/artifactory/libs-release-local/org/apache/spark/spark-hadoop-cloud_2.11/2.4.0.7.0.3.0-79/spark-hadoop-cloud_2.11-2.4.0.7.0.3.0-79.jar

https://repo1.maven.org/maven2/org/apache/spark/spark-hadoop-cloud_2.12/3.2.0/spark-hadoop-cloud_2.12-3.2.0.jar

https://repository.cloudera.com/artifactory/libs-release-local/org/apache/spark/spark-hadoop-cloud_2.12/3.1.2.7.2.12.0-291/spark-hadoop-cloud_2.12-3.1.2.7.2.12.0-291.jar

Мы были бы очень признательны, если бы вы указали нам правильное направление

amazon-s3 apache-spark hadoop java
2021-11-23 16:49:54
2

Лучший ответ

3

Это будет HADOOP-16570 коммиттеров S3A, которые пропускают потоки/повышают ООМ при выполнении заданий/задач в масштабе

перейдите к двоичным файлам hadoop-3.3.0 для исправления. В идеале до 3.3.1, чтобы исправить некоторые другие проблемы, особенно повторяющиеся задания, поступающие от spark. Не уверен, как далеко зашло это исправление в выпусках CDH; Я мог бы разобраться, если вам действительно нужно сейчас. Не CDH6.x, конечно

2021-11-28 12:13:50

Большое вам спасибо! Действительно, все, что мы делали, не помогало.
Ofer Eliassaf

Наша проблема сейчас заключается в поиске правильных драйверов - где мы можем получить spark-cloud jar с соответствующей версией? Будет ли этот драйвер работать для Spark 3.1.2: mvnrepository.com/artifact/org.apache.spark/... ??
Ofer Eliassaf

банка spark cloud должна быть предназначена для вашего дистрибутива spark; это всего лишь класс тонкой привязки
stevel

Привет, мы пытаемся включить это в Spark 3.1.2, который поставляется в комплекте с Hadoop 3.2. Безопасно ли предоставлять spark-hadoop-cloud для 3.3.1 вместе с библиотеками Hadoop 3.2? (Мы пытаемся использовать разукрупненную версию и столкнулись с некоторыми трудностями из-за несоответствия библиотек хранителей зоопарка и Гуавы. более быстрый путь будет заключаться в том, чтобы пойти в комплекте и просто добавить отправителя 3.3.1. Будет ли это работать?). Спасибо!
Ofer Eliassaf

используйте spark-hadoop-cloud-3.1.2; вам понадобится полный набор hadoop-3.3.x в идеальной синхронизации. или перенесите исправление фиксатора только в hadoop 3.2
stevel

В этом spark-hadoop-cloud-3.1.2 есть эта ошибка (и найти ее было кошмаром, так как ее нет в официальных выпусках maven). В итоге мы сделали следующее: Вариант 1 (наша текущая настройка): Используйте разукрупненную версию spark 3.1.2. Мы добавили двоичные файлы Hadoop 3.3.1 Мы добавили spark-hadoop-cloud-3.2.0 для решения проблемы с фиксатором. Вариант 2 (который мы рассматриваем): Принесите Spark3.1.2 в комплекте (который поставляется с Hadoop 3.2) И добавьте spark-hadoop-cloud-3.2.0 для исправления ошибок отправителя. Что, по вашему мнению, лучше?
Ofer Eliassaf

Утечка потока происходит в hadoop-aws; это должен быть только hadoop -*, который нуждается в обновлении.
stevel
1

Ознакомьтесь с этой статьей о настройке для S3A.

В частности, я бы посмотрел на это, хотя оно классифицировано в разделе массив:

Возможно, вам потребуется выполнить тщательную настройку, чтобы снизить риск нехватки памяти, особенно если данные буферизованы в памяти. Существует ряд параметров, которые можно настроить:

Общее количество потоков, доступных в файловой системе для загрузки данных или любой другой операции файловой системы в очереди. Это задано в fs.s3a.threads.max.

Количество операций, которые могут быть поставлены в очередь для выполнения в ожидании потока. Это задано в fs.s3a.максимальное общее количество задач.

Количество блоков, которые могут быть активны в одном выходном потоке (то есть загружаются потоком или помещаются в очередь потоков файловой системы). Это задано в блоках fs.s3a.fast.upload.active..

Время, в течение которого неработающий поток может оставаться в пуле потоков , прежде чем он будет удален. Это задано в файле fs.s3a.threads.keepalivetime.

Я думаю, вы можете обнаружить, что уменьшение количества потоков уменьшит нагрузку на память.

Я также предлагаю вам настроиться fs.s3a.fast.upload.active.blocks это также облегчит нагрузку на память. Я думаю, что сокращение количества потоков должно быть вашим первым шагом, так как 100-это немного агрессивно. Вероятно, у вас ограничена пропускная способность, и дополнительные потоки, скорее всего, ничего не делают, кроме как потребляют память.

2021-11-28 12:08:19

Вы знаете, для чего предназначены потоки драйверов? Если я правильно понимаю, потоки конфигурации должны быть для рабочих. Для чего нужны потоки драйверов?
Ofer Eliassaf

Взгляните на документацию по коммиттеру s3.(Не на 100% то же самое, что и здесь, но хорошее место, чтобы узнать о s3 и spark) Ссылка ниже. Это наводит на мысль о том, что файлы передаются водителю и что они зафиксированы. Мы не можем знать, что это то же самое для записи этого файла, но это кажется логичным, поскольку драйвер-единственный, кто знает, что задание выполнено успешно/не выполнено. Я не нашел дымящегося пистолета, утверждающего, что это правда, но это кажется разумным/правдоподобным. github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/...
Matt Andruff

Это также имело бы смысл, почему использование 100 потоков на одного работника может привести к появлению 5000 потоков в драйвере и почему снова следует рассмотреть возможность использования числа, которое не будет оказывать такого большого давления на драйвер. (уменьшите количество потоков)
Matt Andruff

посмотрите на ответ @Stevel - это известная ошибка hadoop с более ранними версиями коммиттера!
Ofer Eliassaf

Большое вам спасибо за то, что позвонили мне.
Matt Andruff

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................