Газированная вода не заводится на spark в google dataproc

Я пытаюсь использовать газированную воду H2O в Google DataProc. Я успешно запустил Sparkling Water на автономном Spark, а теперь перешел к его использованию в DataProc. Изначально у меня возникла ошибка о том, что spark.dynamicAllocation.enabled не поддерживается, поэтому я перешел на мастер и начал вот так ...

pyspark \
   --conf spark.ext.h2o.fail.on.unsupported.spark.param=false \
   --conf spark.dynamicAllocation.enabled=false

Взаимодействие для запуска Sparkling Water выглядит следующим образом: когда стадия достигает отметки 30000, она начинает измельчать, а затем через 30 минут или около того появляется строка ошибок:

>>> from pysparkling import *
>>> import h2o
>>> hc = H2OContext.getOrCreate(spark)
18/04/11 11:56:08 WARN org.apache.spark.h2o.backends.internal.InternalH2OBackend: Increasing 'spark.locality.wait' to value 30000
18/04/11 11:56:08 WARN org.apache.spark.h2o.backends.internal.InternalH2OBackend: Due to non-deterministic behavior of Spark broadcast-based joins
We recommend to disable them by
configuring `spark.sql.autoBroadcastJoinThreshold` variable to value `-1`:
sqlContext.sql("SET spark.sql.autoBroadcastJoinThreshold=-1")
[Stage 0:=================>                               (35346 + 11) / 100001]

Я пробовал разные вещи, например: - Развертывание мелкое (3 узла). - Развертывание кластера на 30 рабочих. - Пробовал запускать образ DataProc 1.1 (Spark 2.0), 1.2 (Spark 2.2) и предварительный просмотр (Spark 2.2).

Также пробовал разные варианты Spark:

spark.ext.h2o.fail.on.unsupported.spark.param=false \
spark.ext.h2o.nthreads=2
spark.ext.h2o.cluster.size=2
spark.ext.h2o.default.cluster.size=2
spark.ext.h2o.hadoop.memory=50m
spark.ext.h2o.repl.enabled=false
spark.ext.h2o.flatfile=false
spark.dynamicAllocation.enabled=false
spark.executor.memory=700m

Кому-нибудь повезло с H2O в Google DataProc?

Подробные ошибки:

18/04/11 12:08:40 WARN org.apache.spark.scheduler.cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Container marked as failed: container_1523445048432_0005_01_000006 on host: cluster-dev-w-0.c.trust-networks.internal. Exit status: 1. Diagnostics: Exception from container-launch.
Container id: container_1523445048432_0005_01_000006
Exit code: 1
Stack trace: ExitCodeException exitCode=1: 
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:972)
    at org.apache.hadoop.util.Shell.run(Shell.java:869)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:1170)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:236)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:305)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:84)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Container exited with a non-zero exit code 1

18/04/11 12:08:48 ERROR org.apache.spark.network.server.TransportRequestHandler: Error sending result RpcResponse{requestId=5571077381947066483, body=NioManagedBuffer{buf=java.nio.HeapByteBuffer[pos=0 lim=81 cap=156]}} to /10.154.0.12:59387; closing connection
java.nio.channels.ClosedChannelException
    at io.netty.channel.AbstractChannel$AbstractUnsafe.write(...)(Unknown Source)

и позже:

Exception in thread "task-result-getter-3" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.Class.newReflectionData(Class.java:2513)
    at java.lang.Class.reflectionData(Class.java:2503)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2660)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:403)
    at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
    at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:112)
1
0
322
2

Ответы 2

Вы получаете java.lang.OutOfMemoryError. Дайте больше памяти.

Мое внимание привлекла линия spark.executor.memory=700m. Я рекомендую делать исполнителей не меньше 5Гб каждый, да и то мало.

TomKraljevic 21.04.2018 13:25

Хорошо, думаю, я решил это для себя. Газированная вода распределяет ресурсы на основе ряда настроек, которые не являются настройками по умолчанию в Google DataProc.

Я отредактировал /etc/spark/conf/spark-defaults.conf, заменил spark.dynamicAllocation.enabled на false и заменил spark.ext.h2o.dummy.rdd.mul.factor на 1, что позволило кластеру H2O запуститься примерно за 3 минуты с примерно десятой частью ресурсов.

Если он запускается слишком медленно для вас, попробуйте уменьшить spark.executor.instances с 10000 до 5000 или 1000, хотя эти настройки влияют на производительность всего остального, что вы используете в кластере Spark.

Другие вопросы по теме