4 回答
TA贡献1719条经验 获得超6个赞
具有任意数量的从属笔记本(用作模板)的单个主 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 则会面临很少维护者的风险。
TA贡献1874条经验 获得超12个赞
正如您所建议的,可以通过 Papermill 在 Airflow 管道中使用 Jupyter Notebooks。然而,Airflow 的优点之一是您可以将管道分成彼此独立的离散步骤,因此如果您决定在一个 Jupyter Notebook 中编写整个管道,那么这就违背了使用 Airflow 的目的。
因此,假设每个独立的ETL 步骤都位于单独的 Jupyter Notebook 中,您可以尝试以下操作:
为每个步骤创建一个 Jupyter Notebook。例如,,,
copy_data_from_s3
(cleanup_data
3load_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 )。要匹配上面的函数:BashOperator
copy_data = PythonOperator(dag=dag,
task_id='copy_data_task',
provide_context=True,
python_callable=copy_data_from_s3)
TA贡献1993条经验 获得超5个赞
Airflow 有一个造纸厂操作员,但开发经验不是很好。Airflow 中基于 Python 的 DAG 的主要问题之一是它们在同一 Python 环境中执行,一旦拥有多个 DAG,就会导致依赖问题。
如果您愿意尝试新工具,它可以编排基于笔记本的管道(它在幕后使用 papermill)。您可以在本地开发并导出到 Kubernetes 或 Airflow。
TA贡献1817条经验 获得超6个赞
为什么你想要 ETL 作业作为 jupyter 笔记本。您看到什么优势?笔记本通常用于使用实时数据构建漂亮的文档。ETL 作业应该是在后台运行且自动化的脚本。
为什么这些工作不能是普通的 python 代码而不是笔记本?
此外,当您使用 PapermillOperator 运行笔记本时,运行的输出将是保存在某处的另一个笔记本。不断检查这些输出文件并不是那么友好。
我建议用纯 Python 编写 ETL 作业并使用 PythonOperator 运行它。这更加简单并且更容易维护。
如果您想使用笔记本电脑的精美功能,那就是另一回事了。
添加回答
举报