在使用pyspark提交作业时,如何使用--files参数访问静态文件上传?

时间:2016-01-22 05:19:57

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

例如,我有一个文件夹:

/
  - 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'

如何访问我上传的文件?

3 个答案:

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

是的,Shagun是对的。

基本上,当您向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连接器一起使用。