13

例如,我有一个文件夹:

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

如何访问我上传的文件?

4

3 回答 3

18

SparkContext.addFile使用(and )分发的文件--files可以通过SparkFiles. 它提供了两种方法:

  • getRootDirectory()- 返回分布式文件的根目录
  • get(filename)- 返回文件的绝对路径

我不确定是否有任何 Dataproc 特定的限制,但这样的东西应该可以正常工作:

from pyspark import SparkFiles

with open(SparkFiles.get('test.yml')) as test_file:
    logging.info(test_file.read())
于 2016-01-22T07:40:29.933 回答
2

目前,由于 Dataproc 不再处于测试阶段,为了从 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 连接器一起使用。

于 2018-12-29T18:55:14.097 回答
0

是的,Shagun 是对的。

基本上,当您向 spark 提交 spark 作业时,它不会将您要处理的文件序列化给每个工作人员。你必须自己做。

通常,您必须将文件放在共享文件系统中,如 HDFS、S3(亚马逊)或所有工作人员都可以访问的任何其他 DFS。一旦您这样做,并在您的 spark 脚本中指定文件目标,spark 作业将能够按照您的意愿读取和处理。

但是,话虽如此,将文件复制到所有工作人员和主文件结构中的同一目标也可以。Exp,您可以/opt/spark-job/all-files/在所有 spark 节点中创建文件夹,rsync将文件添加到所有节点,然后您可以在 spark 脚本中使用文件。但请不要这样做。DFS 或 S3 比这种方法要好得多。

于 2016-01-22T06:14:35.320 回答