簡體   English   中英

在 AWS EMR 上的 zip 文件中提交 pyspark 應用程序

[英]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 工作的人,我正在分享我的發現以及我在嘗試不同方法后采取的路線。 關鍵點如下表所示。

  1. 通過 EMR 引導腳本管理 Python 依賴項。 您所依賴的所有python 包都需要安裝在執行器上(例如pandas、sklearn 等)。 可以在啟動集群時通過此引導腳本完成。

  2. 假設您有一個 Python 的 gradle 項目(可能還有其他語言,如 Java),如果處理好用例 #1,pygradle 似乎並沒有增加太多價值。

  3. 內置的 gradle zip 任務可能不適用於使用 Python 模塊創建 zip 文件。 我使用 Python 添加了一個 zip 創建模塊,並通過命令行執行在 gradle 任務中調用它。 因此,gradle 任務使用適當的參數調用 python 腳本來生成 zip 文件。 確保您的包存在於 zip 的根目錄中。 然后按照我在上述問題中分享的鏈接提交您的 pyspark 作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM