我在RDD上有一个mapPartitions
,在每个分区内,必须打开一个资源文件。该模块包含mapPartitions
调用的方法和资源文件,使用--py-files
参数作为zip文件传递给每个执行程序。
为清楚起见:
rdd = rdd.mapPartitions(work_doing_method)
def work_doing_method(rows):
for row in rows:
resource_file_path = os.path.join(os.path.dirname(__file__), "resource.json")
with open(resource_file_path) as f:
resource = json.loads(f.read())
...
当我使用--py-file
参数将包含所有内容的zip文件传递到spark-submit命令后执行此操作时,
我得到IOError: [Errno 20] Not a directory:/full/path/to/the/file/within/zip/file
我不明白Spark如何使用zip文件读取依赖关系。 os.path.dirname
实用程序返回包括zip文件的完整路径,例如。 /spark/dir/my_dependency_file.zip/path/to/the/resource/file
。我相信这应该是问题所在。我尝试了多种组合来解析文件的路径。任何帮助表示赞赏。
谢谢!
答案 0 :(得分:1)
我认为,当您将文件添加到Spark作业时,它将被复制到每个执行器的工作目录中。我已经使用SparkFiles API来获取执行程序上文件的绝对路径。
您还可以使用--archives
标志传入任意数据存档,例如zipfile。 What's the difference between --archives, --files, py-files in pyspark job arguments
答案 1 :(得分:0)
当我们寻找绝对路径时,我们会在egg / zip文件(执行程序工作目录内)中获得资源文件的路径。我最终在Python中使用了zipfile模块,并像here一样打开了它。