![](/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.