使用 pyspark 提交作业时,如何访问使用 --files 参数上传的静态文件?
While submit job with pyspark, how to access static files upload with --files argument?
例如,我有一个文件夹:
/
- 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'
如何访问我上传的文件?
是的,Shagun 是对的。
基本上,当您向 spark 提交 spark 作业时,它不会将您要处理的文件序列化到每个 worker。你将不得不自己做。
通常,您必须将文件放在共享文件系统中,例如 HDFS、S3(亚马逊)或所有工作人员都可以访问的任何其他 DFS。只要您这样做,并在您的 spark 脚本中指定文件目标,spark 作业就可以按照您的意愿进行读取和处理。
然而,话虽如此,将文件复制到所有 worker 和 master 的文件结构中的同一目的地也可以。 Exp,您可以在所有 spark 节点中创建 /opt/spark-job/all-files/
之类的文件夹,将文件 rsync
到所有节点,然后您可以在您的 spark 脚本中使用文件。但请不要这样做。 DFS 或 S3 比这种方法好得多。
可以通过 SparkFiles
访问使用 SparkContext.addFile
(和 --files
)分发的文件。它提供了两种方法:
getRootDirectory()
- returns 分发文件的根目录
get(filename)
- returns 文件的绝对路径
我不确定 Dataproc 是否有任何特定限制,但像这样的东西应该可以正常工作:
from pyspark import SparkFiles
with open(SparkFiles.get('test.yml')) as test_file:
logging.info(test_file.read())
目前,由于 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 连接器一起工作。
例如,我有一个文件夹:
/
- 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'
如何访问我上传的文件?
是的,Shagun 是对的。
基本上,当您向 spark 提交 spark 作业时,它不会将您要处理的文件序列化到每个 worker。你将不得不自己做。
通常,您必须将文件放在共享文件系统中,例如 HDFS、S3(亚马逊)或所有工作人员都可以访问的任何其他 DFS。只要您这样做,并在您的 spark 脚本中指定文件目标,spark 作业就可以按照您的意愿进行读取和处理。
然而,话虽如此,将文件复制到所有 worker 和 master 的文件结构中的同一目的地也可以。 Exp,您可以在所有 spark 节点中创建 /opt/spark-job/all-files/
之类的文件夹,将文件 rsync
到所有节点,然后您可以在您的 spark 脚本中使用文件。但请不要这样做。 DFS 或 S3 比这种方法好得多。
可以通过 SparkFiles
访问使用 SparkContext.addFile
(和 --files
)分发的文件。它提供了两种方法:
getRootDirectory()
- returns 分发文件的根目录get(filename)
- returns 文件的绝对路径
我不确定 Dataproc 是否有任何特定限制,但像这样的东西应该可以正常工作:
from pyspark import SparkFiles
with open(SparkFiles.get('test.yml')) as test_file:
logging.info(test_file.read())
目前,由于 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 连接器一起工作。