数据工程之道:设计和构建健壮的数据系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 数据工程技能和活动

数据工程师的技能集包含数据工程的“底层设计”:安全、数据管理、DataOps、数据架构和软件工程。该技能集需要了解如何评估数据工具以及它们如何在整个数据工程生命周期中相互配合。了解源系统中数据的生成方式,以及分析师和数据科学家在处理和管理数据后如何使用和创造价值也很重要。最后,数据工程师要兼顾许多复杂的移动部件,并且必须沿着成本、敏捷性、可扩展性、简单性、复用性和互操作性等轴线不断优化(如图1-7所示)。我们将在接下来的章节中更详细地介绍这些主题。

图1-7:数据工程的平衡行为

正如我们所讨论的,就在不久前,数据工程师需要知道并理解如何使用少数强大的庞大技术(Hadoop、Spark、Teradata、Hive等)来创建数据解决方案。使用这些技术通常需要对软件工程、网络、分布式计算、存储或其他底层细节有深入的了解。他们的工作将致力于集群管理和维护、管理开销、写管道和转换作业,以及其他任务。

如今,数据工具环境的管理和部署复杂性大大降低。现代数据工具大大地抽象和简化了工作流。因此,数据工程师现在专注于平衡能够为企业带来价值的最简单、最具成本效益的最佳服务。数据工程师还需要创建随着新趋势的出现而发展的敏捷数据架构。

数据工程师不做哪些事情?数据工程师通常不直接构建ML模型、创建报告或仪表板、执行数据分析、构建关键绩效指标(KPI)或开发软件应用程序。数据工程师应该对这些领域有很好的理解,以便更好地为利益相关者提供服务。

1.2.1 数据成熟度和数据工程师

公司内部数据工程的复杂程度在很大程度上取决于公司的数据成熟度。这会显著影响数据工程师的日常工作职责和职业发展。究竟什么是数据成熟度?

数据成熟度是指整个组织向着更高的数据利用率、功能和集成的方向发展,但数据成熟度不仅仅取决于公司的年龄或收入。一家初创公司的数据成熟度可能比一家年收入数十亿美元拥有百年历史的公司要高。重要的是如何利用数据作为竞争优势。

数据成熟度模型有很多版本,比如数据管理成熟度(Data Management Maturity,DMM)(https://oreil.ly/HmX62)等,很难选择一个既简单又对数据工程有用的模型。因此,我们将创建自己的简化数据成熟度模型。我们的数据成熟度模型(如图1-8所示)分为三个阶段:从数据开始,用数据扩展,以数据领先。让我们看看每个阶段以及数据工程师通常在每个阶段做什么。

图1-8:我们为某公司简化的数据成熟度模型

第1阶段:从数据开始

根据定义,一个开始使用数据的公司处于其数据成熟度的早期阶段。公司可能有模糊、松散定义的目标或没有目标。数据架构和基础设施处于规划和开发的早期阶段。采纳和利用可能很低或根本不存在。数据团队很小,人数通常只有个位数。在这个阶段,数据工程师通常是多面手,通常会扮演其他几个角色,例如数据科学家或软件工程师。数据工程师的目标是快速行动、获得牵引力并增加价值。

从数据中获取价值的实用性通常不为人所知,但这种愿望是存在的。报告或分析缺乏正式的结构,大多数数据请求都是临时性的。虽然在这个阶段一头扎进ML很诱人,但我们不推荐这样做。我们已经看到无数数据团队在没有建立坚实的数据基础而试图跳到ML时陷入困境和失败。

这并不是说在这个阶段你不能从ML中获得胜利——这种情况很少见,但有可能。如果没有坚实的数据基础,你可能没有数据来训练可靠的ML模型,也没有办法以可扩展和可重复的方式将这些模型部署到生产中。我们半开玩笑地称自己为“正在恢复的数据科学家”(https://oreil.ly/2wXbD),这主要来自在没有足够的数据成熟度或数据工程支持的情况下参与不成熟的数据科学项目的个人经验。

在开始使用数据的组织中,数据工程师应该关注以下方面:

• 获得包括执行管理层在内的主要利益相关者的支持。理想情况下,数据工程师应该有一个关键举措的发起人来设计和构建数据架构以支持公司的目标。

• 定义正确的数据架构(通常是单独的,因为数据架构可能不可用)。这意味着确定业务目标和你希望通过数据计划实现的竞争优势。努力建立一个支持这些目标的数据架构。请参阅第3章,了解我们对“好”数据架构的建议。

• 识别和审计将支持关键举措的数据,并在你设计的数据架构内运行。

• 为未来的数据分析师和数据科学家构建坚实的数据基础,以生成具有竞争价值的报告和模型。同时,你可能还必须生成这些报告和模型,直到雇用该团队。

这是一个微妙的阶段,有很多陷阱。以下是此阶段的一些提示:

• 如果数据没有带来很多可见的成功,组织的意志力可能会减弱。快速取胜将确立数据在组织内的重要性。请记住,快速取胜可能会产生技术债。要制定减少债务的计划,否则会给未来交付增加阻力。

• 走出去与人交谈,避免孤岛工作。我们经常看到数据团队在安全的环境中工作,不与部门外的人交流,也不从业务利益相关者那里获取观点和反馈。这样做的危险在于你会把很多时间花在对人们没有什么用处的事情上。

• 避免无差别的繁重工作。不要让自己陷入不必要的技术复杂性之中。尽可能使用现成的整体解决方案。

• 仅在可以创造竞争优势的地方构建自定义解决方案和代码。

第2阶段:用数据扩展

在这个阶段,一家公司已经摆脱了临时数据请求并拥有正式的数据实践。现在的挑战是创建可扩展的数据架构并为公司真正的数据驱动的未来做规划。数据工程角色从通才转变为专家,人们专注于数据工程生命周期的特定方面。

在处于数据成熟度第二阶段的组织中,数据工程师的目标是执行以下操作:

• 建立正式的数据实践。

• 创建可扩展且健壮的数据架构。

• 采用DevOps和DataOps实践。

• 建立支持ML的系统。

• 继续避免无差别的繁重工作,只有在产生竞争优势时才进行自定义。

我们在本书后面会回到这些目标中。

需要注意的问题包括以下几点:

• 随着我们对数据的处理变得越来越复杂,人们很想采用基于硅谷公司社会证明的尖端技术。这很少能很好地利用你的时间和精力。任何技术决策都应由它们将为你的客户提供的价值来驱动。

• 扩展的主要瓶颈不是集群节点、存储或技术,而是数据工程团队。专注于易于部署和管理的解决方案,以扩大团队的吞吐量。

• 你会很想把自己定位成一名技术专家,一个可以提供神奇产品的数据天才。将你的注意力转移到务实的领导力上,并开始过渡到下一个成熟阶段,与其他团队就数据的实用性进行沟通。教会组织如何使用和利用数据。

第3阶段:以数据领先

在这个阶段,公司是由数据驱动的。数据工程师创建的自动化管道和系统允许公司内部的人员进行自助分析和ML。引入新的数据源是无缝的,并且产生了有形的价值。数据工程师实施适当的控制和实践,以确保数据始终可供人员和系统使用。数据工程角色比第2阶段更加专业化。

在处于数据成熟度第3阶段的组织中,数据工程师将继续在先前阶段的基础上进行构建,此外他们还将执行以下操作:

• 创建自动化以无缝引入和使用新数据。

• 专注于构建利用数据作为竞争优势的自定义工具和系统。

• 专注于数据的“企业级”方面,例如数据管理(包括数据治理和质量)和DataOps。

• 在整个组织中公开和传播数据的部署工具,包括数据目录、数据血缘工具和元数据管理系统。

• 与软件工程师、ML工程师、分析师和其他人高效协作。

• 创建一个人们可以在这里协作和公开发言的社区和环境,无论他们的角色或职位如何。

需要注意的问题包括:

• 在这个阶段,自满是一个重大危险。一旦组织达到第3阶段,他们就必须不断专注于维护和改进,否则就有退回到较低阶段的风险。

• 与其他阶段相比,技术干扰在这里是一个更大的危险。追求昂贵的业余项目是一种诱惑,这些项目不会为企业带来价值。应该只在可提供竞争优势的情况下使用自定义技术。

1.2.2 数据工程师的背景和技能

数据工程是一个快速发展的领域,关于如何成为一名数据工程师仍然存在很多问题。由于数据工程是一门相对较新的学科,因此进入该领域几乎没有正规培训。大学没有一个标准的数据工程路径。尽管少数数据工程新手训练营和在线教程涵盖了一些随机主题,但目前还不存在该主题的通用课程。

进入数据工程领域的人在教育、职业和技能方面有着不同的背景。每个进入该领域的人都应该投入大量的时间进行自学。阅读本书是一个很好的起点。本书的主要目标之一是为你提供一个基础,让你了解我们认为作为数据工程师取得成功所必需的知识和技能。

如果你正在将你的职业生涯转向数据工程,我们发现从一个邻近的领域转到数据工程是最容易的,比如软件工程、ETL开发、数据库管理、数据科学或数据分析。这些学科倾向于“数据感知”,并为组织中的数据角色提供良好的背景。它们还为人们提供相关的技术技能和背景,以解决数据工程问题。

尽管缺乏正式的路径,但我们认为数据工程师应该要有一个必要的知识体系才能取得成功。根据定义,数据工程师必须同时了解数据和技术。在数据方面,数据工程师需要了解有关数据管理的各种最佳实践。在技术方面,数据工程师必须了解各式各样的工具的选择、它们的相互作用以及它们的权衡。这需要对软件工程、DataOps和数据架构有很好的理解。

放大来看,数据工程师还必须了解数据消费者(数据分析师和数据科学家)的需求以及数据对整个组织的更广泛影响。数据工程是一种整体实践,最好的数据工程师通过业务和技术视角来看待他们的职责。

1.2.3 业务职责

我们在本节中列出的宏观职责并不是数据工程师独有的,而是对于任何在数据或技术领域工作的人来说都至关重要的职责。因为一个简单的谷歌搜索会产生大量资源来了解这些领域,所以为了简洁起见,我们将简单地列出它们:

知道如何与非技术人员和技术人员交流

沟通是关键,你需要能够与整个组织的人建立融洽的关系和信任。我们建议密切关注组织层次结构、谁向谁报告、人们如何互动以及存在哪些孤岛。这些观察对于你的成功将是无价的。

了解如何界定并收集业务和产品需求

你需要知道要构建什么,并确保你的利益相关者同意你的评估。此外,培养对数据和技术决策如何影响业务的意识。

了解敏捷、DevOps和DataOps的文化基础

许多技术专家错误地认为这些实践可以通过技术解决。我们认为这是非常危险的错误。敏捷、DevOps和DataOps从根本上讲是一种文化,需要整个组织的认同。

控制成本

当你能够在提供巨大价值的同时保持低成本,你就会成功。了解如何针对实现价值的时间、总拥有成本和机会成本进行优化。学会监控成本以避免意外。

持续学习

数据领域让人感觉像是在以光速变化。在这个领域取得成功的人非常善于掌握新事物,同时磨炼他们的基础知识。他们还擅长筛选,确定哪些新发展与他们的工作最相关,哪些仍不成熟,哪些只是流行趋势。保持专注并探索学习方法。

一个成功的数据工程师总是会放大视野以了解大局,并探索如何为企业实现巨大价值。无论对于技术人员还是非技术人员,沟通都是至关重要的。我们经常看到数据团队的成功基于他们与其他利益相关者的沟通,成败很少取决于技术。了解如何驾驭组织、确定范围和收集需求、控制成本以及不断学习,将使你与仅靠技术能力来开展职业的数据工程师区分开。

1.2.4 技术职责

你必须了解如何使用预先包装或自行开发的组件构建可在较高层次上优化性能和成本的架构。最终,架构和组成技术是服务于数据工程生命周期的构建块。回顾一下数据工程生命周期的各个阶段:

• 生成

• 存储

• 获取

• 转换

• 服务

数据工程生命周期的底层设计如下:

• 安全

• 数据管理

• DataOps

• 数据架构

• 编排

• 软件工程

放大一点,我们在本节中讨论作为数据工程师需要的一些战术数据和技术技能。我们将在后续章节中更详细地讨论这些内容。

人们经常问,数据工程师应该知道如何编码吗?简短的回答是:是的。数据工程师应该具有生产级软件工程能力。我们注意到,数据工程师所从事的软件开发项目的性质在过去几年中发生了根本性的变化。完全托管的服务现在取代了工程师以前期望的大量低级编程工作,工程师现在使用托管开源和简单的即插即用软件即服务(Software-as-a-Service,SaaS)产品。例如,数据工程师现在专注于高级抽象或将管道编写为编排框架内的代码。

即使在一个更抽象的世界中,软件工程最佳实践提供竞争优势,而能够深入研究代码库的深层架构细节的数据工程师在出现特定技术需求时可为他们的公司提供优势。简而言之,无法编写生产级代码的数据工程师将受到严重阻碍,而且我们认为这种情况不会很快改变。除了许多其他角色外,数据工程师仍然是软件工程师。

数据工程师应该懂什么语言?我们将数据工程编程语言分为主要和次要类别。在撰写本书时,数据工程的主要语言是SQL、Python、Java虚拟机(Java Virtual Machine,JVM)语言(通常是Java或Scala)和bash:

SQL

数据库和数据湖最常用的接口。在因需要为大数据处理编写自定义MapReduce代码而被暂时搁置之后,SQL(以各种形式)重新成为数据的通用语言。

Python

数据工程和数据科学之间的桥梁语言。越来越多的数据工程工具是用Python编写的或具有Python API(Application Programming Interface,应用程序接口)。它被称为“所有方面第二好的语言”。Python是pandas、NumPy、Airflow、scikit-learn、TensorFlow、PyTorch和PySpark等流行数据工具的基础。Python是底层组件之间的黏合剂,通常是用于与框架交互的一流API语言。

JVM语言,例如Java和Scala

流行于Apache开源项目,例如Spark、Hive和Druid。JVM通常比Python性能更高,并且可以提供对比Python API(例如,Apache Spark和Beam就是这种情况)更低级别的功能的访问。如果你使用流行的开源数据框架,那么了解Java或Scala将大有裨益。

bash

Linux操作系统的命令行接口(Command Line Interface,CLI)。当你需要编写脚本或执行操作系统操作时,了解bash命令并熟练使用CLI将显著提高你的生产力和工作流。即使在今天,数据工程师也经常使用awk或sed等命令行工具来处理数据管道中的文件或从编排框架调用bash命令。如果你使用的是Windows,请随时用PowerShell代替bash。

SQL的不合理有效性

MapReduce和大数据时代的出现使SQL退居二线。从那时起,各种发展极大地提高了SQL在数据工程生命周期中的实用性。Spark SQL、Google BigQuery、Snowflake、Hive和许多其他数据工具可以通过使用声明式、集合论SQL语义来处理海量数据。许多流式框架也支持SQL,例如Apache Flink、Beam和Kafka。我们认为称职的数据工程师应该非常精通SQL。

我们是说SQL是一种万能的语言吗?完全不是。SQL是一个强大的工具,可以快速解决复杂的分析和数据转换问题。鉴于时间是数据工程团队吞吐量的主要限制因素,工程师应该采用兼具简单性和高生产率的工具。数据工程师还应该很好地培养将SQL与其他操作组合的专业知识,无论是在Spark和Flink等框架内组合,还是通过使用编排来组合多种工具。数据工程师还应该学习现代SQL语义来处理JavaScript Object Notation(JSON)解析和嵌套数据,并考虑利用SQL管理框架,例如dbt(Data Build Tool,数据构建工具;https://www.getdbt.com)。

专业的数据工程师可以识别SQL何时不是适合该工作的工具,并且可以选择合适的替代方案并编写代码。SQL专家可能会编写查询以在自然语言处理(Natural Language Processing,NLP)管道中对原始文本进行词干化和标记化,但也会认识到使用本机Spark进行编码是这种受虐练习的更好替代方案。

数据工程师可能还需要熟练掌握辅助编程语言,包括R、JavaScript、Go、Rust、C/C++、C#和Julia。当这些语言在整个公司流行或与特定领域的数据工具一起使用时,数据工程师通常需要使用这些语言进行开发。例如,事实证明,JavaScript作为云数据仓库中用户定义函数的语言很受欢迎。同时,C#和PowerShell对于利用Azure和Microsoft生态系统的公司来说是必不可少的。

在快速发展的领域保持同步

一旦一项新技术碾过你,如果你不是压路机的一部分,那么你就是道路的一部分。

——Stewart Brand

你如何在数据工程等瞬息万变的领域中保持自己的技能高超?你应该关注最新的工具还是深入研究基础知识?这是我们的建议:关注基本面以了解不会改变的东西;关注持续的发展,了解该领域的发展方向。新的范式和实践一直在被引入,你有责任与时俱进。努力了解新技术将如何在生命周期中发挥作用。

1.2.5 数据工程角色的连续性,从A到B

尽管职位描述将数据工程师描绘成“独角兽”,他必须具备所有可以想象到的数据技能,但数据工程师并非都从事相同类型的工作或拥有同样的技能组合。数据成熟度是一个了解公司在提高数据能力时将面临的数据挑战类型的有用指导。查看数据工程师所做的工作类型的一些关键区别是有益的。虽然这些区别很简单,但它们阐明了数据科学家和数据工程师的职责,并避免将任何一个角色混为一谈。

在数据科学中,有A型和B型数据科学家[10]的概念。A型数据科学家——A代表分析(Analysis)——专注于理解数据并从中获得洞察力。B型数据科学家——B代表构建(Building)——与A型数据科学家有着相似的背景,并拥有强大的编程技能。B型数据科学家建立使数据科学在生产中发挥作用的系统。借用这个数据科学家连续性,我们将为两种类型的数据工程师创建一个类似的区别:

A型数据工程师

A代表抽象化(Abstraction)。在这种情况下,数据工程师避免了无差别的繁重工作,保持数据架构尽可能抽象和直接,而不是重新发明轮子。A型数据工程师主要通过使用完全现成的产品、托管服务和工具来管理数据工程生命周期。A型数据工程师在各行各业、各种等级的数据成熟度的公司中工作。

B型数据工程师

B代表构建(Build)。B型数据工程师建立数据工具和系统,以扩展和利用公司的核心竞争力和竞争优势。在数据成熟度范围内,B型数据工程师更常见于处于第2阶段和第3阶段(通过数据扩展和领先)的公司,或者当初始数据用例非常独特且关键以至需要自定义数据工具来开始时。

A型和B型数据工程师可能在同一家公司工作,甚至可能是同一个人!更常见的是,首先聘请A型数据工程师来奠定基础,然后B型数据工程师的技能组合是根据公司内部的需要再学习或聘用的。