Команда PySpark spark-submit с аргументом --files Ошибка - PullRequest
0 голосов
/ 16 сентября 2018

Я запускаю задание PySpark в кластере Spark 2.3 с помощью следующей команды:

spark-submit 
--deploy-mode cluster 
--master yarn 
--files ETLConfig.json 
PySpark_ETL_Job_v0.2.py

ETLConfig.json имеет параметр, переданный в сценарий PySpark.Я ссылаюсь на этот файл конфигурации json в главном блоке, как показано ниже:

configFilePath = os.path.join(SparkFiles.getRootDirectory(), 'ETLConfig.json')
with open(configFilePath, 'r') as configFile:
    configDict = json.load(configFile)

Но команда выдает следующую ошибку.

No such file or directory: u'/tmp/spark-7dbe9acd-8b02-403a-987d-3accfc881a98/userFiles-4df4-5460-bd9c-4946-b289-6433-drgs/ETLConfig.json'

Могу ли я знать, что не так с моим сценарием?Я также пытался с помощью команды SparkFiles.get(), но она также не работала.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы должны иметь возможность просто загрузить его с вашего PWD в работающий драйвер.Yarn запустит процесс главного контейнера в той же папке, где --files выведет файл.Для режима клиента это будет отличаться, но для режима кластера это должно работать нормально.Например, это работает для меня:

driver.py

from pyspark import SparkContext, SparkFiles
import os

with SparkContext() as sc:
    print "PWD: " + os.getcwd()
    print "SparkFiles: " + SparkFiles.getRootDirectory()
    data = open('data.json')
    print "Success!"

spark submit

spark-submit --deploy-mode cluster --master yarn --files data.json driver.py

Обновлено (сравнение путей):

Я обновил свой код для печати как PWD (который работал), так и SparkFiles.getRootDirectory (который не работал).По некоторым причинам пути отличаются.Я не уверен, почему это так ... но загрузка файлов непосредственно из PWD - это то, что я всегда делал для доступа к файлам из драйвера.

Вот что напечатано:

PWD: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/container_1539970334177_0004_01_000001
SparkFiles: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/spark-e869ac40-66b4-427e-a928-deef73b34e40/userFiles-a1d8e17f-b8a5-4999-8

Обновление # 2

Очевидно, что он работает --files, и его братья гарантируют только предоставление файлов в папке SparkFiles.get(..) на исполнителях, а не на драйвере.ОДНАКО, чтобы отправить их исполнителям, Spark сначала загружает их в PWD на драйвере, что позволяет вам получить к нему доступ оттуда.драйвер.

  --files FILES               Comma-separated list of files to be placed in the working
                              directory of each executor. File paths of these files
                              in executors can be accessed via SparkFiles.get(fileName).

Для справки, здесь - это место, где файлы загружаются в драйвер.

0 голосов
/ 20 октября 2018

Вы используете cluster режим развертывания.В этом случае путь --files относится не к локальному пути на машине, которую вы используете для отправки, а к локальному пути на рабочем, который используется для порождения драйвера, который является произвольным узлом в вашем кластере.

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

  • HTTP / HTPPS URL.
  • HDFS URL.
...