У меня есть приложение, которое распараллеливает выполнение объектов Python, которые обрабатывают данные, которые будут загружаться из Google Storage (мой проект). Кластер создается с помощью Google Dataproc. Проблема в том, что данные никогда не загружаются! Я написал тестовую программу, чтобы попытаться понять проблему. я написал следующую функцию для копирования файлов из ведра и увидеть, если создание файлов на рабочих делает работу:Загрузка файлов из Google Storage с использованием Spark (Python) и Dataproc
from subprocess import call
from os.path import join
def copyDataFromBucket(filename,remoteFolder,localFolder):
call(["gsutil","-m","cp",join(remoteFolder,filename),localFolder]
def execTouch(filename,localFolder):
call(["touch",join(localFolder,"touched_"+filename)])
Я проверил эту функцию, вызвав ее из питона оболочки, и она работает. Но когда я запускаю следующий код с помощью искрового представить, файлы не загружаются (но не возникает никаких ошибок):
# ...
filesRDD = sc.parallelize(fileList)
filesRDD.foreach(lambda myFile: copyDataFromBucket(myFile,remoteBucketFolder,'/tmp/output')
filesRDD.foreach(lambda myFile: execTouch(myFile,'/tmp/output')
# ...
Функция работает execTouch (я могу видеть файлы на каждого работника), но функцию copyDataFromBucket ничего не делает.
Так что я делаю неправильно?
Одна точность: я использую пакет Anaconda2 для запуска моего приложения, но мне пришлось установить переменную CLOUDSDK_PYTHON в/usr/bin/python для работы gsutil для работы – ma3oun
, если вы должны были запустить 'gsutil -m cp ...' с bash или в вашей оболочке, работает ли это в настоящее время? – Kristian
Да, он отлично работает, как у мастера, так и у каждого из рабочих. – ma3oun