Проблема GCP Dataproc spark.jar.packages при загрузке зависимостей

При создании нашего кластера Dataproc Spark мы передаем --properties spark:spark.jars.packages=mysql:mysql-connector-java:6.0.6 команде gcloud dataproc clusters create.

Это для того, чтобы наши сценарии PySpark сохранялись в CloudSQL.

По-видимому, при создании это ничего не делает, но при первом spark-submit это попытается разрешить эту зависимость.

Технически кажется, что нужно разрешить и загрузить необходимый файл jar, но первая задача в кластере завершится ошибкой из-за предупреждений, исходящих от spark-submit.

Exception in thread "main" java.lang.RuntimeException: [download failed: mysql#mysql-connector-java;6.0.6!mysql-connector-java.jar]
    at org.apache.spark.deploy.SparkSubmitUtils$.resolveMavenCoordinates(SparkSubmit.scala:1177)
    at org.apache.spark.deploy.SparkSubmit$.prepareSubmitEnvironment(SparkSubmit.scala:298)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:153)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

Полный вывод:

Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
:: loading settings :: url = jar:file:/usr/lib/spark/jars/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
mysql#mysql-connector-java added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
    confs: [default]
    found mysql#mysql-connector-java;6.0.6 in central
downloading https://repo1.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-java-6.0.6.jar ...
:: resolution report :: resolve 527ms :: artifacts dl 214ms
    :: modules in use:
    mysql#mysql-connector-java;6.0.6 from central in [default]
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      default     |   1   |   1   |   1   |   0   ||   1   |   0   |
    ---------------------------------------------------------------------

:: problems summary ::
:::: WARNINGS
        [FAILED     ] mysql#mysql-connector-java;6.0.6!mysql-connector-java.jar: Downloaded file size doesn't match expected Content Length for https://repo1.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-java-6.0.6.jar. Please retry. (212ms)

        [FAILED     ] mysql#mysql-connector-java;6.0.6!mysql-connector-java.jar: Downloaded file size doesn't match expected Content Length for https://repo1.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-java-6.0.6.jar. Please retry. (212ms)

    ==== central: tried

      https://repo1.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-java-6.0.6.jar

        ::::::::::::::::::::::::::::::::::::::::::::::

        ::              FAILED DOWNLOADS            ::

        :: ^ see resolution messages for details  ^ ::

        ::::::::::::::::::::::::::::::::::::::::::::::

        :: mysql#mysql-connector-java;6.0.6!mysql-connector-java.jar

        ::::::::::::::::::::::::::::::::::::::::::::::

Однако последующие задачи в кластере показывают этот вывод

Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
:: loading settings :: url = jar:file:/usr/lib/spark/jars/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
mysql#mysql-connector-java added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
    confs: [default]
    found mysql#mysql-connector-java;6.0.6 in central
:: resolution report :: resolve 224ms :: artifacts dl 5ms
    :: modules in use:
    mysql#mysql-connector-java;6.0.6 from central in [default]
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      default     |   1   |   0   |   0   |   0   ||   1   |   0   |
    ---------------------------------------------------------------------
:: retrieving :: org.apache.spark#spark-submit-parent
    confs: [default]
    0 artifacts copied, 1 already retrieved (0kB/7ms)

Итак, мой вопрос:

  1. В чем причина и могут ли это исправить хорошие люди из GCP?
  2. Существует ли временный обходной путь, помимо запуска фиктивной задачи, которая может завершиться ошибкой при создании кластера?

person Tom Lous    schedule 17.11.2017    source источник


Ответы (1)


Насколько постоянно вы можете воспроизвести это? Моя лучшая теория после попытки воспроизведения с другими настройками кластера заключается в том, что это, возможно, перегруженный сервер, который возвращает ошибку 5xx.

Что касается обходных путей:

1) Загрузите банку из Maven Central и передайте ее с опцией --jars при отправке задания. Если вы часто создаете новые кластеры, лучше всего разместить этот файл в кластере с помощью действий инициализации.

2) Предоставьте альтернативный файл настроек ivy через свойство spark.jars.ivySettings, которое указывает на зеркало Google Maven Central (это должно уменьшить/устранить вероятность ошибок 5xx)

См. эту статью: https://www.infoq.com/news/2015/11/maven-central-at-google

person tix    schedule 18.11.2017
comment
У нас это происходит каждый раз при создании кластера, поэтому вполне воспроизводимо :-) Я предполагаю, что он жалуется на длину содержимого, потому что содержимое сжато по протоколу (или около того). Мы попробуем ваши подходы и как можно скорее сообщим, что работает (лучше всего) - person Tom Lous; 20.11.2017
comment
Как странно, в какой зоне это происходит? Кроме того, вы используете флаг --no-address или у вас есть правила брандмауэра, запрещающие доступ извне? - person tix; 28.11.2017
comment
В настоящее время europe-west1-d, но ни флаг, ни правила брандмауэра. Как я уже сказал, загрузка на самом деле прошла успешно, но вызывает ошибку из-за предупреждений о несоответствии размеров файлов. К сожалению, это не удается выполнить первое задание, но благодаря Airflow он попытается повторить попытку, но это некрасиво и похоже на какую-то ошибку GCP. - person Tom Lous; 28.11.2017
comment
В итоге мы остановились на варианте 1. - person Tom Lous; 03.04.2018