簡體   English   中英

ETL in Airflow 由 Jupyter Notebooks 和 Papermill 協助

[英]ETL in Airflow aided by Jupyter Notebooks and Papermill

所以我的問題是我在 Airflow 中構建了 ETL 管道,但實際上首先在 Jupyter 筆記本中開發和測試提取、轉換和加載功能。 所以我最終一直在我的 Airflow Python 操作員代碼和 Jupyter 筆記本之間來回復制粘貼,效率很低。 我的直覺告訴我,所有這些都可以自動化。

基本上,我想在 Jupyter 中編寫我的提取、轉換和加載函數並讓它們留在那里,同時仍在 Airflow 中運行管道並顯示提取、轉換和加載任務,並重試和 Airflow 的所有好東西開箱即用。

Papermill 能夠參數化筆記本,但我真的想不出這對我的情況有何幫助。 有人可以幫我把這些點聯系起來嗎?

[免責聲明:我是上述開源項目的提交者之一。 ] 我們創建了Elyra——一組 JupyterLab 擴展——來簡化這種工作。 我們剛剛發布了 2.1 版,它提供了一個可視化編輯器,您可以使用它從筆記本和 Python 腳本(R 支持應該很快可用)組裝管道,並在 Apache Airflow、Kubeflow Pipelines 或本地 JupyterLab 中運行它們。 對於 Airflow(在 Kubernetes 上運行),我們創建了一個自定義操作符來處理內務管理和執行。 我寫了一篇關於它的摘要文章,你可以在這里找到,如果你有興趣嘗試,我們有幾個介紹性教程

單個主 Jupyter 筆記本,帶有任意數量的從筆記本(用作模板),使用papermill.execute_notebook按順序執行,應該足以自動化任何 ML 管道。

為了在管道階段(從一個從筆記本到下一個)之間傳遞信息,可以使用另一個 Netflix 包scrapbook ,它允許我們在從筆記本中記錄 python 對象(因為它們由papermill處理),然后從管道主機中的從屬設備中檢索這些對象(保存使用scrapbook.glue和閱讀scrapbook.read_notebook )。

從任何已完成的階段恢復也是可能的,但它需要將在前一階段保存的必要輸入存儲在可從 master 到達的可預測位置(例如,在本地 master JSON 文件或 MLflow 中)。

主筆記本也可以使用 cron 作業進行調度,例如來自 Kubernetes )。

  • 備擇方案

由於管理成本(5 個容器,包括 2 個數據庫),Airflow 對大多數 ML 團隊來說可能是一種矯枉過正,而其他(非 Netflix)python 包要么需要更多樣板文件(Luigi),要么需要額外的特權和用於執行程序的自定義 docker 圖像( Elyra),而 Ploomber 將面臨少數維護者的風險。

根據您的建議,可以通過 Papermill 在您的 Airflow 管道中使用 Jupyter Notebooks。 但是,Airflow 的優點之一是您可以將管道分成離散的步驟,這些步驟彼此獨立,因此如果您決定在一個 Jupyter Notebook 中編寫整個管道,那就違背了使用 Airflow 的目的。

因此,假設您的每個獨立ETL 步驟都位於單獨的 Jupyter Notebook 中,您可以嘗試以下操作:

  1. 為每一步創建一個 Jupyter Notebook。 例如, copy_data_from_s3cleanup_dataload_into_database (3 個步驟,每個步驟一個筆記本)。
  2. 確保每個筆記本都按照 Papermill 說明進行參數設置 這意味着,向每個單元格添加一個標簽,聲明可以從外部參數化的變量。
  3. 確保 Airflow 可以找到這些筆記本(例如,在 DAG 所在的文件夾中)
  4. 編寫將使用 Papermill 參數化和運行筆記本的函數,每個步驟一個。 例如:
import papermill as pm
# ...
# define DAG, etc.
# ...

def copy_data_from_s3(**context):
    pm.execute_notebook(
           "copy_data_from_s3_step.ipynb",
           "copy_data_from_s3_step.ipynb"
            parameters=dict(date=context['execution_date'])) # pass some context parameter if you need to
        )
  1. 最后,設置步驟,可能作為PythonOperator (盡管如果您想從命令行運行 Papermill 您也可以使用BashOperator )。 要匹配上面的函數:
copy_data = PythonOperator(dag=dag,
                           task_id='copy_data_task',
                           provide_context=True,
                           python_callable=copy_data_from_s3)

Airflow 有一個造紙廠操作員,但開發經驗不是很好。 Airflow 中基於 Python 的 DAG 的主要問題之一是它們在同一個 Python 環境中執行,一旦您擁有多個 DAG,就會導致依賴性問題。 有關更多詳細信息,請參閱此內容

如果您願意嘗試新工具,我建議您使用Ploomber (免責聲明:我是作者),它可以編排基於筆記本的管道(它在幕后使用紙廠)。 您可以在本地開發並導出到 Kubernetes 或 Airflow。

如果您想知道 Ploomber 中的項目是什么樣的,請隨時查看示例存儲庫

為什么要將 ETL 作業作為 jupyter notebook。 你看到什么優勢? Notebooks 通常用於構建帶有實時數據的精美文檔。 ETL 作業應該是在后台運行並自動化的腳本。

為什么這些工作不能是純 python 代碼而不是筆記本?

此外,當您使用 PapermillOperator 運行筆記本時,運行的輸出將是另一個保存在某處的筆記本。 繼續檢查這些輸出文件並不是那么友好。

我建議用普通的 Python 編寫 ETL 作業並使用 PythonOperator 運行它。 這更簡單,更容易維護。

如果您想使用筆記本電腦的奇特功能,那是另一回事。

Ploomber 將能夠解決您的問題! 它實際上支持參數化筆記本和通過 Airflow\/shell 腳本\/Slurm\/Kubeflow\/Argo 進行部署。 這也有助於您定義模塊化管道而不是單體筆記本。 這很容易\/直接開始,它比造紙廠提供了更多的靈活性。 看看這個! https:\/\/github.com\/ploomber\/ploomber<\/a>

"

暫無
暫無

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

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