在使用pyspark提交作业时,如何使用--files参数访问静态文件上传?
例如,我有一个文件夹:在使用pyspark提交作业时,如何使用--files参数访问静态文件上传?
/
- test.py
- test.yml
,且作业submited引发集群:在test.py
gcloud beta dataproc jobs submit pyspark --files=test.yml "test.py"
,我要访问我上传的静态文件。
with open('test.yml') as test_file:
logging.info(test_file.read())
却得到了以下异常:
IOError: [Errno 2] No such file or directory: 'test.yml'
如何访问我上传的文件?
使用SparkContext.addFile
(和--files
)分发的文件可以通过SparkFiles
访问。它提供了两种方法:
-
getDirectory()
- 返回根目录分布式文件 -
get(filename)
- 返回文件
绝对路径我不知道是否有任何Dataproc具体的限制,但喜欢的事这应该工作得很好:
from pyspark import SparkFiles
with open(SparkFiles.get('test.yml')) as test_file:
logging.info(test_file.read())
它的作品,谢谢!注意:SparkFiles.get返回文件路径,而不是文件obj! – lucemia
没错,Shagun是正确的。
基本上当你提交的火花工作火花,它不序列您要处理到每个工人的文件。你必须自己做。
通常情况下,你将不得不将文件放在HDFS一样,S3(亚马逊),或任何其他DFS可以由全体职工进行访问的共享文件系统。只要你这样做,并在你的火星脚本中指定文件的目的地,火花工作将能够阅读和处理,如你所愿。
不过,话虽如此,将文件复制到同一目的地的各位工作人员和主人的文件结构也行。精通,你可以创建一个像/opt/spark-job/all-files/
在所有Spark节点,rsync
文件到所有这些文件夹,然后你就可以在你的火花脚本中使用文件。但请不要这样做。 DFS或S3比这种方法更好。
谢谢,所以当我可以使用'--files'参数? – lucemia
application-jar:包含应用程序和所有依赖项的捆绑jar的路径。 URL必须在集群内全局可见,例如,所有节点上都存在hdfs://路径或file://路径。 从http://spark.apache.org/docs/latest/submitting-applications.html –
第一件事就是将文件添加到分布式文件系统(如HDFS)whic h群集可以访问。我相信其他人会提供更好的解决方案。 –