例如,我有一个文件夹:
/
- test.py
- test.yml
该作业被划分为以下列方式激发集群:
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'
如何访问我上传的文件?
发布于 2016-01-21 23:40:29
使用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())
发布于 2018-12-29 10:55:14
目前,由于Dataproc不再处于测试版,为了从代码直接访问云存储中的文件,提交带有--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读取来自gcs的输入时,它与gcs连接器一起工作。
发布于 2016-01-21 22:14:35
是的,沙贡是对的。
基本上,当您提交一个火花作业来火花,它不会序列化您想要处理的文件到每个工人。你得自己去做。
通常,您必须将文件放在共享文件系统中,如HDFS、S3 (亚马逊)或所有工作人员都可以访问的任何其他DFS。一旦您这样做,并指定文件目的地在您的火花脚本,火花作业将能够读取和处理您想要的。
但是,尽管如此,将文件复制到所有工作人员和主文件结构中的同一个目的地也是有效的。例如,您可以在所有星火节点中创建像/opt/spark-job/all-files/
这样的文件夹,并将该文件保存到所有这些节点上,然后您可以在您的星火脚本中使用文件。但请不要这样做。DFS或S3比这种方法要好得多。
https://stackoverflow.com/questions/34939520
复制