
本书主要介绍如何使用开源ETL工具来完成数据整合工作。 本书介绍的PDI(Kettle)是一种开源的 ETL 解决方案,书中介绍了如何使用PDI来实现数据的剖析、清洗、校验、抽取、转换、加载等各类常见的ETL类工作。 除了ODS/DW类比较大型的应用外,Kettle 实际还可以为中小企业提供灵活的数据抽取和数据处理的功能。Kettle除了支持各种关系型数据库、HBase、MongoDB这样的NoSQL数据源外,它还支持Excel、Access这类小型的数据源。并且通过插件扩展,Kettle 可以支持各类数据源。本书详细介绍了Kettle可以处理的数据源,而且详细介绍了如何使用Kettle 抽取增量数据。 Kettle 的数据处理功能也很强大,除了选择、过滤、分组、连接、排序这些常用的功能外,Kettle 里的Java表达式、正则表达式、Java脚本、Java类等功能都非常灵活而强大,都非常适合于各种数据处理功能。本书也使用了一些篇幅介绍Kettle这些灵活的数据处理功能。 本书后面章节介绍了如何在 Kettle 上开发插件,如何使用Kettle处理实时数据流,以及如何在Amazon AWS上运行Kettle 等一些高级主题。 除了介绍PDI(Kettle)工具的使用和功能,本书还结合Kimball博士的数据仓库和ETL子系统的理论,从实践的角度介绍数据仓库的模型设计、数据仓库的构建方法,以及如何使用 PDI实现Kimball博士提出的34种ETL子系统。
用户体会 报表管理是销售管理的一项重要工作,面对70多个国家合作伙伴的不同种类型的销售报 表,如何通过自动化手段进行格式统一、计算和分发,是我2009年在新兴市场集团工作时的 “痛点”——是我特别想实现的,而这套方案必须要基于开源的方案来控制开发及未来维护的 成本。 Jason给我推荐开源的ETL工具Kettle来完成这个工作,他使用 Kettle 加上开源的报表工具 Jasper,用了两个月的时间就把这套系统实现并上线了: 它可以自动从各个数据源获取数据、自动生成 Excel 报表,并自动投送到相关业务人员的邮 箱里,这节省了我三个做报表的人力!而且数据更及时、准确!非常了不起!! 赵海生 客户数据与市场秩序 总监 联想集团 数据是投资的重要基础,但由于数据量大且指标较多,从各种不同格式的报告中摘取我们 希望的数据一直是让我们头疼的事情。这一事情的改观发生在2011年Jason为我们带来Kettle工 具之后,经过几个月的开发和测试,我们的指标自动抓取系统正式上线并一直沿用至今,它能 从各种格式的报告中摘取重要的数据,这些数据形成我们分析的基础。实际上,这只是使用了 Kettle工具的一小部分功能而已,相信在数据抓取和处理领域,我们还将有更多的合作机会。 从2011年就听到Jason要翻译本书的计划,很高兴能看到这一目标最终实现,这是Jason本人的 一个里程碑,也是让更多的人受益于Kettle工具的一次契机,祝Jason和Kettle的路都越走越宽。 郑伟征 业务总监 北京中能兴业投资咨询有限公司 IV ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 从企业架构的角度来看,和传统的编写代码相比,ETL工具在开发实施效率(包括代码复 用)、可靠性、低出错率、可维护性上绝对都是巨大的进步。我个人相信在企业ETL领域,编程 语言的工作未来可能会减少到总任务量的10%,剩下90%均需要借助ETL工具来实现。 本书和市面上林林总总的介绍ETL工具的书籍不同。书籍的原作者Matt是Kettle的核心设计 与开发者(Kettle的灵魂所在),而且Jason带领的团队对 Kettle的源代码有深入的了解,并有 丰富的实践经验,他们对本书所涉及的主题有切身的体会,这样可以最大限度地避免出现很多 计算机译本图书出现的读者“不知所云”的情况。本书亦可以看作是Jason在国内不遗余力推广 Kettle ETL解决方案的又一个里程碑。 徐洋 葛兰素史克(中国)投资有限公司 Enterprise Architect 数据对于每个企业来说都是极其重要的,它蕴含的价值不可限量,尤其是对于我服务的电 信行业。我们做ETL工作先是自己开发程序或者存储过程,后来慢慢转型使用ETL工具,深刻体 会到工具对于生产力发展的重要性。 随着对ETL的认识越来越深入,要求也越来越高,尤其是一些企业特定的需求即使是顶级的 商业ETL软件也无法满足。在2012年一次偶然的机会我认识了Jason从而认识了Kettle,在Jason的 帮助下仅用了三天时间就开发出一个定制化的组件,解决了长期困扰我们的问题,Kettle本身的 灵活性、扩展性再加上Jason的团队对这款软件的驾驭能力,都是我们公司所需要的。 在得知Jason要翻译此书时,真的非常期待并衷心祝愿Jason和Kettle在中国能有更好的发展。 黄磊 上海理想信息产业(集团)有限公司 BI架构师 译者序 对于Kettle这个软件,要从2006年年初说起,当时我所在的公司内有很多数据整合类项目, 当时商业的ETL工具太昂贵,不适合在预算有限的项目内使用,而手工写代码或写存储过程又会 耗费大量的开发时间,还会增加项目的维护成本,于是我计划开发一款 ETL 工具,来满足公司 内部数据整合项目的需求。作为产品开发的第一步,就是要调研当时市场上同类的开源产品, 我调查了包括 Kettle、CloverETL、OctopusETL、KETL 等在内的多款开源 ETL 工具。 当时Kettle 2.2 版本刚发布,在阅读完Kettle 2.2的代码后,我觉得这就是我想要的 ETL 工 具,它的插件丰富功能强大,并行执行效率高,最重要的是它有灵活可扩展的插件架构,可以 通过二次开发来提供更多的功能,并可以作为引擎方便地集成在第三方应用中。 于是我放弃了自己开发一个 ETL 工具的想法,转而成为一个 Kettle 开发人员。当时的 Kettle刚刚问世,功能还有很多不完善的地方,于是我经常在MSN上和Kettle的作者Matt Casters 先生讨论Kettle的一些技术细节。Matt 是一位非常热心的程序员,对于我的问题或建议都能给 予耐心的解答。这里要感谢Matt,正是因为他的无私奉献,才使Kettle成为世界上最流行的开源 ETL工具。 2010 年Pentaho Kettle Solutions一书出版,我通过朋友李小凡获得了该书,李小凡是www. itisbi.com网站的站长,他也为Pentaho在中国的推广做出了重要贡献。 看过该书后,我觉得这是一本非常好的介绍 Kettle的书籍(尽管之前还有其他两本介绍 Kettle的书籍,但那两本书基本是Kettle的入门书籍),Pentaho Kettle Solutions一书内容全面,对 Kettle的技术细节也有一定程度的阐述,具有一定的理论深度。于是我计划翻译该书,以便让更 多的做数据整合工作的开发人员都了解这个开源的ETL工具。 尽管从2010年年底我就开始动手翻译本书,但其间因为各种项目的耽搁,本书的翻译工作 断断续续持续了三年。在翻译本书的过程中我还得到了www.pentahochina.com社区里一些朋友的 支持,包括阿虎、银杏树、Super-超,他们协助我翻译了本书的一部分内容,在此也表示感谢。 在 2013年年中,本书即将翻译完成的时候,遇到中山大学的黄志洪教授,黄教授推荐了电子工 业出版社出版该书。这里感谢黄志洪老师、张月萍老师的帮助。 在本书的翻译过程中,尤其要感谢父母和妻子对我的支持,我以翻译本书为由逃避了大部分 的家务劳动。我的妻子曹雪梅除了承担大部分的家务劳动外,还承担了本书的一部分翻译工作。 VI ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 在本书的成书过程中,我还得到了很多朋友和同事的帮助,包括曾浩、刘小朋、郭振未、 方进、任潇楠、郑发林、贺警阳、李超、冯海军、孙斌、饶丽、刘赫扬等同事,他们都为本书 的出版做出了贡献,在此一并表示感谢。 现在我已经从一个 Kettle 开发人员变成了 Pentaho/Kettle 的粉丝,并且成立了一家商业智能/ 数据整合类的咨询公司(北京傲飞商智软件有限公司),从事 Pentaho/Kettle 的咨询、培训、开 发、实施等工作(公司是 Pentaho 的官方合作伙伴,是 Pentaho公司在中国地区唯一授权培训合 作伙伴)。 由于本书是基于Kettle 4.0版本的,而Hadoop等大数据技术在Kettle 4.3版本中才支持,所以 本书没有介绍Kettle的大数据功能。关心Kettle如何支持大数据的读者可以到Pentaho的wiki去了 解。 虽然译者已经尽力去翻译本书,但出于译者能力所限,如在书中出现错误和疏漏,还请读 者不吝指正。 关于作者 Matt Casters是一位具有多年工作经验的独立商业智能顾问。他为许多大公司建立了无数 个数据仓库和BI解决方案。在过去的8年里,Matt Casters把自己的时间都用于研发一个ETL工 具——Kettle。2005年12月,Kettle成为开源软件。2006年初期,Kettle走进Pentaho。随后,Matt 就职于Pentaho,成为数据集成总监。在Pentaho, 他继续从事Kettle的研发工作。Matt致力于帮 助建设Kettle社区,回答论坛上的提问,有时在世界会议上发表演讲。博客:http://www.ibridge. be。Twitter:@mattcasters。 Roland Bouman目前从事前台页面和商业智能的研发工作。他从1998年开始从事IT行业。 多年来一直致力于开源软件的研发,尤其是数据库技术、商业智能以及页面开发框架。同时, Roland Bouman还是MySQL和Pentaho社区的成员。他经常参加MySQL使用者会议、OSCON、 Pentaho社区等国际会议。Roland Bouman不仅是MySQL 5.1 Cluster Certification Guide和Pentaho Solutions两本书的合著者之一, 也是MySQL和Pentaho相关书籍的技术评论家。技术博客:http:// rpbouman.blogspot.com。Twitter:@rolandbouman。 Jos van Dongen是一位著名的商业智能专家、作家和演说家。他从1991年开始从事软件开 发、商业智能以及数据仓库等领域的工作。Jos van Dongen曾先后就职于顶级的系统集成公司和 管理咨询公司。1998,他创立了自己的咨询公司,Tholis Consulting。他为许多商业和福利组织 构建了BI和数据仓库系统。Jos为丹麦Database Magazine撰写了新的BI研发成果,并且经常在国 内和国际会议上发言。Jos van Dongen撰写了一本关于开源BI的书,并且和Roland Bouman合作编 写了Pentaho Solutions。更多信息参考:http://www.tholis.com。Twitter:@josvandongen。 致谢 按照惯例,本书的封面列出了参与这本书创作的人员名单。但实际上,这本书是许多人共 同劳动的成果。正是这许许多多人在幕后辛勤地工作着,才成就了本书的出版。作为作者,我 们真心地感谢所有为本书做出贡献的人们。感谢大家帮助我们完成了Pentaho Kettle Solutions。 首先感谢为本书直接做出贡献的作者们。 Ingo Klose提出了在单个转换中生成偏移键„ 的解决方案。(参考第8章“处理维度表”的 “基于计算器生成代理键”一节,图8-2。) „ Samatar Hassan提供了Kettle支持 RSS的转换例子。在第21章“Web Services”中,RSS部 分几乎都是Samatar Hassan的贡献。 „ Mike Hillyer和MySQL团队创建并一直维护着Sakila样例数据库。他们的Sakila样例数据 库会在第4章有详尽阐述,本书的其他章节也会引用Sakila样例数据库。 „ Kasper de Graaf是本书的第四位作者,虽然书的封面只出现了三位作者。他来自DIKWAcademy, 为本书写了Data Vault一章,阐述了自己对这个领域的专业见解。Johannes van den Bosch审阅了Kasper的工作,让Data Vault这一章更加清晰完整。 „ Bernd Aschauer和Robert Wintner 均来自 Aschauer EDV(http://www.aschauer-edv.at/en), 两人为第6章SAP部分提供了例子和屏幕截图。 „ Daniel Einspanjer来自Mozilla Foundation,为第7章提供了转换例子。 感谢你们的辛勤工作,为本书做出了巨大的贡献。同时感谢所有Pentaho和Kettle的技术专 家,他们在繁忙的工作日程中抽出时间审阅此书,使得此书的羽翼丰满。 我们还要感谢Kettle和Pentaho社区。在整个写书前后,社区中的伙伴们对ETL、数据整合和 Kettle提出了宝贵的意见和建议。我们希望这本书对于正在使用和计划使用Kettle的朋友们起到实 际的作用。读者是判定我们是否成功的最好证明。如果成功了,我们要感谢Kettle和Pentaho社区 中的每一位伙伴。 感谢Kettle软件项目的所有贡献者和研发人员。我们大家都是Kettle的热心使用者。我们热爱 Kettle, 因为它用直接有效的方法解决了日常中的数据整合问题。使用Kettle工作快乐无比,这也 是完成这本书的巨大动力。 最后,感谢Wiley出版社。感谢他给我们提供了写这本书的机会,感谢他完美的管理体系和 对我们的巨大支持。我们还要尤其感谢项目主编Sara Shlaer。尽管我们总是延期交稿,但是Sara 一直耐心鼓励着我们,她的建议、关心、镇静和无以伦比的幽默感让本书及时地在截止日期前 完成。另外,还要感谢执行编辑Robert Elliot,感谢他对我们小小团队的信任以及他对Pentaho 致谢 ■ IX Kettle Solutions所做的努力。 ——作者的话 由于当时正忙于发布Kettle 4,日程安排非常紧,所以单靠一个人的力量写这本书是极其困难 的。感谢Jos和Roland,感谢他们的认真和专业,我们一起努力完成了这本书。也同时感谢他们接 受了我的邀请。即使写书的过程很痛苦,但是和Jos、Roland一起合作,这一切都是值得的。 在Kettle的源代码还没有公开之前,Kettle还不太为人所知,因为没有太多的人会关注一个 不开源的ETL工具。Kettle从当时的无人所知到现在成为世界上最广泛使用的开源ETL工具,这 要感谢成千上万的志愿者们,他们帮助解决了很多问题。自从Kettle开源以来,Kettle和Kettle社 区都快速发展。Kettle社区的贡献功不可没。正是由于这些研发人员、翻译人员、测试人员、错 误报告人员、论坛参与人员、那些带来新想法的人们,甚至那些爱抱怨的人们,造就了今天的 Kettle。这里我尤其要感谢我们社区中一个很重要的成员,Pentaho。Pentaho CEO Richard Daley 和他的团队自从加入进来,一直都在支持着Kettle 项目。没有他们的支持,Kettle不会取得今天 的成绩。对于我来说,能和Pentaho的伙伴们一起工作是我的荣耀。 我们社区的几位成员对本书的部分技术内容进行了审阅。Nicholas Goodman、Daniel Einspanjer、Bryan Senseman、Jens Bleuel、Samatar Hassan以及Mark Hall审阅了我写的章节。他们提出 了中肯的意见和建议。这是我第一次写书,难免有不妥之处,感谢他们花费宝贵时间和辛勤劳动。 ——Matt Casters 首先我要感谢和我一起写这本书的两位合著者Jos和Matt。和这样经验丰富、知识渊博的专 家们合作,是我的荣幸。希望今后有机会我们能够继续合作。我们彼此不同的技术领域帮助完 成了这本书的不同方面。 此外,我还要感谢对我写的章节进行审阅的专家们,Benjamin Kallman、Bryan Senseman、 Daniel Einspanjer、Sven Boden和Samatar Hassan。他们的评论、建议、直率中肯的批评促使书的 写作更加完善。 最后感谢我博客http://rpbouman.blogspot.com/上的读者们。他们的评论给了我极大的鼓舞。 当我公布要写Pentaho Kettle Solutions后,收到了许多好的反馈。 ——Roland Bouman 回顾2009年10月,那时Pentaho Solutions才刚刚出版两个月。Roland和我一致同意不会再 写另外一本书。但Bob Elliot找到了我们,建议我们再写一本。的确,我们也一直在讨论这个问 题,一直认为如果再写一本书的话,那一定是关于Kettle的书。这也正是Bob想让我们做的,写 一本用Kettle解决数据整合问题的书。接着我们很快发现Matt Casters也要成为书的作者,并向我 们发出了一同写书的邀请。我们欣然接受。回顾过去,我不敢相信我们取得了这么大的成功。 真心感谢Roland和Matt一直以来容忍我,接受我。感谢Bob。尤其感谢Sara,感谢她不懈的努力 让我们圆满完成任务。 尤其要对Ralph Kimball说一声谢谢。读者会在书中找到他的观点。Ralph允许我们使用 Kimball Group的34种ETL子系统作为这本书许多内容的框架。Ralph也审阅了第5章,他为第5章 写出了极其丰富的评论,使得第5章为书中第二、三、四部分奠定了坚实的基础。 最后感谢Daniel Einspanjer、Bryan Senseman、Jens Bleuel、Sven Boden、Samatar Hassan以及Benjamin Kallmann, 他们对我写的章节给予了技术的审阅,他们的评论、疑问和建议增添了书的价值。 ——Jos van Dongen 介绍 50多年以前,以普通应用为主的计算机首次出现,计算机的应用进而延伸到科学和商业领 域里。在过去,大多数公司基本只有一台计算机,连接一台显示器和一台打印机。因此,想要 整合存储在不同系统中的信息是不可能的。然而,19世纪70年代后期,关系数据库的出现改变 了这一切。80年代,计算机和数据库对公司信息的采集进一步升温。毫无疑问,这一切推动了 一个新行业的产生,正如IBM研究者Dr. Barry Devlin 和Paul Murphy的会议论文所说:“一个商 业和信息系统的建筑”(1988年 IBM Systems Journal首次出版,27卷,1号)。作为“商业报 表的单一逻辑数据库”, 商业数据库的概念首次出现。随后不到五年的时间,Bill Inmon 出版 了Building the Data Warehouse,这本书具有划时代的意义,进一步推动了构建逻辑数据库的概 念和科技。 数据仓库领域的一个重要概念就是数据整合。数据整合就是把不同数据库中的数据组合到 一起,对外提供统一的数据视图。数据整合最典型的案例就是整合存货数据和订单数据。数据 整合的另一个案例就是把各个部门的客户关系管理系统中的客户信息整合到公司客户关系管理 系统中。 说明:阅读本书,你会看到有两个术语“数据整合(data integration)”和ETL(extract, transform, and load)在交叉使用。尽管技术上并不完全正确(ETL 只是数据整合的一种, 见第1章),但大多数开发人员都把这两个词视为同义词,很多年来我们也一直如此。 在理想情况下,不应该存在数据整合的需求。企业运营所需要的所有数据都应该保存在一 个单一的系统里,所有的主数据都应该100%正确,所有分析和决策使用的外部数据都应该自 动链接到我们的数据上。这个系统可以存储所有的历史数据,也可以以秒级的速度查询和分析 数据。 遗憾的是,我们并非生活在理想世界中。在现实世界中,大多数的组织为各种目的使用不 同的系统。有CRM 系统,有会计系统,有销售和销售支持系统,有物流系统,有库存管理系 统,等等,这个列表还在不断增长。更糟糕的是,业务上相同的数据可能会保存在不同的系统 中,但内容并不完全相同。 为了能够处理所有这些问题,需要创建一个单一的、合成的、一致并且可靠的数据库来展 现分析数据,由此看来,数据整合工具是必不可少的。目前最流行、功能最强大的数据整合工 具是Kettle, 也被称为Pentaho Data Integration。这正是本书讨论的主题。 介绍 ■ XI Kettle的起源 Kettle起源于十年以前,本世纪初。当时,ETL工具千姿百态,比较流行的工具有50个左 右,ETL框架数量比工具还要多些。根据这些工具的各自起源和功能可分为以下4种类型,如图1 所示。 Quick Hacks Code Frameworks Generators Engines 图1 ETL工具 „ 快速代码修改(Quick Hacks):这类工具主要用于抽取数据和加载文本文件。很多这 类工具现在仍在使用。“hacker”和“hacking”这样的词汇现在成了贬义词。商业智能 本身比较复杂,在很多情况下quick hacks是项目成功与否的关键,而且能够节省时间和 成本。这种quick hacks 的解决方案主要由咨询公司创造,一般是跟随项目的一次性解决 方案。 „ 框架(Frameworks):通常情况下,当一个商业智能顾问同时做几个相似的项目时, 代码可以在小范围内调整就可以应用到不同的项目上。这样说来,每个咨询公司都有自 己的framework,因为这些frameworks 帮助构建了ETL程序。而且通过改变参数,就可以 完成不同项目的抽取数据、加载、日志、信息捕获、数据库连接等工作。 „ 代码生成器(Code Generators):当 frameworks上再加一个开发界面作为额外的抽象 层时,就可以基于元数据为某个平台(C、Java、SQL,等等)生成代码了。这种代码生 成器的种类很多,有的是生成简单代码,还需要你手工维护代码,有的功能强大的ETL 工具可以生成各种代码。这类 ETL 工具一般也是由一些比较著名的咨询公司开发的。 „ 引擎(Engines):随着 ETL 技术的不断发展, ETL引擎技术出现了,这样就不必再生 成代码。引擎可以执行参数化的可配置的ETL过程,也就是对 ETL 本身的描述。这样就 避免了生成代码、编译、部署等困难。 从大概的统计来看,超过一半的项目使用的是快速代码修改和框架的方法。剩下的项目里 大部分使用各类基于代码生成器的ETL方法。基于引擎的ETL方法只在少量的ETL项目里使用, 主要在非常大的 ETL 项目里使用。 说明:十年前,开源的ETL项目非常少。Enhydra Octopus 是其中的一个,它是一个基于Java 的,代码生成器类型的ETL工具(可以从 www.enhydra.org/tech/octopus 下载)。很多用户从 这个开源项目受益,所以这个项目现在仍旧可以使用,它也是开源项目可以持续不衰的一 个例子。 正是在这样的背景下,Kettle 软件的作者,本书作者之一,Matt Caster 每天忙于咨询工作, 为不同项目不停地修改 ETL 代码和框架,部署各种 ETL 工具的代码生成器。 时间回退到 2000 年,Matt 还是商业智能顾问,他通常的职位是数据仓库架构师或管理 XII ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 员。在这样的职位上,经常需要把企业数据转换为业务需要的各种信息。通常这些工作是在没 有一个很强大的ETL工具的情况下完成的,因为这类的ETL工具都很昂贵。尤其对中小型项目 来说,不可能使用这么昂贵的工具。在这种情况下,没有什么选择:一次次面对同样的问题, 使用各类框架或代码生成技术来完成自己的工作。他做过相关的工作包括:用C语言和嵌入 式SQL(ESQL/C)从Informix里抽取数据;用Microsoft VB开发一个抽取工具,从IBM AS/400 Mainframe系统里抽取数据;为一家大型银行开发完整的数据仓库,包含 90个缓慢变更的维度表 和 35个事实表;完全手写Oracle PL/SQL 和 shell 脚本,等等。 但是这些经历,使Matt明白应该做些什么。在 2001 年Matt就有了开发一个自己的ETL工具 的想法。 Matt:“我想写一个 ETL 软件。但这会占用我晚上和周末的时间” Kathleen(Matt 的夫人):“Oh,太好了!要用多长时间?” Matt:“如果一切顺利,第一个能运行的版本应该用三年时间,第一个完整的版本要用五 年。” Kettle 的设计 因为十年来一直在同各种 ETL工具做斗争,所以Matt 确定了 Kettle 的一个主要设计目标是 尽可能开放。主要就是指: „ 开放,可读的元数据格式(XML)。 „ 开放,可读的关系型资源库格式。 „ 开放的API。 „ 容易安装(少于2分钟)。 „ 对各类数据库开放。 „ 容易使用的图形用户界面。 „ 容易传送数据。 „ 容易把数据转换成各种格式。 在最开始的两年,进度比较缓慢,大量的工作都用于研究这个新的ETL工具应该具有哪些 功能。开发一个并行化的ETL引擎就是在这段时间确定的。多年的基于代码修改方式、框架方 式、代码生成器方式的ETL项目惨痛经验,使Matt 确信,新的 ETL工具一定是应该基于引擎方 式的。 因为Matt以前主要使用C语言进行开发,所以开始时,他使用客户端/服务器这样的代码,来 测试在不同的处理器和服务器之间传递数据的性能。通过很多不同场景的测试,他明白ETL性能 瓶颈应该主要在于数据的编码和解码。所以,Kettle 的一个设计原则就是尽量不做数据的转换。 如今这一原则仍在Kettle 中可以体现出来。 说明:Kettle 一词起源于“KDE ETTL Environment”,因为最开始的计划是在K Desktop Environment(www.kde.org)上开发这个软件。在这个计划被取消后,才把它重命名为 “Kettle ETTL Environment”。 介绍 ■ XIII 由于缺少各种关系数据库的驱动,最终还是采用了当时较新的Java开发语言。在2003年,又 选择了SWT(Standard Widget Toolkit)来开发界面,因为Matt不喜欢Java AWT(Abstract Window Toolkit)的性能和界面风格。而SWT使用了本地操作系统的组件库,因此性能更好,而且界面 也更符合操作系统的风格。 因为是Java新手,又要开发这个复杂的ETL工具,可以想象在开始的第一年,Kettle的代码 库就是一团糟。代码没有包;没有结构,命名方式非常可笑(C语言的风格)。没有做异常处 理,经常发生崩溃。这样的Kettle版本唯一能做到的事情就是它可以工作了。它可以读取文本文 件,读取和写入数据库,而且它有了一个JavaScript 脚本步骤,用来解决各种复杂问题。而且它 还非常灵活和易于使用。这毕竟是一个商业智能工具,而不是一个Java项目。 但有一点很清楚,Kettle 需要改进。于是有人在这个时候提供了帮助,朋友 Wim De Clercq,他是ixor(www.ixor.be)的合伙人,也是一位高级Java 架构师。他解释了很多Java 概 念,如包、异常处理等。慢慢地时间就在学习Java设计模式(如单例模式等)中流走了。 听朋友的建议就意味着大量的代码重构。所以第一个版本后,Matt 把每个周末的时间都用到了 代码重构上,重新写了几万行代码。逐渐的,几个月以后,事情就开始向着好的方向发展。 Kettle 获得机会 Matt和朋友、同事、其他高级商业智能(BI)顾问们分享了Kettle的最初成就,听取了他们 对Kettle 的想法,从那时开始 Kettle 开始逐渐被大家了解。后来在2004年,Matt 把 Kettle 部署在 了比利时Flemish 交通中心(www.verkeerscentrum.be),Kettle从遍布比利时的几千个数据源整合 几亿条数据。当时项目小组没有时间写代码,也没有钱去买那些商业ETL工具,所以项目就使用 了Kettle。这个比利时交通中心的项目提升了Kettle 的功能和性能,在这个时期,Kettle 发展非常 迅速。因为有了各种数据的测试用例,Kettle可以更好地支持各种数据库。也是在这个时期,世 界各地的开发人员都可以免费下载Kettle版本使用(免费下载,还没有开源)。 最开始反馈不多,但大多数的反馈都是积极的。最有趣的一个反馈来自于一个德国的开发 人员,Jens Bleuel,他问是否可以把第三方的软件整合进Kettle,他希望把SAP/R3 connector整合 到Kettle。Kettle 当时的版本是1.2,还没有插件架构。Jens Bleuel的这个需求是当时开发插件框架 的主要原因,后来就形成了 Kettle 2.0。最后直到2004年底,才开发完成。这是一个相对完整的 版本,支持缓慢变更维度、杂项维度、28个步骤和13种数据库。直到这个时候,这个工具的真 正潜力才发挥出来。然后,Jens Bleuel 创建了Kettle 的第一个插件,ProSAPCON,用来从SAP/ R3 服务器读取数据。 Kettle 走向开源 在那个时期有很多令人激动的事情,Matt 和 Jens 打算把Kettle商业化,通过kettle.be 网站和 Jens所在的Proratio(www.proratio.de)公司来销售Kettle。 Kettle 还是在取得进展,也有一些试用的请求。但是,做一个完整的ETL工具的开发和销售 是一项艰巨的任务,不是靠个人可以完成的。而且Matt还发现,用 Kettle来工作很有乐趣,而销 XIV ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 售Kettle 却没什么乐趣。他不得不找到一种方式,可以把精力聚集到有乐趣的开发工作中。所以 最后在2005年的夏天,Matt决定把Kettle 开源。这样Kettle可以自己卖自己,并吸引更多的人参 与开发工作。 2005年12月份,Kettle 2.2 的代码第一次发布后,反响非常强烈。JavaForge 上第一周的下载 数量就达到了35 000 次,消息迅速在全世界传播。 因为很多开源项目到最后都成了无人管的项目,为了避免这种情况的发生,要尽快为Kettle 项目构建一个社区。这就意味着,在随后的几年可能需要回答上千封的电子邮件和论坛帖子。 幸运的是,Kettle很快获得了开源商业智能公司Pentaho的帮助(www.pentaho.com),Pentaho获 得了源代码的版权,Matt也成为 Pentaho的内部人员,带领Kettle项目的开发,随后Kettle改名为 Pentaho Data Integration。 Kettle同样获得了来自世界各地的开发人员、翻译人员、测试人员、文档编写人员的帮助, 没有这些人的帮助,Kettle 也不能像今天这样发展迅速。 关于本书 本书起源于2009年8月,此时Roland 和 Jos 的第一本书《Pentaho 解决方案》(即Pentaho Solutions)已经出版。正如跑过马拉松的人,他们发誓以后“再也不跑了”。但是当他们看到第 一本的热烈反响,他们的态度慢慢地转变过来了。他们想如果还要写一本书的话,就要写Kettle 和数据整合。当《Pentaho 解决方案》一书的出版人Bob Elliot问他们能否再写一本Kettle 书的时 候,Kettle书的主题和目录其实都已经确定下来了。另外,还让他们受到鼓舞(和吃惊)的是, 他们的配偶都鼓励他们继续写作。还有其他的好消息,当他们邀请Matt Casters为本书审核时, Matt Casters也希望参与到本书的写作中,这当然是求之不得的事情了。 当时写《Pentaho 解决方案》一书的动力和主要原因,如今仍然存在:企业开始逐渐了解商 业智能能给企业带来什么价值,并逐渐认识了开源和免费商业智能的解决方案。这些商业智能 解决方案要求事先把数据集中在一起,然后再进行分析、报表和仪表盘等工作。所以商业智能 项目的开始阶段都要先进行数据的整合,本书就可以帮助你进行数据整合的工作。 在过去的十多年里,各种类型的开源软件逐渐被大家认识和接受,来代替那些价格昂贵而 不灵活的商业软件。人们常会错误地认为开源软件就是没有成本的,尽管从软件License的角度 看这是正确的,但一个商业智能解决方案(永远)不会免费。在一个解决方案里有硬件成本、 方案实现的成本、维护的成本、培训和移植的成本,等等,所有这些费用加一起,软件License 的费用只占其中一小部分。开源降低了软件本身的成本,而且任何人都可以获得源代码,都可 以发现源代码的bug,这样也提高了代码的质量 。开源软件一般都是基于开放的标准和通用的编 程语言(大部分是Java),这样使开源软件更灵活、更具扩展性。而且大多数开源软件都不局限 在某个操作系统平台上,这样更扩展了软件的灵活性和自由度。 但开源软件缺少文档和手册。很多开源软件提供了高质量的代码,但开发人员因为更多地 关注于软件本身而没有太多的时间写文档。尽管你可以找到很多关于Kettle的零散的信息来源, 但我们觉得有必要为正在探索Kettle并构建数据整合解决方案的ETL开发人员提供一个完整的信 介绍 ■ XV 息来源。这就是本书的目的——帮助你使用Kettle 构建数据整合的解决方案。 谁需要读这本书 本书适合于想知道如何用Kettle来构建 ETL 解决方案的人。例如寻找低成本的ETL方案的IT 经理、想扩充自己知识和技能的IT 专家、负责开发ETL方案的BI或数据仓库顾问。可能你是一 个有丰富经验的软件开发人员,但对数据整合领域不太了解;也可能你是一个经验丰富的使用 某些商业软件的 ETL开发人员,但对于Kettle不太了解。无论哪种情况,因为有了这本参考书, 你就可以直接上手了。当然读者如果能有商业智能、数据库等方面的知识更好,但在本书的开 始部分会介绍一些这方面的知识。当然本书也会介绍数据整合方面的概念,但重点还是讲解如 何把这些概念转换为实际的工作方案。这也是本书被命名为 《Pentaho Kettle 解决方案》的原 因。 阅读本书的前提 只要能做到下面两件事,你就可以开始阅读本书了:有一台计算机,能连接到互联网。本 书使用到的所有软件都可以从互联网下载。对计算机的系统也没有太多的要求,有1GB内存和 2GB空闲硬盘的,一般在4年之内的计算机都可以很好地运行Kettle作业。 本书一些章节里有提供软件下载的URL地址。对于Pentaho软件,除了源代码,还提供有4种 类型的软件版本: GA(General Availability)releases:这是„ 稳定的发布版本,并不是最新的版本,但是最 可靠的版本。 „ Release candidates:候选版本,可能会成为下一个发布版本的版本,里面可能还会有一 些未发现的bug。 „ Milestone releases:最新的里程碑版本,里面都会有一些新功能。 „ Nightly builds:每天的build版本,最新的版本,也是最不稳定的版本。 在写作本书的时候,我们使用的都是每天的build版本。在写作本书时,Kettle 4.0的GA版本 已经发布了。也就是说,在你读本书的时候就可以使用没有多少bug的正式发布的稳定版本。 Kettle社区版的下载地址是:http://wiki.pentaho.com/display/COM/Community+Edition+ Downloads。 从本书可以学到什么 本书会教给你: „ 数据整合是什么,数据整合的价值。 „ Kettle 解决方案的概念基础。 „ 如何在单机和客户/服务器环境下安装和配置Kettle。 „ 如何使用MySQL的Sakila演示数据库构建一个完整的端到端的ETL解决方案。 XVI ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 34种ETL子系统,如„ 何使用Kettle 实现这34种子系统。 „ Kettle 如何完成数据抽取、清洗和确认、处理维度表、加载事实表、操作OLAP 立方 体。 „ Kettle 的开发生命期。 „ 如何在Kettle 环境里使用Pentaho 的敏捷BI 工具。 „ 如何调度和监控作业和转换。 „ 多个开发人员如何协同工作,如何管理不同版本的ETL方案。 „ 什么是数据的血统分析、影响分析、审计。Kettle 如何支持这些概念。 „ 如何利用分区、并行化和动态集群技术提高Kettle 的性能。 „ 如何使用复杂文件、Web 服务和Web API。 „ 如何使用Kettle 加载基于Data Vault 模型的企业数据仓库。 „ 如何在其他应用中集成Kettle,如何通过二次开发扩展Kettle。 本书如何组织 本书解释了ETL的概念、技术和解决方案。本书的很多场景都使用了MySQL的Sakila数据 库,除此之外,我们还通过其他不同的场景来演示不同的概念。如果例子还依赖于其他数据 库,我们都确保这些例子和MySQL数据库(5.1版本)兼容。 这些例子都提供了在实际环境中应用所必需的技术细节。例子范围覆盖了从部门级的数据 集市到企业级的数据仓库。 第一部分:开始 本书的第一部分在一个较高的层次上,对Kettle 的架构、功能等做了一个快速的介绍。这一 部分包括下面几个章节。 第1章:ETL入门。介绍数据整合项目的主要概念和挑战。我们介绍事务系统和分析系统的 主要区别、ETL适用于哪些场合、如何用ETL解决方案的不同部分来解决数据整合问题。 第2章:Kettle基本概念。介绍了Kettle的一些基本设计原则,以及Kettle 的软件组成。我们 介绍了Kettle的基本概念,如作业、转换、步骤、步骤之间的连接等,以及它们之间的相互 作用。另外本章还介绍了Kettle 如何和数据库交互、设置数据库特定的参数。本章还提供了 Kettle 界面的一个快速教程。 第3章:安装和配置。介绍如何获得Kettle 软件,如何安装Kettle。Kettle包含哪些组件,它 们之间的关系,如何利用它们构建ETL解决方案。最后,我们解释不同的配置选项、配置文 件和配置文件的位置。 第4章:ETL示例解决方案——Sakila。基于MySQL Sakila数据库,介绍一个完整的ETL解决 方案的例子。使用本章的星型模型,你可以了解如何处理缓慢变更维度以及如何加载事实 表。另外本章的一个重要主题就是如何通过映射步骤重用转换。 介绍 ■ XVII 第二部分:ETL 本书的第二部分介绍的是Ralph Kimball 博士和他的同事们提出的34种ETL子系统。这些 ETL 子系统分别在The Kimball Group Reader(Wiley, 2010)和The Data Warehouse Lifecycle Toolkit (Wiley, 2008)书中介绍过。这一部分包括下面的章节。 第5章:ETL子系统。介绍不同ETL子系统和它们的分类。四个类别分别是抽取、清洗和确 认、发布、管理。在本章,我们还介绍了Kettle 如何支持这些子系统。本章是其他章节的基 础,也是理解ETL解决方案架构的必读材料。 第6章:数据抽取。它是ETL子系统的第一类,包括了数据剖析、变更数据捕获和抽取系 统。我们解释什么是数据剖析,为什么它应该是ETL项目的第一个环节。变更数据捕获 (CDC)用来检测源系统中变化的数据,我们提供了几个方案来实现CDC。 第7章:清洗和校验。它是ETL子系统的第二类,也是真正进行ETL过程的地方。在大多 数情况下,并非只是简单地从不同的源系统中读取数据,再发布这些数据。数据必须要一 致,要删除冗余和重复的数据;多种数据编码模式要统一成一种编码模式。本章介绍了很 多Kettle用于这类转换的步骤,如模糊查询步骤用来进行模糊匹配和排重。 第8章:处理维度表。这是第三类ETL子系统“发布”的一部分。在这一章,我们先介绍 什么是维度表。接着介绍如何使用“维度查询/更新”步骤进行不同类型的加载和更新。然 后再特别介绍子系统10,代理键生成系统。其他的主题,如时间维度、杂项维度、小维度 等,在本章做了一些介绍。最后介绍了递归层次。 第9章:加载事实表。本章介绍加载不同类型的事实表, 本章的前半部分介绍不同的加载策 略,并介绍如何处理早到和迟到的事实数据。我们介绍并演示了不同的批量加载方法。除 了最常见的交易事实表外,我们还介绍了周期和累积事实表。我们还介绍了一种新型的事 实表,“面向状态”的事实表。 第10章:处理OLAP数据。本章全部用来介绍ETL子系统中的一个(20,OLAP cube 构建系 统)。本章演示了如何处理三种类型的OLAP数据源:从XML/A 和Mondrian 的 cube 中读取 数据,读取和加载Polo cube中的数据。 第三部分:管理和部署 本书前面部分介绍如何构建解决方案,本部分的章节主要介绍如何部署和管理解决方案。 第11章:ETL开发生命期。本章主要介绍如何使用Kettle中的工具,设计、开发和测试一个 ETL 解决方案。本章介绍了敏捷BI开发方法,以及如何通过敏捷BI方法加快开发过程。本 章介绍了不同的测试方法,在解决方案发布之前都要使用这些测试方法进行测试。 第12章:调度和监控。本章介绍了不同的调度方法。包括操作系统调度工具,如cron和 Windows计划任务,以及Pentaho 内置的Pentaho BI调度平台。一般可以直接在设计环境中监 控正在运行的作业和转换,但我们也介绍了如何通过日志表来获取成功或失败的作业信息。 XVIII ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 第13章:版本和移植。本章介绍如何管理不同版本的 Kettle作业和转换,通过版本管理,可 以在必要的情况下,把作业回滚到前一个版本。本章介绍的另一个主题是如何在开发、测 试、确认、生产环境中完成 Kettle作业的移植。 第14章:血统和审计。本章介绍如何使用Kettle的元数据来判断数据的来源以及数据如何 被使用。出于审计的目的,我们需要知道作业何时运行,运行了多久,给数据带来了哪 些变化。为了完成这些需求,Kettle 有可扩展的日志能力,这些我们在本章都做了详细介 绍。 第四部分:性能和扩展性 本部分内容都是关于Kettle的性能问题。Kettle里有一些选项可以加快抽取、转换和加载的速 度,本部分里的每一章都是Kettle性能问题的一种解决方案。 第15章:性能调优。本章解释Kettle 转换引擎的工作原理,帮你找出Kettle 转换的性能瓶 颈。我们也提供了关于如何提高Kettle性能和吞吐量的几种解决方案。本章的大部分篇幅都 用于介绍如何提高文本文件的处理速度,以及如何把数据尽可能快地加载到Kettle的数据流 里。 第16章:并行、集群和分区。本章介绍了关于提高Kettle 性能的更多技术内容。一般来说有 两种方法:水平扩展和垂直扩展。垂直扩展的目标是充分利用单机的处理能力,充分利用 多核CPU的大内存。水平扩展是把任务分布在不同的服务器上。我们介绍如何在Kettle 里使 用这两种方法来提高性能。 第17章:云计算中的动态集群。本章介绍如何使用云计算这样的大规模计算能力来提高 Kettle 性能。如何把第16章介绍的集群方式应用到云计算的环境中,我们使用Amazon的 Elastic Computing Cloud(EC2)的云计算环境。本章另外还介绍了如何基于不同的工作负 载,来动态扩展或缩减计算集群,以节省成本并提高性能。 第18章:实时数据整合。本章介绍Kettle如何处理源源不断的实时数据流。Kettle本身就是 基于流的数据处理引擎,所以只要把Kettle连接到一个持久的数据流或消息队列,并启动转 换,Kettle就可以处理实时数据流了。 第五部分:高级主题 本书的高级主题覆盖了从几个方面演示了Kettle的一些高级功能、如何扩展Kettle 的能力、 如何把Kettle用在第三方应用里。 第19章:Data Vault管理。本章解释了什么是数据仓库的Data Vault(DV)模型,如何使用 Kettle 加载DV模型中的三类表:中心表、链接表、附属表。 第20章:处理复杂数据格式。本章介绍如何处理非关系型数据,包括结构化和半结构化的 数据。介绍如何把键值对格式的数据转化为规则的数据,介绍如何使用正则表达式来结构 化那些看上去是非结构化的数据,介绍如何处理重复分组和多值属性。这种键值对数据一 介绍 ■ XIX 般是存在所谓的无模式或NoSQL数据库中的。 第21章:Web Services。本章介绍如何从互联网获取数据。介绍和Web 相关的一些组件, 并描述了从互联网获取数据的不同方法,如HTTP GET、POST和SOAP。另外介绍了如何使 用Kettle处理一些常见的互联网数据格式,如XML、JSON和RSS。 第22章:Kettle集成。本章演示了Kettle如何被外部应用使用。描述了Kettle API和几个例 子。最简单的一个例子就是Pentaho 报表,它使用Kettle 转换作为数据源。 第23章:扩展Kettle。本章介绍如何写自己的插件来扩展Kettle。介绍了如何开发不同类型 的插件:包括步骤、作业项、分区类型、资源库类型和数据库类型。 附录 本书附录部分提供了如下一些快速参考。 附录A:Kettle 生态群。描述了在Kettle的世界里都包括什么,如何获得帮助,如何使用论坛 和其他用户沟通。我们还解释了如何使用Jira,Jira是Pentaho的问题跟踪管理系统,通过Jira 我们可以查找和追踪Bug,监控Bug状态,并查看软件发展的路线图。 附录B:Kettle企业版特性。解释Kettle企业版和社区版的不同,详细说明了企业版的一些特 性。 附录C:内置的变量和属性参考。提供Kettle内置的所有变量和属性的参考,在Kettle解决方 案里可以直接使用这些变量和属性。 前提 本书主要介绍的是Kettle,Kettle的安装和使用是本书的基本内容。第3章描述了Kettle的安装 和配置过程。但本书在介绍Kettle的过程中,还用到了其他一些软件,这些软件也需要我们事先 了解,这里统一做介绍。 Java Kettle 运行在Java 平台上。尽管Java 无处不在,而且你的机器上可能已经存在Java,不过我 们在第3章中还是提供了安装向导和注意事项。 MySQL MySQL数据库是本书所有例子的默认数据库。可以从 http://dev.mysql.com/downloads/mysql 网站下载MySQL。MySQL数据库几乎可以安装在任何操作系统下,可以通过下载后运行Installer 来安装,也可以通过Linux 的系统资源库来安装。如何你用的是Ubuntu系统,而且还没有安装 MySQL数据库,可以通过运行sudo apt-get install mysql-server 命令来安装MySQL数据库。另外还 XX ■ Pentaho Kettle 解决方案:使用PDI构建开源ETL解决方案 要下载MySQL的GUI客户端。从MySQL 5.2开始,MySQL Workbench 客户端提供数据库建模、 管理和查询功能,成为一个集成的解决方案。 SQL Power Architect 为了给数据库建模,我们强烈推荐使用数据库建模工具, Kettle并不提供这个功能,Pentaho 其他工具也不提供这个功能。最好的一个开源的建模工具就是SQL Power Architect,本书也使用 了这个建模工具。可以从SQLPower 的网站下载这个工具:www.sqlpower.ca/page/architect。 Eclipse Kettle使用Java开发,使用了Eclipse IDE集成开发环境,本书的最后一章介绍了如何使用 Eclipse开发自己的Kettle插件。Eclipse是一个全能工具,任何开发语言都可以使用Eclipse开发环 境。因为Eclipse的框架灵活,使用不同的插件和视图,它还可以完成诸如数据建模、创建报表、 数据挖掘之类的工作。Eclipse可以从www.eclipse.org/download 下载。如果你运行的是Ubuntu, 也可以从软件中心下载(Ubuntu 10.4 开发工具→IDE,Ubuntu 9.10开发工具→Programming)或 运行命令 sudo apt-get install eclipse。 网络资源 本书用到的所有例子都可以从本书网站下载(www.wiley.com/go/kettlesolutions)。例子按照 章节目录组织,例子里的文件包括: 例子数据库的 Power*„ Architect 数据模型。 „ 所有的PDI作业和转换文件。 „ 例子必要的SQL 脚本。 更多的资源 本书的很多章节都给出了进一步阅读的资料或网站,这些资源更深入介绍了或延伸了本书 讨论的一些主题。如果你对商业智能和数据仓库还不太了解(或者你想跟踪最新的发展),下 面有一些资源可以参考: „ http://en.wikipedia.org/wiki/Business_intelligence „ http://www.kimballgroup.com „ http://b-eye-network.com „ http://www.tdwi.org 你也可以访问我们的网站,那里有我们的联系方式,如果有需要你可以直接和我们联系: „ Matt Casters: www.ibridge.be „ Roland Bouman: rpbouman.blogspot.com „ Jos van Dongen: www.tholis.com
第一部分:开始 第1章 ETL入门2 1.1 OLTP和数据仓库对比 2 1.2 ETL是什么 3 1.2.1 ETL解决方案的演化过程 4 1.2.2 ETL基本构成 5 1.3 ETL、ELT和EII 6 1.3.1 ELT 6 1.3.2 EII:虚拟数据整合 7 1.4 数据整合面临的挑战 8 1.4.1 方法论:敏捷BI 9 1.4.2 ETL设计 10 1.4.3 获取数据 10 1.4.4 数据质量 12 1.5 ETL工具的功能 13 1.5.1 连接 13 1.5.2 平台独立 14 1.5.3 数据规模 14 1.5.4 设计灵活性 14 1.5.5 复用性 15 1.5.6 扩展性 15 1.5.7 数据转换 15 1.5.8 测试和调试 16 1.5.9 血统和影响分析 16 1.5.10 日志和审计 16 1.6 小结 17 第2章 Kettle基本概念18 2.1 设计原则 18 2.2 Kettle设计模块 19 2.2.1 转换 19 2.2.2 作业 23 2.2.3 转换或作业的元数据 28 2.2.4 数据库连接 28 2.2.5 工具 31 2.2.6 资源库 31 2.2.7 虚拟文件系统 31 2.3 参数和变量 32 2.3.1 定义变量 32 2.3.2 命名参数 33 2.3.3 使用变量 33 2.4 可视化编程 34 2.4.1 开始 34 2.4.2 创建新的步骤 35 2.4.3 放在一起 36 2.5 小结 38 第3章 安装和配置39 3.1 Kettle软件概览 39 3.1.1 集成开发环境:Spoon 40 3.1.2 命令行启动:Kitchen和Pan 42 3.1.3 作业服务器:Carte 42 3.1.4 Encr.bat和encr.sh 42 3.2 安装 43 3.2.1 Java环境 43 3.2.2 安装 Kettle 43 3.3 配置 46 3.3.1 配置文件和.kettle目录 46 3.3.2 用于启动Kettle程序的shell脚本 51 3.3.3 管理 JDBC 驱动 52 3.4 小结 53 第4章 ETL示例解决方案——Sakila54 4.1 Sakila 54 4.1.1 sakila示例数据库 55 4.1.2 租赁业务的星型模型 57 4.2 预备知识和一些基础的Spoon技巧 60 4.2.1 安装ETL解决方案 60 4.2.2 Spoon使用 60 4.3 ETL示例解决方案 61 4.3.1 生成静态维度 62 4.3.2 循环加载 64 4.4 小结 80 第二部分:ETL 第5章 ETL子系统82 5.1 34种子系统介绍 82 5.1.1 抽取 83 5.1.2 清洗和更正数据 84 5.1.3 数据发布 86 5.1.4 管理ETL环境 89 5.2 小结 91 第6章 数据抽取92 6.1 Kettle数据抽取概览 92 6.1.1 文件抽取 93 6.1.2 数据库抽取 97 6.1.3 Web数据抽取 98 6.1.4 基于流的和实时的抽取 99 6.2 处理ERP和CRM系统 100 6.2.1 ERP 挑战 100 6.2.2 Kettle ERP插件 101 6.2.3 处理SAP数据 101 6.2.4 ERP和CDC 问题 104 6.3 数据剖析 105 6.4 CDC:变更数据捕获 110 6.4.1 基于源数据的CDC 111 6.4.2 基于触发器的CDC 113 6.4.3 基于快照的CDC 113 6.4.4 基于日志的CDC 116 6.4.5 哪个CDC方案更适合你 117 6.5 发布数据 117 6.6 小结 118 第7章 清洗和校验 119 7.1 数据清洗 120 7.1.1 数据清洗步骤 121 7.1.2 使用参照表 123 7.1.3 数据校验 127 7.2 错误处理 130 7.2.1 处理过程错误 131 7.2.2 转换错误 132 7.2.3 处理数据(校验)错误 133 7.3 审计数据和过程质量 136 7.4 数据排重 137 7.4.1 去除完全重复的数据 137 7.4.2 不完全重复问题 138 7.4.3 设计排除重复记录的转换 139 7.5 脚本 142 7.5.1 公式 143 7.5.2 Java脚本 143 7.5.3 用户自定义Java表达式 144 7.5.4 正则表达式 145 7.6 小结 146 第8章 处理维度表 147 8.1 管理各种键 148 8.1.1 管理业务键 148 8.1.2 生成代理键 149 8.2 加载维度表 154 8.2.1 雪花维度表 154 8.2.2 星型维度表 159 8.3 缓慢变更维度 161 8.3.1 缓慢变更维类型 161 8.3.2 类型1的缓慢变更维 161 8.3.3 类型2的缓慢变更维 163 8.3.4 其他类型的缓慢变更维 167 8.4 更多维度 168 8.4.1 生成维(Generated Dimensions) 168 8.4.2 杂项维度(Junk Dimensions) 169 8.4.3 递归层次 170 8.5 小结 171 第9章 加载事实表 172 9.1 批量加载 173 9.1.1 STDIN和FIFO 173 9.1.2 Kettle批量加载 174 9.1.3 批量加载一般要考虑的问题 176 9.2 维度查询 176 9.2.1 维护参照完整性 176 9.2.2 代理键管道 177 9.2.3 迟到数据 179 9.3 处理事实表 182 9.3.1 周期快照和累积快照 182 9.3.2 面向状态的事实表 183 9.3.3 加载周期快照表 185 9.3.4 加载累积快照表 185 9.3.5 加载面向状态事实表 186 9.3.6 加载聚集表 186 9.4 小结 187 第10章 处理OLAP数据 188 10.1 OLAP的价值和挑战 189 10.1.1 OLAP 存储类型 190 10.1.2 OLAP在系统中的位置 191 10.1.3 Kettle OLAP选项 191 10.2 Mondrian 192 10.3 XML/A服务 194 10.4 Palo 197 10.4.1 建立Palo 连接 198 10.4.2 Palo 架构 199 10.4.3 读Palo数据 200 10.4.4 写Palo数据 202 10.5 小结 204 第三部分:管理和部署 第11章 ETL开发生命期 206 11.1 解决方案设计 206 11.1.1 好习惯和坏习惯 206 11.1.2 ETL流设计 209 11.1.3 可重用性和可维护性 209 11.2 敏捷开发 210 11.3 测试和调试 214 11.3.1 测试活动 214 11.3.2 ETL测试 215 11.3.3 调试 218 11.4 解决方案文档化 220 11.4.1 为什么实际情况下文档很少 220 11.4.2 Kettle的文档功能 221 11.4.3 生成文档 222 11.5 小结 223 第12章 调度和监控 224 12.1 调度 224 12.1.1 操作系统级调度 225 12.1.2 使用Pentaho 内置的调度程序 228 12.2 监控 232 12.2.1 日志 232 12.2.2 邮件通知 234 12.3 小结 237 第13章 版本和移植 238 13.1 版本控制系统 238 13.1.1 基于文件的版本控制系统 239 13.1.2 内容管理系统 240 13.2 Kettle 元数据 240 13.2.1 Kettle XML 元数据 241 13.2.2 Kettle 资源库元数据 242 13.3 管理资源库 244 13.3.1 导出和导入资源库 244 13.3.2 资源库升级 245 13.4 版本移植系统 245 13.4.1 管理XML文件 245 13.4.2 管理资源库 246 13.4.3 解决方案参数化 246 13.5 小结 248 第14章 血统和审计 249 14.1 批量血统抽取 250 14.2 血统 251 14.2.1 血统信息 251 14.2.2 影响分析信息 252 14.3 日志和操作元数据 254 14.3.1 日志基础 254 14.3.2 日志架构 255 14.3.3 日志表 257 14.4 小结 262 第四部分:性能和扩展性 第15章 性能调优 264 15.1 转换性能:找到最弱连接 264 15.1.1 通过简化找到性能瓶颈 265 15.1.2 通过度量值找到性能瓶颈 266 15.1.3 复制数据行 267 15.2 提高转换性能 269 15.2.1 提高读文本文件的性能 269 15.2.2 写文本文件时使用延迟转换 271 15.2.3 提高数据库性能 272 15.2.4 数据排序 275 15.2.5 减少CPU消耗 276 15.3 提高作业性能 280 15.3.1 作业里的循环 280 15.3.2 数据库连接池 281 15.4 小结 281 第16章 并行、集群和分区 283 16.1 多线程 283 16.1.1 数据行分发 284 16.1.2 记录行合并 285 16.1.3 记录行再分发 285 16.1.4 数据流水线 286 16.1.5 多线程的问题 287 16.1.6 作业中的并行执行 289 16.2 使用Carte子服务器 289 16.2.1 配置文件 289 16.2.2 定义子服务器 290 16.2.3 远程执行 291 16.2.4 监视子服务器 291 16.2.5 Carte安全 291 16.2.6 服务 292 16.3 集群转换 293 16.3.1 定义一个集群模式 293 16.3.2 设计集群转换 294 16.3.3 执行和监控 295 16.3.4 元数据转换 296 16.4 分区 298 16.4.1 定义分区模式 299 16.4.2 分区的目标 300 16.4.3 实现分区 300 16.4.4 内部变量 301 16.4.5 数据库分区 301 16.4.6 集群转换中的分区 302 16.5 小结 302 第17章 云计算中的动态集群 303 17.1 动态集群 303 17.1.1 建立动态集群 304 17.1.2 使用动态集群 306 17.2 云计算 306 17.3 EC2 307 17.3.1 如何使用EC2 307 17.3.2 成本 307 17.3.3 自定义AMI 307 17.3.4 打包新AMI 310 17.3.5 中止AMI 310 17.3.6 运行主节点 310 17.3.7 运行子节点 311 17.3.8 使用EC2 集群 312 17.3.9 监控 313 17.3.10 轻量原则和持久性 314 17.4 小结 314 第18章 实时数据整合 315 18.1 实时ETL介绍 315 18.1.1 实时处理面临的挑战 316 18.1.2 需求 316 18.2 基于流的转换 317 18.2.1 一个基于流的转换实例 318 18.2.2 调试 321 18.2.3 第三方软件和实时整合 321 18.2.4 Java 消息服务 322 18.3 小结 324 第五部分:高级主题 第19章 Data Vault管理 326 19.1 Data Vault 模型介绍 327 19.2 你是否需要Data Vault 327 19.3 Data Vault的组成部分 328 19.3.1 中心表 328 19.3.2 链接表 329 19.3.3 附属表 329 19.3.4 Data Vault 特点 331 19.3.5 构建 Data Vault 模型 331 19.4 将Sakila的例子转换成Data Vault 模型 331 19.4.1 Sakila中心表 331 19.4.2 Sakila 链接表 332 19.4.3 Sakila 附属表 333 19.5 加载Data Vault 模型:简单的ETL解决 方案 334 19.5.1 安装Sakila Data Vault 335 19.5.2 安装ETL方案 335 19.5.3 创建一个数据库账户 335 19.5.4 ETL解决方案的例子 335 19.5.5 加载 Data Vault 表 341 19.6 从Data Vault 模型更新数据集市 341 19.6.1 ETL解决方案例子 342 19.6.2 dim_actor 转换 342 19.6.3 dim_customer 转换 343 19.6.4 dim_film 转换 346 19.6.5 dim_film_actor_bridge 转换 347 19.6.6 fact_rental 转换 347 19.6.7 加载星型模型里的所有表 349 19.7 小结 349 第20章 处理复杂数据格式 350 20.1 非关系型和非表格型的数据格式 350 20.2 非结构化的表格型数据 351 20.2.1 处理多值字段 351 20.2.2 处理重复的字段组 352 20.3 半结构化和非结构化数据 353 20.4 键/值对 358 20.5 小结 362 第21章 Web Services 363 21.1 Web 页面和Web Services 363 21.2 数据格式 365 21.2.1 XML 365 21.2.2 HTML 366 21.2.3 JavaScript Object Notation 367 21.3 XML例子 369 21.3.1 XML例子文件 369 21.3.2 从XML中抽取数据 371 21.3.3 生成XML文档 378 21.4 SOAP例子 384 21.4.1 使用“Web服务查询”步骤 385 21.4.2 直接访问 SOAP服务 386 21.5 JSON例子 389 21.5.1 Freebase项目 389 21.5.2 使用Kettle 抽取Freebase数据 392 21.6 RSS 396 21.6.1 RSS结构 396 21.6.2 Kettle对RSS的支持 398 21.7 小结 403 第22章 Kettle集成 404 22.1 Kettle API 404 22.1.1 LGPL协议 404 22.1.2 Kettle Java API 405 22.2 执行存在的转换和作业 406 22.2.1 执行一个转换 406 22.2.2 执行一个作业 407 22.3 应用程序中嵌入Kettle 408 22.3.1 Pentaho 报表 408 22.3.2 把数据放到转换里 410 22.3.3 动态转换 413 22.3.4 动态模板 416 22.3.5 动态作业 416 22.3.6 在Kettle里执行动态ETL 419 22.3.7 Result 419 22.3.8 替换元数据 420 22.4 OEM版本和二次发布版本 421 22.4.1 创建PDI的OEM版本 421 22.4.2 Kettle的二次发布(Forking) 422 22.5 小结 423 第23章 扩展Kettle 424 23.1 插件架构 424 23.1.1 插件类型 425 23.1.2 架构 425 23.1.3 前提 425 23.2 转换步骤插件 428 23.2.1 StepMetaInterface 428 23.2.2 StepDataInterface 434 23.2.3 StepDialogInterface 434 23.2.4 StepInterface 440 23.3 用户自定义 Java 类步骤 444 23.3.1 传递元数据 444 23.3.2 访问输入和字段 445 23.3.3 代码片段 445 23.3.4 例子 445 23.4 作业项插件 446 23.4.1 JobEntryInterface 446 23.4.2 JobEntryDialogInterface 448 23.5 分区插件 448 23.6 资源库插件 450 23.7 数据库类型插件 450 23.8 小结 451 附录A Kettle生态群 452 附录B Kettle 企业版特性 456 附录C 内置的变量和属性参考 457