2

我有一個應用程序可以並行執行處理要從Google Storage(我的項目存儲桶)下載的數據的Python對象。該羣集使用Google Dataproc創建。問題是數據永遠不會被下載!我寫了一個測試程序來試圖理解這個問題。 我寫了下面的功能將文件從桶複製,看看是否對工人創建文件不工作:使用Spark(Python)和Dataproc從Google Storage下載文件

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)]) 

我已經從一個Python外殼調用它測試了這個功能,它的工作原理。但是,當我使用火花提交運行下面的代碼,這些文件未下載(但不會引發錯誤):

# ... 
filesRDD = sc.parallelize(fileList) 
filesRDD.foreach(lambda myFile: copyDataFromBucket(myFile,remoteBucketFolder,'/tmp/output') 
filesRDD.foreach(lambda myFile: execTouch(myFile,'/tmp/output') 
# ... 

的execTouch功能工程(我可以看到每個工人的文件),但copyDataFromBucket功能什麼也沒做。

那麼我做錯了什麼?

+0

一個精度:我使用Anaconda2包來運行我的應用程序,但我必須將CLOUDSDK_PYTHON變量設置爲/ usr/bin/python以使gsutil能夠工作 – ma3oun

+0

if你用bash或shell運行'gsutil -m cp ...',目前工作嗎? – Kristian

+0

是的,它在主人和每個工人身上都能正常工作。 – ma3oun

回答

1

問題顯然是Spark上下文。通過調用「Hadoop的FS」更換呼叫「的gsutil」解決它:

from subprocess import call 
from os.path import join 

def copyDataFromBucket(filename,remoteFolder,localFolder): 
    call(["hadoop","fs","-copyToLocal",join(remoteFolder,filename),localFolder] 

我也做了一個測試將數據發送到桶。一個只需要用「-copyFromLocal」代替「-copyToLocal」

相關問題