使用Spark(Python)和Dataproc从Google Storage下载文件

时间:2016-10-09 16:10:13

标签: python apache-spark google-cloud-storage google-cloud-dataproc

我有一个应用程序可以并行处理从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函数什么都不做。

那么我做错了什么?

1 个答案:

答案 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"