如何创建第一个数据工程项目? 增量项目路线图

大数据
后台-插件-广告管理-内容页头部广告(手机)

以这种增量方法构建数据工程项目以保证成功

 

2022 年 4 月 16 日,我写了一份关于初学者如何学习数据工程的详细路线图。 该路线图非常受欢迎。 然而,它有很大的差距。

人们在学习如此多不同的技术时常常无法保持一致。 他们无法将其拼凑在一起。 该路线图应该解决注意力持续时间缩短的挑战。 我们将尝试探索增量项目路线图如何解决这一差距。

数据工程路线图列出了许多需要涵盖的主题,这些主题仍然具有相关性。 它还有一个很棒的跟踪器来规划主题和跟踪进度。 但它缺乏一些关于首先学习什么以及作为现实项目实施什么的结构元素。

此外,该计划对于初学者来说很棒,但是对于在该领域有一定经验并愿意亲自实施的人呢?

在从 ETL 开发人员转型为数据工程师时,我面临着类似的挑战。 现在到了 2023 年,当我回顾过去时,我觉得如果采用不同的方法,我会做得更好。

长篇提醒:这将是一篇相当长的文章,但请放心,它将在学习时节省大量时间。 所以坐下来,喝杯咖啡,然后继续阅读……

从项目开始

那么,在现实世界中,你会花几个月的时间来学习解决问题所需的一切吗? 您几乎总是会收到一组任务或问题陈述。 然后你将分析同样需要什么。 正确的?

Go Figure,可能是实际项目中真正的口头禅。 但我们都有学习问题。

我们陷入了教程地狱循环。

即使完成课程后,您是否经常感到不自信? 当您遵循教程时,您感觉很棒,但是当您收到一组任务时,您就会拖延,为什么? 因为你进入了绝望之谷并迷失在教程地狱中。

让我介绍一下增量项目法,以及它如何解决动机减弱的问题。

增量项目法

增量项目方法扭转了一旦你学会了所有东西就做一个项目的想法。 相反,我们从一个项目开始,将项目分解为更小的可管理任务,并学习解决该特定任务和实现目标所需的概念和技术。

那么,为什么叫增量呢?

一旦基本目标实现,您就会引入新的复杂性和功能。 您可以将其与首先实际构建 MVP 联系起来以验证该想法。 一旦想法得到验证,您就可以添加功能和规模。

那么,这种模式有什么好处呢?

您复制实际的工作环境

您从一开始就学习解决问题

完成项目的即时满足感会有所帮助。

不断增加的复杂性确保您面临新的挑战。

帮助您克服学习瓶颈,迈向精通。

好的,那很好,但是你能用一个真实的例子来解释一下吗?

当然,让我们尝试创建一个非常基本的数据工程项目,然后让我们回顾一下如何添加新的复杂性。 但首先,让我彻底打破一个神话:

Twitter 或 Uber 数据分析不是真正的数据工程项目。

不要误会我的意思,这些是开始学习数据工程项目端到端管道的好主题。

达希尔·帕尔玛

有一些关于相同主题的优秀初学者数据工程项目。 但差不多就是这样了。

这可能是增量项目计划中伟大的第一步,但不能在简历中作为实际的生产级个人项目进行宣传。

如果你是一个有几年经验的人,这一点就会变得更加明显。 任何面试官都会告诉你你没有实际的项目经验。 你仍然可以通过很多面试,但如果你增加一点复杂性,你可以将你的个人项目提升到一个新的水平。

以下是一些可以添加到您的简历中的实际数据项目:

1. 将本地数据迁移到云端2。 构建情感分析解决方案3。 实施主数据管理4。 设计自动化数据摄取框架5。 为分析设计新的数据仓库系统6。 使用流数据实施实时数据分析7。 为 ML/AI 用例和特征工程创建数据集

它们听起来可怕吗?

让我们分解一下这个过程以方便理解。 您可以找到更多此类用例。 重要的是从一个用例开始,然后将其与您的兴趣结合起来。

那么,让我们开始吧。

 

定义业务问题

对于初学者来说,了解技术细节就足够了,但对于资深人士来说,领域知识几乎同样重要。 尝试在您熟悉的业务领域定义一个项目。 创建示例业务场景来定义您的项目。

让我们尝试用银行/贷款业务来定义一个(因为我的经验在于贷款领域)。

“Great Lending Company 是一家致力于为无银行账户人群提供服务的贷款公司。 因此,他们向无法进入普通银行的人们提供信贷。

这些人可能没有很高的信用评分,但他们也需要资金。 由于他们无法在其他地方获得贷款,因此可以收取更高的保费。

但是,贷款的风险会更高,而且由于他们的信用评分不太好,您需要依靠更多的数据来最大程度地降低风险。 然而,你不可能拥有拥有大量员工的实体企业,因为风险如此之高。

因此 Great Lending Company 希望实现以下业务流程:

客户风险建模。

自动化贷款发放流程

减少对手动工作的依赖

通过适当的贷款服务最大限度地减少信用损失。

预测任何违约者并跟踪他们的 EMI 付款情况。

定义数据要求

现在让我们了解支持业务问题的数据需求。 为了实现自动化处理,他们需要收集大量数据。

客户个人信息(结构化)

客户信用详细信息(半结构化)

客户的就业信息(结构化)

通过 GIS 数据定位(半结构化)

文档数据(非结构化)

作为大贷公司的数据工程师,我们应该能够实现以下目标:

摄取所有上述类型的数据

摄取过程应该自动化

它应该具有可扩展性和鲁棒性,以最大限度地减少数据丢失

我们需要清理和转换数据以满足业务需求。

数据应可用于在商定的 SLA 范围内进行报告。

增量项目设计:

现在我们已经将问题陈述分解为数据需求,让我们进一步分解它们并创建增量项目计划。 我们将使用敏捷原则来确保通过增量迭代交付价值。

Sprint1:构建简单的数据摄取管道

让我们首先为我们的业务构建一个非常基本的数据管道。 这是一种 POC 状态,我们可以快速为 Great Lending Company 的数据管道创建 MVP(最小可行产品)。

 

让我们将其分解为更小的任务:

识别数据源:在本例中,我们有 3 个结构化数据源、2 个半结构化数据源和 1 个非结构化数据源。 我们假设源是 3 个 SQL 数据库、1 个 NoSQL 数据库、一个文档共享网络路径和一个用于获取信用数据的 API。 来源的多样性将决定我们的数据摄取工具/技术。

选择数据摄取工具:这是一个非常关键的组件,需要根据现有的技能和数据源的要求等进行分析。但是,为了学习简单起见,我们使用基本的Python/Scala进行摄取。 我们可以在实际的项目环境中尝试不同的工具。

手动设置基础设施:安装Python/Scala、任何依赖项以及所需的任何基础设施(共享文件夹/云存储/HFDS 存储)

提取数据:编写 Python/Scala 代码以连接到不同的源并从中提取数据。

加载到数据湖:在本地文件系统、云数据湖或 HDFS 存储中创建一个 RAW/Bronze 文件夹。 这将被视为 Datalake。 连接到该文件夹并将数据从源复制到数据湖。

数据转换:在数据湖中创建一个 silver/refined 文件夹。 这是数据转换的第二层。 实施基本转换,例如重复数据删除、数据清理、合并到单一事实来源等。

加载到目的地(仓库/黄金层):这是演示就绪的数据层。 理想情况下,数据会加载到具有星型模式/数据集市/数据仓库模式的数据仓库中。 数据建模是在这一层实现的。 您还可以在此处使用相对较新的三角洲湖/冰山表。

恭喜! 您完全从头开始构建了您的第一个数据管道。 是时候吃你最喜欢的冰淇淋了。

您可以在构建此工具时了解不同的 ELT/ETL 工具,例如。 Fivetran、Airbyte、Azure 数据工厂。 您将了解 Spark 和 MapReduce 等转换引擎。

整个过程不会花费您超过一周的时间。 第二周,让我们为管道添加一些更复杂的内容。

Sprint 2:向管道添加幂等性

好吧,你刚才说增加一些复杂性,但随后你引入了一个全新的术语。 幂等性到底意味着什么?

让我引用《开始数据工程》:

“幂等性是数学和计算机科学中某些运算的属性,可以多次应用它们,而不会改变初始应用之外的结果”——维基百科

定义为

f(f(x)) = f(x)

在数据工程背景下,这可能意味着:使用相同的输入多次运行数据管道将始终产生相同的输出。”

  1. 实施跟踪:可以使用唯一标识符或跟踪机制来识别和忽略重复操作。 这确保即使重试操作,它也不会再次运行或产生相同的结果。 删除 — 可以使用写入、写入-审核-发布或比较和合并。 稍后会详细介绍这一点。
  2. 重复数据删除:当数据管道意外重新运行或失败时重新运行时,数据可能会重复。 确保即使在重新运行时也不会发生数据重复。 第 1 点中的模式在这里也有帮助。
  3. 赶上丢失的数据:管道应该能够赶上丢失日期的数据。 实现此目的的一种方法是记录已加载的内容并仅加载此后创建的新数据。
  4. 回填数据:数据管道应该参数化,以便在需要重新加载特定日期的数据时,管道可以执行相同的操作而不会出现任何问题或不会重复数据。 第 1 点中的模式以及第 3 点中的日志记录可以帮助实现这一目标。

查看 Daniel Beach 撰写的有关数据管道幂等性的文章。

现在您不仅创建了数据管道,甚至还实现了数据管道的关键设计原则之一。 是时候放松一下,休息一下,以全新的姿态迎接下一个挑战。

Sprint 3:添加单元测试

在管道中添加单元测试会增加巨大的价值。 这可以确保您不会破坏生产中的事物,也不会导致业务停机。

编写可测试的代码:使用编程最佳实践和函数式编程来创建小块代码作为函数。 更小的代码模块,确保功能都是可测试的。

编写测试用例:定义不同的高覆盖率测试用例。 定义原始输入数据(样本)和预期数据。 编写测试用例以匹配相同的内容。

自动化测试:使用 CI/CD 流程自动执行单元测试代码以及笔记本。

Sprint 4:按照相同的原则创建多个管道

通常创建一个完整的数据分析系统需要摄取多个表。 实现此目的的一种方法是为每个表创建单独的管道,或者拥有一些能够读取多个表的动态管道。 在任何一种情况下,您通常都必须使用一个管道作为模板来创建多个管道。

模板化管道:确保管道的所有组件都以模块化方式编写,以便能够创建可重复用于多个管道的模板。

依赖管理:任何依赖都应该创建为独立的配置或类或方法,以便它们可以跨不同的管道使用。

Sprint 5:编排和工作流程管理

所有管道都需要创建到精心策划的工作流程中。 通常会创建一个主管道,根据成功/失败/完成标准触发不同的子管道。

管道的编排以有向无环图 (DAG) 表示。 您可以使用低代码/无代码工具或 Airflow 或 Mage 等工具创建 DAG。

主数据工作流程

子管道之间的依赖关系

Sprint 6:数据管道自动化

一旦您的主管道准备就绪并经过测试,自动化管道就非常重要。

调度:在特定时间安排管道,以确保管道根据需要自动执行。

监控:一旦计划开始,就会出现故障。 在发生故障时添加强大的警报机制非常重要。 日志记录可用于存储错误消息。 持续监控管道运行以确保它们不会失败或及时重新运行非常重要。

自动重新运行和重试:管道重新运行可以通过多种方式进行。 一种情况是,支持/待命工程师发现错误,分析根本原因,然后决定重新运行管道。 另一种方法是自动化整个重新运行过程。 根据错误消息,可以重新运行管道。 此外,还可以创建一组特定的规则,以便在出现故障时自动重新运行管道。 可以定义重试次数。

在 sprint 6 之后,您已经获得了高质量的可交付成果,该交付成果实施了最佳实践,并经过测试以确保其正确交付结果。 您已经成功创建了完整分析解决方案所需的所有管道,并且还实现了数据加载过程的自动化。 您现在可以多次运行管道,观察任何重复出现的故障或查找故障模式。

在接下来的几个冲刺中,我们尝试添加更多功能,以确保不会出现重复出现的故障影响我们的管道。

 

Sprint7:数据质量和验证

数据质量是构建数据可靠性的一个重要方面。 企业只有在可以信任数据和见解的情况下才会使用我们创建的数据产品。 因此,在数据管道中实施数据质量框架非常重要。

您可以执行以下一些非常基本的任务,以增量方式实现基本的数据质量框架。 请注意,高级项目中有很多细微差别,但是,这些任务介绍了基本概念。

定义数据质量指标和规则:定义要遵循的所有数据质量检查和规则。 一些数据验证规则可以是,电话号码只能是 10 位数字,电子邮件 ID 应该采用 xxxx@yyy.com 格式,客户姓名不能为空等。除了数据质量规则外,我们还需要定义数据质量指标 例如,客户地址的准确率需要达到90%,超过5%的数据列不能全部为空等。

自动数据验证:根据数据质量规则,需要用代码编写自动验证。 一旦数据加载或数据转换完成等,这些验证就会执行。这些自动化的数据验证可确保数据的完整性、一致性和准确性。 从源中提取数据时也需要添加数据验证。

数据质量监控和警报:需要监控自动数据质量验证的结果以进行数据修复。 需要设置警报来标记任何失败的 DQ 验证。 如果源头本身存在数据问题,则需要向上游团队发出警报。 验证失败的数据可以写入错误日志并从数据加载过程中删除。

Sprint 8:持续集成持续部署(CI/CD)

用于协作的版本控制和用于 DevOps 的 CICD 是数据工程的一个极其重要的方面。 数据管道中的 CICD 被视为 Dataops 的一部分,您需要熟悉这些概念和至少一种工具。

版本控制和分支:使用任何代码版本控制工具(GIT)对代码进行版本控制几乎是必要的。 此外,正确的分支策略可以确保团队中开发人员之间的顺利协作。因此,将所有代码添加到 GIT 中,并使用正确的分支策略来检查、执行更改和合并代码。

构建自动化:完成更改后,您应该实现构建自动化,以便每当您进行任何更改时,您的项目都会自动构建,并且所有单元测试都会自动执行。 确保所有 DAG 也在此阶段构建。使用 Azure DevOps / GitHub Actions 等 CICD 工具为数据管道创建自动构建。

自动部署:一旦适当的分支和自动构建就位,您需要考虑自动部署到更高的环境。 在您的个人项目中,您可能不会关心不同的环境,但在实际项目中,您将在开发环境中开发和单元测试代码。 但是所有其他更高环境(测试/阶段/产品)的代码需要使用 CICD 管道自动部署。 管道应该足够智能,可以使用变量处理任何特定于环境的配置。

Sprint 9:基础设施即代码 (IaC)

CICD 管道的一个重要部分也是自动部署所有基础设施。 基础设施即代码 (IaC) 是一项相对较新但数据工程师必须具备的技能。

将基础设施定义为代码:您的所有基础设施需求都需要使用 YML 文件定义为代码/配置。 IaC 工具可用于从 YML 文件自动部署基础设施。

IaC 的版本控制:就像普通的管道代码和文件一样,IaC 代码或配置文件也需要使用 GIT 等版本控制系统进行跟踪。

自动化配置:使用 Terraform、Ansible、Chef 等工具来自动配置不同的基础设施,例如服务器/虚拟机/软件/云组件等。这些工具将允许读取 YML 文件并配置所需的基础设施。

到此阶段,您已经拥有完整的生产级端到端管道。 逐步构建整个项目将使您在整个学习过程中保持专注。

但前进的方向是什么?

Sprint 10:可扩展性和优化

任何软件大部分时间都花在运行而不是开发上。 与所有软件类似,任何数据管道的构建时间都不到几个月,但在实际生产环境中运行数年。

一旦管道转移到生产环境,就会出现新的数据问题,有些可能需要修补程序,有些可能也需要重新开发。

然而,几乎肯定会出现一个问题:性能瓶颈。 我们在开发中的数据太干净了,或者通常甚至不是生产数据大小的一小部分。 无论在开发和测试过程中进行多少验证和优化,生产数据和基础设施都必然会产生性能问题。

这就是您在提高性能、优化加载时间和扩展数据大小方面的技能将派上用场的地方。 因此,作为最后一步,开始为您的管道添加优化和可扩展性:

扩展策略:通过优化管道的可扩展性来规划处理不断增加的数据量。 项目结构应该是模块化的,以便能够重用并扩展到任何数据大小。

性能调整和优化:识别瓶颈并优化管道以获得更好的性能。

集群管理:如果您在集群中运行管道,则理想情况下,集群应仅在数据加载和转换过程中启动并运行。 当没有作业运行时,您应该暂停集群以节省费用。 理想情况下,您应该创建一个自动化流程,以便在数据加载过程完成后立即暂停集群。 您还可以尝试其他集群管理活动。

简而言之

总之,逐步构建您的数据工程项目,

从 MVP 管道开始

添加幂等性、单元测试、编排

自动构建代码和基础设施

使用CICD进行自动部署

监控、测试和优化

这种实用且渐进的方法将帮助您在学习过程中学习不同的概念。 每当您完成清单上的任何任务时,小的渐进步骤都会不断给您带来肾上腺素的刺激。

后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。