要理解什么是 DAG,我们首先来定义一些关键概念。在计算机科学中,图是一种由节点和边组成的非线性数据结构。节点表示单个实体或对象,而边连接这些节点并表示它们之间的关系或连接。
在有向图中,这些边具有特定的方向,表示节点之间的单向关系。这意味着,如果有一条边从节点 A 到节点 B,则它意味着从 A 到 B 的连接,但不一定是从 B 到 A 的连接。
图像顶部显示有向图,其中三个节点相互连接。底部显示无向图,其中最后两个节点具有双向关系。
有向图的视觉解释。图片来源:天文学家
路径是由有向边连接的一系列节点。它从特定节点开始,然后沿着边的方向到达另一个节点。路径可以是任意长度,从单个节点到多个节点的序列,只要始终遵循边的方向即可。
现在我们有了一些基本的定义,让我们看看什么是 DAG:DAG 是一个没有有向环的有向图,其中每个节点代表一个特定的任务,每条边表示它们之间的依赖关系。
左图为无环图,其中四个任务相互连接,没有循环。右图为非无环图,其中任务 1 和任务 4 之间存在形成循环的关系无环图的视觉解释。图片来源:天文学家
DAG 的关键之处在于它们是非循环的,这意味着一旦您从一个节点开始,就只能向前移动,永远不会返回到上一个节点。这确保任务可以按顺序执行而不会导致无限循环。DAG 通常具有层次结构,其中任务被组织成级别或层。较高级别的任务通常依赖于较低级别的任务的完成。
成为一名数据工程师
培养 Python 技能,成为一名专业的数据工程师。
为什么 DAG 在数据工程中如此重要
作为数据工程师或执行数据工程任务的人员,您经常面临构建复杂数据管道的挑战,这些管道需要执行步骤,每个步骤都依赖于前一个步骤。这就是 DAG 的作用所在!
由于 DAG 可以将任务表示为节点,将依赖项表示为边,因此它们可以强制执行逻辑执行顺序,确保任务根据其依赖项按顺序执行。这可以防止任务无序运行导致的错误和不一致。此外,如果某个步骤失败,DAG 可以识别并重新运行受影响的任务,从而节省时间和精力。
如果您是数据管道构建的新手或想要加强基础知识,那么“理解数据工程”课程将为您提供一个很好的起点。
DAG 的非循环特性是使其成为数据管道的理想选择的关键特性之一。它们确保任务可以在没有无限循环或递归依赖的情况下执行,从而避免导致系统不稳定。
让我们考虑一个数据管道的简单示例:
该图显示了 A DAG,其中节点 a 连接到 B 和 C,然后连接到 D,最后连接到 E这个简单的 DAG 结构包含节点 A、B、C、D 和 E 及其依赖项。图片由作者提供。
在上面的 DAG 中,节点 A 表示数据整理步骤,涉及数据清理步骤,其中对提取的数据进行清理和预处理。节点 B 和 C 表示特征工程步骤,其中将清理后的数据独立转换为两个特征。节点 D 涉及合并特征。最后,节点 E 表示模型训练步骤,其中在转换后的数据上训练机器学习模型。
DAG 并不关心任务内部发生什么,而是关心任务的执行顺序。
此外,DAG 还使您能够创建自动化、可扩展的数据工作流,尤其是在分布式系统和云环境中。它们将复杂的数据处理任务分解为更小、独立、可管理的子任务,从而使 DAG 能够并行执行并高效利用资源。这种可扩展性在处理大型数据集和复杂的数据管道时尤为重要,因为它可以实现经济高效的数据处理。
最后,DAG 可以提供任何数据管道的可视化表示,帮助您理解和传达工作流程。与其他团队成员或非技术利益相关者合作时,这种视觉清晰度非常重要。如果您能理解数据流和任务之间的依赖关系,那么识别和修复问题、优化资源利用率以及就管道改进做出明智的决策就会变得更加容易。
Python 中的 ETL 和 ELT课程是创建和优化数据管道实践的绝佳资源。
DAG 在数据工程中的常见用途
DAG 已被广泛采用,并在数据工程中具有不同的应用。我们在上一节中讨论了其中一些。现在,让我们更详细地探讨其中的一些。
ETL 管道
DAG 最常见的应用之 vk数据库 是协调提取、转换和加载 (ETL)过程。ETL 管道涉及从各种来源提取数据、将其转换为合适的格式,然后将其加载到目标系统中。
例如,Apache Airflow 和 Luigi 等工具使用 DAG 来高效编排 ETL 管道。实际用例可能涉及集成来自 CRM 系统的数据、对其进行转换以满足您的业务需求,并将其加载到Snowflake 数据仓库中进行分析。
您还可以利用 DAG 来监控和记录 ETL 流程中的任务运行时间。这有助于识别瓶颈或需要优化的任务。
复杂的工作流程编排
DAG 还非常适合管理涉及多个任务和依赖项的复杂数据工作流。例如,机器学习工作流可能包括特征工程、模型训练和模型部署等任务。
例如,Apache Airflow中的 DAG可能仅在处理特征后才执行特征选择脚本并触发模型训练,从而确保依赖性和可重复性。
数据处理管道
DAG 广泛用于数据处理管道,用于管理来自多个来源的数据流并将其转化为有价值的见解。例如,Apache Spark中的 DAG可以处理来自网站的点击流数据,执行聚合以计算会话时长,并将见解输入到仪表板中。
Spark 中的 DAG 不是由用户明确定义的,而是由框架内部创建的,以优化转换的执行。
机器学习管道
在机器学习中,DAG 有助于实现工作流程的迭代和模块化特性。它们允许您尝试不同的预处理步骤、算法和超参数,同时保持管道井然有序。
Kubeflow Pipelines 和MLflow等工具使用 DAG 来管理机器学习工作流程,从而实现无缝实验和部署。例如,您可以使用 DAG 启用由数据漂移检测触发的重新训练管道,确保您的模型始终保持准确性和相关性。
数据工程中管理 DAG 的流行工具
您有各种工具可帮助您有效地管理和编排 DAG。让我们探索一些最受欢迎的选项:
Apache Airflow
Apache Airflow是一个广泛使用的平台,用于创建、调度和监控工作流。它擅长将复杂的数据管道定义为 DAG。Airflow 提供了一个用户友好的界面来可视化和管理这些 DAG,从而可以轻松理解和排除数据工作流故障。它的灵活性和可扩展性使其成为许多数据工程团队的首选。
长官
Prefect是一款现代编排工具,可简化数据工作流的创建和管理。它提供基于 Python 的 API 来定义 DAG,从而轻松与现有 Python 代码集成。Prefect 优先考虑可靠性和可观察性,提供自动重试、回填和强大监控等功能。
达斯克
Dask是一个用于管理分布式数据工作流的 Python 并行计算库。它可以跨多个核心或机器并行计算,非常适合大规模数据处理任务。Dask 使用基于 DAG 的执行模型来调度和协调任务,确保高效的资源利用率。
Kubeflow 管道
Kubeflow Pipelines是一个用于构建和部署可扩展机器学习工作流的开源平台。它使用 DAG 来定义端到端工作流,从数据预处理到模型部署。它与 Kubernetes 紧密集成,使其成为在云环境中运行工作流的不二之选。