在使用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' 

如何访问我上传的文件?

+1

第一件事就是将文件添加到分布式文件系统(如HDFS)whic h群集可以访问。我相信其他人会提供更好的解决方案。 –

使用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()) 
+0

它的作品,谢谢!注意:SparkFiles.get返回文件路径,而不是文件obj! – lucemia

没错,Shagun是正确的。

基本上当你提交的火花工作火花,它不序列您要处理到每个工人的文件。你必须自己做。

通常情况下,你将不得不将文件放在HDFS一样,S3(亚马逊),或任何其他DFS可以由全体职工进行访问的共享文件系统。只要你这样做,并在你的火星脚本中指定文件的目的地,火花工作将能够阅读和处理,如你所愿。

不过,话虽如此,将文件复制到同一目的地的各位工作人员和主人的文件结构也行。精通,你可以创建一个像/opt/spark-job/all-files/在所有Spark节点,rsync文件到所有这些文件夹,然后你就可以在你的火花脚本中使用文件。但请不要这样做。 DFS或S3比这种方法更好。

+0

谢谢,所以当我可以使用'--files'参数? – lucemia

+1

application-jar:包含应用程序和所有依赖项的捆绑jar的路径。 URL必须在集群内全局可见,例如,所有节点上都存在hdfs://路径或file://路径。 从http://spark.apache.org/docs/latest/submitting-applications.html –