Jupyter Notebooks 和 Papermill 辅助的 Airflow 中的 ETL

所以我的问题是,我在 Airflow 中构建 ETL 管道,但首先在 Jupyter 笔记本中真正开发和测试提取、转换和加载功能。因此,我最终总是在 Airflow Python 操作员代码和 Jupyter 笔记本之间来回复制粘贴,效率非常低!我的直觉告诉我,所有这一切都可以自动化。

基本上,我想在 Jupyter 中编写我的提取、转换和加载函数,并让它们保留在那里,同时仍在 Airflow 中运行管道并显示提取、转换和加载任务,并进行重试和 Airflow 提供的所有好东西提供开箱即用的功能。

Papermill 能够对笔记本进行参数化,但我真的想不出这对我的情况有什么帮助。有人可以帮我把这些点联系起来吗?🙏🏻


互换的青春
浏览 145回答 4
4回答

慕侠2389804

具有任意数量的从属笔记本(用作模板)的单个主 Jupyter 笔记本,使用 顺序执行papermill.execute_notebook,应该足以自动化任何 ML 管道。要在管道阶段之间传递信息(从一个从属笔记本到下一个),可以使用另一个 Netflix 包 ,它scrapbook允许我们在从属笔记本中记录 python 对象(因为它们是由 处理的papermill),然后检索这些对象来自管道主机中的从属设备(保存使用scrapbook.glue并读取 - scrapbook.read_notebook)。从任何已完成的阶段恢复也是可能的,但它需要将前一阶段保存的必要输入存储在可从主节点访问的可预测位置(例如,在本地主 JSON 文件或 MLflow 中)。备择方案由于管理成本(5 个容器,包括 2 个数据库),Airflow 对于大多数 ML 团队来说可能是一种杀伤力,而其他(非 Netflix)Python 包要么需要更多样板文件(Luigi),要么需要额外的权限和执行器的自定义 docker 镜像( Elyra),而 Ploomber 则会面临很少维护者的风险。

HUWWW

正如您所建议的,可以通过 Papermill 在 Airflow 管道中使用 Jupyter Notebooks。然而,Airflow 的优点之一是您可以将管道分成彼此独立的离散步骤,因此如果您决定在一个 Jupyter Notebook 中编写整个管道,那么这就违背了使用 Airflow 的目的。因此,假设每个独立的ETL 步骤都位于单独的 Jupyter Notebook 中,您可以尝试以下操作:为每个步骤创建一个 Jupyter Notebook。例如,,,copy_data_from_s3(cleanup_data3load_into_database个步骤,每个步骤一个笔记本)。确保每个笔记本均按照 Papermill说明进行参数化。这意味着,向每个单元添加一个标签来声明可以从外部参数化的变量。确保 Airflow 可以找到这些笔记本(例如,与 DAG 所在的文件夹位于同一文件夹中)编写将使用 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        )最后,设置该步骤,也许作为 a (尽管如果您想从命令行运行 PapermillPythonOperator也可以使用 a )。要匹配上面的函数:BashOperatorcopy_data = PythonOperator(dag=dag,                           task_id='copy_data_task',                           provide_context=True,                           python_callable=copy_data_from_s3)

ibeautiful

Airflow 有一个造纸厂操作员,但开发经验不是很好。Airflow 中基于 Python 的 DAG 的主要问题之一是它们在同一 Python 环境中执行,一旦拥有多个 DAG,就会导致依赖问题。如果您愿意尝试新工具,它可以编排基于笔记本的管道(它在幕后使用 papermill)。您可以在本地开发并导出到 Kubernetes 或 Airflow。

慕的地6264312

为什么你想要 ETL 作业作为 jupyter 笔记本。您看到什么优势?笔记本通常用于使用实时数据构建漂亮的文档。ETL 作业应该是在后台运行且自动化的脚本。为什么这些工作不能是普通的 python 代码而不是笔记本?此外,当您使用 PapermillOperator 运行笔记本时,运行的输出将是保存在某处的另一个笔记本。不断检查这些输出文件并不是那么友好。我建议用纯 Python 编写 ETL 作业并使用 PythonOperator 运行它。这更加简单并且更容易维护。如果您想使用笔记本电脑的精美功能,那就是另一回事了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python