Я выполняю задание 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
AngiSen 16 Сен 2018 в 12:49

2 ответа

Лучший ответ

Вы должны иметь возможность просто загрузить его со своего 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 --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(..) на Executors, а не на Driver. ОДНАКО, чтобы отправить их исполнителям, 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).

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

2
Ryan Widmaier 26 Окт 2018 в 15:02

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

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

  • URL HTTP / HTTPS.
  • URL HDFS.
3
user10533328 20 Окт 2018 в 14:42