![](/img/trans.png)
[英]Submitting pyspark supporting sql files inside zip file on AWS EMR
[英]Submitting pyspark app inside zip file on AWS EMR
我们有一个 pyspark-jobs 存储库,其中包含构建过程将其推送到 S3 中的 zip 工件。 假设其中一项工作是find-homes.zip
,其内容如下所示:
find-homes.zip
+-find_homes
+- __init__.py
+- run.py
+-helpers
+- __init__.py
+- helper_mod.py
我需要在 zip 中作为 main 执行run.py
(它依赖于帮助程序)。 我在客户端模式下运行作业,我尝试的命令是spark-submit --py-files find-homes.zip find_homes.run.py
。 find_homes.run.py
文件是一个瘦包装器,包含以下代码:
import os
import importlib
def main():
filename = os.path.basename(__file__)
module = os.path.splitext(filename)[0]
module = importlib.import_module(module)
module.main()
if __name__ == '__main__':
main()
我基本上遵循这个SO 线程的建议,但没有任何效果。 启动作业后显示的错误是:
Traceback (most recent call last):
File "/home/hadoop/find_homes.run.py", line 13, in <module>
main()
File "/home/hadoop/find_homes.run.py", line 8, in main
module = importlib.import_module(module)
File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'find_homes'
我有点失去耐心来找出我在这里缺少的东西。 没有任何建议(包括使用 zip 位置更新 PYTHONPATH)有效,因此非常感谢任何帮助,甚至是朝着正确方向的推动。 我正在对Spark 2.4
使用EMR v5.23.0
更新
嗯,奇怪的事情发生了。 我正在使用以下 gradle 任务来生成 zip:
task build(type: Zip) {
from ('src/')
into "."
archiveName = "${project.name}.zip"
includeEmptyDirs = false
destinationDir new File(projectDir, 'build/distributions')
}
我不知道它是怎么发生的,但我只是解压缩了我的工件,然后使用zip -r find_homes.zip <packages>
再次压缩它,然后将生成的 zip 与 spark-submit 一起使用,它工作了。 不知道为什么,因为两种情况下的文件夹结构完全相同。
对于那些使用 EMR 进行 spark 工作的人,我正在分享我的发现以及我在尝试不同方法后采取的路线。 关键点如下表所示。
通过 EMR 引导脚本管理 Python 依赖项。 您所依赖的所有python 包都需要安装在执行器上(例如pandas、sklearn 等)。 可以在启动集群时通过此引导脚本完成。
假设您有一个 Python 的 gradle 项目(可能还有其他语言,如 Java),如果处理好用例 #1,pygradle 似乎并没有增加太多价值。
内置的 gradle zip 任务可能不适用于使用 Python 模块创建 zip 文件。 我使用 Python 添加了一个 zip 创建模块,并通过命令行执行在 gradle 任务中调用它。 因此,gradle 任务使用适当的参数调用 python 脚本来生成 zip 文件。 确保您的包存在于 zip 的根目录中。 然后按照我在上述问题中分享的链接提交您的 pyspark 作业。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.