Запуск заданий Spark в кластере YARN с дополнительными файлами

Я пишу простое приложение spark, которое использует некоторый входной RDD, отправляет его во внешний скрипт через канал и записывает вывод этого скрипта в файл. Код драйвера выглядит так:

val input = args(0)
val scriptPath = args(1)
val output = args(2)
val sc = getSparkContext
if (args.length == 4) {
  //Here I pass an additional argument which contains an absolute path to a script on my local machine, only for local testing
  sc.addFile(args(3))
}

sc.textFile(input).pipe(Seq("python2", SparkFiles.get(scriptPath))).saveAsTextFile(output)

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

spark-submit --master yarn --deploy-mode cluster --files /absolute/path/to/local/test.py --class somepackage.PythonLauncher path/to/driver.jar path/to/input/part-* test.py path/to/output` 

завершается с исключением.

Lost task 1.0 in stage 0.0 (TID 1, rwds2.1dmp.ru): java.lang.Exception: Subprocess exited with status 2

Я пробовал различные варианты команды трубы. Например, .pipe("cat") работает нормально, и ведет себя как ожидаемо, но .pipe(Seq("cat", scriptPath)) также не удается с кодом ошибки 1, поэтому кажется, что spark не может выяснить путь к скрипту на узле кластера.

какие предложения?

2 ответов


Я сам не использую python, но я нахожу некоторые подсказки, которые могут быть полезны для вас (в исходном коде Spark-1.3 SparkSubmitArguments)

  • --py-files PY_FILES, -разделенный запятыми список .промелькнуть. ,яйцо, или .py-файлы для размещения на PYTHONPATH для приложений Python.

  • --files FILES, список файлов, разделенных запятыми, которые будут помещены в рабочий каталог каждого исполнитель.

  • --archives ARCHIVES, разделенный запятыми список архивов для извлечения в рабочий каталог каждого исполнителя.

а также, ваши аргументы в spark-submit должны следовать этому стилю:

Usage: spark-submit [options] <app jar | python file> [app arguments]


вы можете попробовать и использовать local:// и $SPARK_YARN_STAGING_DIR env var.

например, должно работать следующее:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --files /absolute/path/to/local/test.py \
    --class somepackage.PythonLauncher \
    local://$SPARK_YARN_STAGING_DIR/test.py