本文最初发布于 Robert Chang 的博客,经原做者受权由 InfoQ 中文站翻译并分享。阅读英文原文:https://medium.com/@rchang/a-beginners-guide-to-data-engineering-part-i-4227c5c457d7前端
随着在数据科学领域的经验逐渐丰富,我愈来愈确信,数据工程是任何数据科学家最重要也最基础的必备技能之一。我发现不管项目评估、就业机会,甚至职业成长等方面均是如此。数据库
在早前的一篇文章中,我曾提出数据科学家的主要能力在于将数据转换为价值,但这样的能力大小主要取决于其所在公司数据基础架构的完善程度,以及数据仓库的成熟度。这意味着数据科学家必须极为了解数据工程,才能妥善判断本身的技能是否与企业的现状和需求相匹配。此外我所认识的不少知名数据科学家不只擅长数据科学领域,并且都能从战略上将数据工程做为本身的毗邻学科,进而驾驭更大规模、有着更广大目标,他人每每没法驾驭的项目。编程
尽管很重要,但数据工程方面的教育其实很欠缺。从起源的角度来考虑,不少时候为了接受有关数据工程的培训,惟一可行的方式是从实践中学习,但有时这就太迟了。我曾十分有幸可以与一些数据工程师合做,他们很耐心地教我掌握这个课题,但并不是每一个人都能有这样的机会。所以我撰写了这一系列新手指南,对我学到的内容进行了简单总结,但愿能让更多人获益。后端
这一系列文章的涵盖范围不管从哪方面来看都不会十分全面,而且内容主要围绕 Airflow、数据批处理以及 SQL 类语言。然而除此以外,读者也能够自行学习有关数据工程的基础知识,但愿这些内容能让你产生兴趣,并在这个依然快速发展的新兴领域中取得必定的成果。微信
上篇(本文)将从较高角度进行总体式介绍。我会将我的经历与专家看法结合在一块儿带你思考数据工程究竟是什么,为什么充满挑战,以及这个课题如何帮助你和你的公司成长。本文的目标读者主要是有抱负的数据科学家,他们可能但愿了解一些基础知识,进而评估新的工做机会;或者多是早期阶段的创业者,他们可能但愿组建公司的第一个数据团队。架构
中篇 的技术深度更高一些。这篇文章将专一于 Airbnb 的开源工具 Airflow,介绍如何以编程的方式建立、调度和监视工做流。尤为是我将经过演示介绍如何使用 Airflow 编写 Hive 批处理做业,如何使用星型模型(Star Schema)等技术设计表 Schema,最终将介绍一些有关 ETL 的最佳实践。这篇文章的目标读者是但愿掌握数据工程技能的新手数据科学家和数据工程师。框架
下篇 将是这一系列文章的最后一篇,我将介绍一些高级数据工程模式、高级抽象以及扩展框架,借此简化 ETL 的构建并提升效率。经验丰富的 Airbnb 数据工程师曾教给我不少此类模式,我以为这些看法对具有丰富经验,但愿进一步优化工做流的数据科学家和数据工程师颇有用。运维
我本人很是拥护将数据工程做为一个毗邻学科来学习,不过说出来也许会让你吃惊,几年前个人态度是截然相反的。我在本身的第一份工做中曾很是纠结数据工程这件事,动机上和情感上都有不小的纠结。dom
研究生毕业后,我在华盛顿邮报旗下一家关联性质的创业公司里任职数据科学家的工做。当时,满腔抱负的我确信他们能够提供能直接用于分析的数据,随后我就可使用各类先进的技术帮助他们解决最重要的业务问题。机器学习
就任后很快发现,个人主要职责并不像本身设想的那么迷人。其实我当时的工做很是基础:维护一些关键流程,借此追踪网站的访客数,了解每位读者阅读内容花费的时长,以及人们点赞或转发咱们文章的频率。这些工做固然也很重要,由于咱们要将有关读者的各种看法提供给出版商,借此免费换得一些高质量内容。
然而暗地里,我一直但愿能尽快完成手头工做,随后就有时间开发一些真正高级的数据产品,例如这里介绍的那些。毕竟这才是数据科学家的本职工做,我当时这样对本身说。过了几个月,一直没找到适合的机会,我对这家公司也绝望了。然而对于处在早期阶段的创业公司(需求方)或数据科学家新手(供给方)来讲,对我这样的亲身经历可能并非彻底陌生,毕竟双方在这个新的人才领域都没什么经验。
图源:正在勤奋开发 ETL 流程的我(中央穿蓝衣的人)
反思这段经历,我意识到本身所感觉到的挫折,其根源在于对现实世界中的数据项目究竟是如何进行的,实在是知之甚少。我被他们直接丢到了尽是原始数据的旷野中,但距离通过预先处理的,井井有理的.csv 文件还有很远的路程。身处一个以这种状况为常态的环境,我以为本身彻底没有作好准备,哪都不对劲。
不少数据科学家职业生涯开始时都遇到过相似状况,而只有能快速意识到实情以及相关挑战的人才能最终取得成就。我本人也已经适应了这种新的现实,只不过速度很慢,步调很缓。一段时间来,我发现了工具化(Instrumentation)这个概念,适应了机器生成的日志,解析了不少 URL 和时间戳,更重要的是,学会了 SQL(是的,你也许会好奇,工做前我对 SQL 的惟一了解仅仅来自 Jennifer Widom 的 MOOC 公开课)。
如今我已经理解了,分析重在仔细、聪明的计算。而面对咱们身处的,始终充斥着各类喧嚣和炒做的世界,这些基础工做尤其重要。
不少倡议者认为数据科学领域存在的“棱角”和媒体时不时渲染的美好将来之间存在矛盾,在这其中我最喜欢 Monica Rogati 的观点,她对火烧眉毛但愿拥抱 AI 的公司提出了一些告诫:
人工智能能够认为处在需求金字塔的最顶端。没错,自我实现(的 AI)很棒,但首先你得有食物、饮水以及容身之处(数据读写、收集以及基础架构)。
下面这个框架体现了不少技术间的透视关系。在任何一家企业能够优化业务效率或构建更智能的数据产品前,必须首先完成不少基础工做。这一过程相似于咱们每一个人必须首先知足食物和饮水等最基本的生存需求,随后才能最终实现自我。这也意味着企业必须根据自身需求雇佣数据方面的人才。对于创业公司来讲,若是雇佣的第一个数据领域的专家只懂得建模,但不精通,甚至彻底不懂如何构建做为其余工做前提要求的基础层,那么最终的结果将会是灾难性的(我将其称之为“乱序招聘问题”)。
来源:Monica Rogati 的文章“AI 需求的层次结构”
然而不少企业并未意识到,咱们现有的大部分数据科学培训课程、学术机构以及专家都趋向于专一在这座知识金字塔的顶端。就算一些鼓励学生们经过公开 API 调整、准备或访问原始数据的新课程,其中大部分也不会教你们如何妥善设计表 Schema 或构建数据管道。现实世界中数据科学项目必不可少的关键组成元素就这样在“转换”中遗失了。
好在就如同软件工程能够用来从专业角度区分前端工程、后端工程以及站点可用性工程,我以为日渐成熟的数据科学领域也会如此。随着时间发展,人才的具体组成将越发专精化,会出现愈来愈多具有足够技能和经验,能够顺利打造出数据密集型应用程序所需底层平台的人才。
对数据科学家而言,这种将来设想到底意味着什么?我并不想争论说每一个数据科学家都必须成为数据工程领域的专家,然而我也确实认为每一个数据科学家都必须对这些基本信息有所了解,这样才能更好地评估项目以及工做机会,真正实现学以至用。若是你发现本身须要解决的不少问题都要求本身具有更深刻的数据工程技能,那么就绝对有必要付出时间精力学习数据工程。实际上我在 Airbnb 的工做过程当中就是这样作的。
不管你对数据工程的学习抱有怎样的目的或多强烈的兴趣,都必须首先明白数据工程的重点所在。Airflow 的原做者 Maxime Beauchemin 在数据工程师的崛起一文中将数据工程总结为:
数据工程领域能够看做商业智能和数据仓库的超集,同时也包含更多源自软件工程的要素。这一学科还蕴含了所谓的“大数据”分布式系统运维所需的相关技能,以及与庞大的 Hadoop 生态、流处理,以及大规模计算有关的概念。
在数据工程师须要负责的各类重要任务中,最吃香的能力之一是设计、构建、维护数据仓库。与零售商在本身的仓库中存储商品并包装销售的作法相似,咱们须要在数据仓库内对原始数据进行转换,并存储为可查询的格式。
来源:Jeff Hammerbacher 的 UC Berkeley CS 194 课程讲义
在不少方面,数据仓库都是实现更高级分析操做,实现商业智能、在线实验以及机器学习必不可少的引擎和燃料。下文列举了几个具体示例,从中也能够看出数据仓库在处于不一样阶段的企业中所扮演的重要角色:
500px 构建的分析系统:Samson Hu 撰文介绍了 500px 但愿在“市场匹配”的情况下更进一步增加的过程当中面临的挑战。他详细介绍了从零开始构建数据仓库的全过程。
扩展 Airbnb 的实验平台:Jonathon Parks 介绍了 Airbnb 的数据工程团队如何构建专用数据管线,为实验性报表框架等内部工具提供支持的作法。这些成果对 Airbnb 产品开发文化的塑造和扩展相当重要。
Airbnb 使用机器学习技术预测房屋价值:由我本人撰写的这篇文章介绍了为什么在构建批处理训练和脱机计分机器学习模型时会须要在前期进行大量有关数据工程的准备工做。本文还特别介绍了特征工程、构建和回填训练数据等不少相似于数据工程的任务。
若是不具有数据仓库这个基础,与数据科学有关的全部活动或者会极为昂贵,或者将彻底没法扩展。例如,若是不具有妥善设计的商业智能数据仓库,数据科学家可能将没法针对相同的基本问题给出不一样结果,而这仍是最好的状况;最糟糕的状况下,数据科学家可能会无心中直接针对生产数据库进行查询,致使生产事务延迟或中断。同理,若是不具有实验性的报表流程,也许就只能经过很是原始的重复性手工操做进行实验性质的深度探索挖掘。最终,若是没法经过适当的数据基础架构为标签集合(Label collection)或特征计算提供支持,训练数据自己的筹备也将会耗费大量的时间。
上述全部示例都遵循了 ETL 这一常见模式,ETL 表明“提取、转换和加载”,这三个概念性的步骤决定了大部分数据管道的设计方式和构造,能够充当将原始数据转换为可分析数据的蓝图。为了更精确地理解这个流程,我从 Robinhood 的工程博客中找了一张很实用的图片:
来源:Vineet Goel 名为 Robinhood 为什么使用 Airflow?”的文章
提取:在这一阶段,传感器等待上游数据源加载(例如上游数据源多是计算机或用户生成的日志、关系型数据库副本、外部数据集等)。加载完成后,须要将数据从源位置移出以便进一步转换。
转换:这是全部 ETL 做业的核心,经过应用业务逻辑并执行筛选、分组、聚合等操做将原始数据转换为可分析的数据集。这个步骤须要对业务以及不一样领域的知识有全面理解。
加载:最后加载处理完成的数据并将其移动到最终位置。一般这类数据集可被最终用户直接使用,或充当后续 ETL 做业的上游数据源,借此造成所谓的数据族系(Data lineage)。
虽然全部 ETL 做业都遵循这样的通用模式,但实际做业自己在用法、工具以及复杂度等方面可能各不相同。下文列举了一个很是简单的 Airflow 做业范例:
来源:DataEngConf SF 2017 研讨会上 Arthur Wiedmer 的分享
上述范例可在到达执行日期后等待一秒钟的传递操做,随后直接输出天天的日期,但现实世界中的 ETL 做业每每更复杂。例如,咱们可能会经过一个 ETL 做业从生产数据库中提取一系列 CRUD 操做,并派生出各类业务事件,例如用户注销。随后可经过另外一个 ETL 做业接受实验性的配置文件,计算该实验的相关指标,最终向 UI 输出 p 值和置信区间,借此告诉咱们产品方面的相关变化是否有益于防止用户流失。此外还有其余示例,例如经过批处理 ETL 做业天天计算机器学习模型的特征,借此预测用户是否会在将来几天里流式。这样的作法有着无穷的可能性!
在构建 ETL 的过程当中,不一样公司可能会采起不一样的最佳实践。过去多年来,不少企业经过不懈努力总结了构建 ETL 的过程当中可能会遇到的通用问题,并开发了各类框架帮助咱们妥善解决这些问题。
在数据批处理的世界中,目前存在好几个开源的竞品。例如 Linkedin 开源了本身的 Azkaban,该产品能够简化 Hadoop 做业依赖项的管理工做;Spotify 在 2014 年开源了本身基于 Python 的 Luigi 框架;Pinterest 也开源了 Pinball;Airbnb 则在 2015 年开源了 Airflow(一样基于 Python)。
每种框架都有本身的优点和局限,对此不少专家已经进行了细致的比较(可参阅这里以及这里)。不管选择哪一种框架,都须要考虑下列几个重要功能:
来源:Marton Trencseni 对 Luigi、Airflow, 和 Pinball 的对比
配置:ETL 本质上就很复杂,咱们必须能简洁地描述数据管道内的数据流动方式。所以有必要对 ETL 的建立方式进行评估。是否能经过图形界面配置,仍是要使用面向特定领域的语言或代码?目前“配置即代码”的概念很是流行,这种方式可让用户以编程的方式构建表达式管道,而且可定制。
图形界面、监视、警报:须要长时间运行的批处理做业不可避免会在运行过程当中出错(例如群集失败),哪怕做业自己并不包含 Bug。所以监视和警报能力对长期运行做业的追踪工做相当重要。框架对做业进度提供可视化信息的能力如何?可否以及时准确的方式提供警报或通知?
回填:数据管道构建完成后,一般还要时不时从新处理历史数据。理想状况下,没人愿意构建两个独立做业,一个用于回填历史数据,另外一个用于计算当前或将来的指标。框架对回填的支持如何?可否用标准化的方式高效、可缩放地进行?这些重要问题都必须考虑。
做为 Airbnb 的员工,我固然喜欢使用 Airflow,该技术以优雅的方式解决了我在数据工程相关工做中遇到的常见问题,对此我十分感激。目前已经有超过 120 家企业公开宣称在使用 Airflow 做为本身既成事实的 ETL 编排引擎,我甚至能够大胆猜想 Airflow 将成为之后新一代创业公司执行批处理任务时的标准。
如上文所述,不一样企业在构建 ETL 时可能选择大相径庭的工具和框架,对于数据科学家新手,可能很难决定如何选择最适合本身的工具。
对我而言就是如此:以前在华盛顿邮报的实验室工做时,最初咱们主要经过 Cron 进行 ETL 的调度,并将做业组织成 Vertica 脚本。在 Twitter 工做时,ETL 做业使用 Pig 构建,不过如今他们已经转为使用 Scalding,并经过 Twitter 本身的编排引擎调度。Airbnb 的数据管道主要使用 Airflow 在 Hive 中开发。
在我数据科学家职业生涯的前几年,大部分时候我会直接使用公司肯定的工具,提供什么就用什么。但在遇到 Josh Will 后,个人作法彻底不一样了,通过与他讨论,我意识到实际上 ETL 有两种典型范式,而数据科学家应当慎重决定到底要使用哪一种范式。
视频来源:Josh Wills 在 @ DataEngConf SF 2016 所作的主题演讲
以 JVM 为核心的 ETL 一般使用基于 JVM 的语言(例如 Java 或 Scala)开发。这些 JVM 语言中的工程数据管道一般须要以更加命令式(Imperative)的方式考虑数据的转换,例如使用键值对。此时用户定义的函数(UDF)的编写过程会更为轻松,由于不须要再使用不一样语言来编写,一样由于这个缘由,测试做业也能够大幅简化。这种范式在工程师之间很是流行。以 SQL 为核心的 ETL 一般使用诸如 SQL、Presto 或 Hive 等语言开发。ETL 做业一般须要以声明式(Declarative)的方式定义,而且几乎一切都以 SQL 和表为核心。UDF 的编写有时候会略微麻烦,由于必须使用另外一种语言(例如 Java 或 Python)编写,也正是所以,测试做业也会显得困难重重。这种范式在数据科学家之间很是流行。
做为曾经用过这两种范式构建 ETL 管道的数据科学家,我天然而然更倾向于使用以 SQL 为核心的 ETL。实际上我甚至愿意说,做为数据科学家新手,若是使用 SQL 范式,你将能更快速地掌握数据工程。为何?由于 SQL 远比 Java 或 Scala 容易学(除非你已经熟悉后二者),借此你能够将更多精力专一于数据工程最佳实践的学习,而不是在一个不熟悉的新语言基础上学习全新领域内的各类新概念。
本文介绍了分析工做涉及到的不一样技术层,以及一些基础性的工做,例如数据仓库的构建,这是企业进一步扩展必不可少的前提需求。此外还简要探讨了构建 ETL 时涉及的不一样框架与范式。不过须要学习和探讨的内容还有不少。
在这一系列的下一篇文章中,我将深刻细节,介绍如何用 Airflow 构建 Hive 批处理做业。尤为是将介绍与 Airflow 做业有关的基础信息,并经过分区传感器和运算符等构造切实体验提取、转换和加载操做。咱们将一块儿学着使用数据建模技术,例如星型架构来设计表。最后,我还将介绍一些极为实用的 ETL 最佳实践。
更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)