从外部文件加载配置的最佳 PySpark 实践是什么

2024-04-04

我想初始化配置一次,然后在我的 PySpark 项目的许多模块中使用它。

我看到有两种方法可以做到这一点。

  1. 将其加载到入口点并作为参数传递给每个函数

main.py:

with open(sys.argv[1]) as f:
    config = json.load(f)
df = load_df(config)
df = parse(df, config)
df = validate(df, config, strict=True)
dump(df, config)

但向每个函数传递一个外部参数似乎不太美观。

  1. 在config.py中加载配置并在每个模块中导入该对象

配置文件

import sys
import json
with open(sys.argv[1]) as f:
    config = json.load(f)

main.py

from config import config
df = load_df()
df = parse(df)
df = validate(df, strict=True)
dump(df)

并在每个模块中添加行

from config import config

这看起来更漂亮,因为严格来说,配置并不是函数的参数。这是它们执行的一般上下文。

不幸的是,PySpark pickle config.py 并尝试在服务器上执行它,但没有将 sys.argv 传递给它们! 所以,我在运行时看到错误

  File "/PycharmProjects/spark_test/config.py", line 6, in <module>
    CONFIG_PATH = sys.argv[1]
IndexError: list index out of range

在 PySpark 中使用从文件加载的常规配置的最佳实践是什么?


您的程序在 master 上开始执行,并通过调用执行器上的一些函数将其主要工作传递给执行器。执行器是通常在不同物理机器上运行的不同进程。

因此,master 想要在执行器上引用的任何内容都需要是标准库函数(执行器可以访问)或可以发送的可挑选对象。

您通常不想在执行器上加载和解析任何外部资源,因为您总是必须将它们复制过来并确保正确加载它们...将可挑选的对象作为函数的参数传递(例如,对于UDF) 的效果要好得多,因为代码中只有一处需要加载它。

我建议创建一个config.py文件并将其作为参数添加到您的spark-submit命令:

spark-submit --py-files /path/to/config.py main_program.py

然后你可以像这样创建 Spark 上下文:

spark_context = SparkContext(pyFiles=['/path/to/config.py'])

并简单地使用import config无论您需要什么地方。

您甚至可以将整个 python 包包含在打包为单个 zip 文件(而不是单个)的树中config.py文件,但一定要包括__init__.py在每个需要作为 python 模块引用的文件夹中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从外部文件加载配置的最佳 PySpark 实践是什么 的相关文章

随机推荐