Вы должны иметь возможность просто загрузить его с вашего 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).
Для справки, здесь - это место, где файлы загружаются в драйвер.