例如,我有一个文件夹:
/
- test.py
- test.yml
并将作业提交给spark群集:
gcloud beta dataproc jobs submit pyspark --files=test.yml "test.py"
在test.py
中,我想访问我上传的静态文件。
with open('test.yml') as test_file:
logging.info(test_file.read())
但得到以下例外:
IOError: [Errno 2] No such file or directory: 'test.yml'
如何访问我上传的文件?
答案 0 :(得分:13)
可以通过SparkContext.addFile
访问使用--files
(和SparkFiles
)分发的文件。它提供了两种方法:
getRootDirectory()
- 返回分布式文件的根目录get(filename)
- 返回文件的绝对路径我不确定是否存在任何Dataproc特定限制,但是这样的事情应该可以正常工作:
from pyspark import SparkFiles
with open(SparkFiles.get('test.yml')) as test_file:
logging.info(test_file.read())
答案 1 :(得分:0)
基本上,当您向spark提交spark作业时,它不会将您想要处理的文件序列化到每个worker。你必须自己做。
通常,您必须将文件放在共享文件系统中,如HDFS,S3(亚马逊)或任何其他可由所有工作人员访问的DFS。只要您这样做,并在spark脚本中指定文件目的地,火花作业就能够按照您的意愿阅读和处理。
但是,说到这一点,将文件复制到所有工作人员和主文件结构中的同一目的地也可以。 Exp,您可以在所有spark节点中创建/opt/spark-job/all-files/
文件夹,将rsync
文件创建到所有文件夹中,然后您可以在spark脚本中使用file。但请不要这样做。 DFS或S3比这种方法更好。
答案 2 :(得分:0)
当前,由于Dataproc不再处于beta中,为了从PySpark代码直接访问云存储中的文件,请使用--files
参数提交作业即可完成工作。不需要SparkFiles
。例如:
gcloud dataproc jobs submit pyspark \
--cluster *cluster name* --region *region name* \
--files gs://<BUCKET NAME>/<FILE NAME> gs://<BUCKET NAME>/filename.py
通过Spark API从gcs读取输入时,它可与gcs连接器一起使用。