我有一个应用程序可以并行处理从Google Storage(我的项目存储桶)下载数据的Python对象的执行。群集是使用Google 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)])
我已经通过从python shell调用它来测试这个函数并且它可以工作。但是当我使用spark-submit运行以下代码时,不会下载文件(但不会引发错误):
# ...
filesRDD = sc.parallelize(fileList)
filesRDD.foreach(lambda myFile: copyDataFromBucket(myFile,remoteBucketFolder,'/tmp/output')
filesRDD.foreach(lambda myFile: execTouch(myFile,'/tmp/output')
# ...
execTouch函数有效(我可以看到每个worker上的文件),但copyDataFromBucket函数什么都不做。
那么我做错了什么?
答案 0 :(得分:2)
问题显然是Spark上下文。将呼叫替换为" gsutil"打电话给" hadoop fs"解决它:
from subprocess import call
from os.path import join
def copyDataFromBucket(filename,remoteFolder,localFolder):
call(["hadoop","fs","-copyToLocal",join(remoteFolder,filename),localFolder]
我还做了一个测试,将数据发送到存储桶。只需要替换" -copyToLocal"通过" -copyFromLocal"