前言
毫不夸张地说,在数据管理和数据处理领域,Apache Hadoop 带来了革命性的进展。Hadoop 的技术能力,使得许多行业中的组织能够解决以往技术不可能解决的问题。这些能力包括:
大规模数据的高扩展性处理;
不管什么格式和结构(或者缺少结构)的数据,都可灵活地处理。
Hadoop 另外一个值得注意的特点在于,它是一个意在相对廉价的商用硬件上运行的开源项目。相对于传统的数据管理解决方案来讲,Hadoop 在可以接受的成本范围内,提供了高扩展性和灵活性。
强大的技术能力,加上较低的经济成本,使得 Hadoop 及其生态系统中的诸多工具快速发展。而且,活跃的 Hadoop 社区也引入了大量支持 Hadoop 数据管理和处理的工具和组件。
尽管发展迅速,Hadoop 仍是一项相对年轻的技术。许多组织仍在尝试了解如何使用 Hadoop 来解决问题,以及如何将 Hadoop 及相关工具应用到真实场景中来形成解决方案。Hadoop 生态系统包含许多工具、应用编程接口(Application Programming Interface,API)及开发选项,这为开发人员提供了更多的选择余地和更大的灵活性,但也使得选择最佳的工具来实现数据处理应用成为了一项挑战。
我们在与大量客户协作的过程中,在与想要了解如何构建可靠、高扩展的 Hadoop 应用的 Hadoop 用户交流的过程中,积累了一些经验,受此启发编写了本书。本书目标并非为现存的工具提供详尽的文档描述,而是在基于 Hadoop 使用这些工具建设可扩展和可维护的应用架构方面,提供指引。
我们假定本书读者对 Hadoop 及相关工具有一定的经验。读者应熟悉 Hadoop 的核心组件,如 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)及 MapReduce。关于 Hadoop 及其核心概念,可参见 Tom White 的《Hadoop 权威指南》,这本书的确文如其名。
下面介绍本书中涉及的一系列比较重要的工具和技术,包括扩展阅读的参考资料。
YARN
直到不久前,Hadoop 的核心组件通常被认为是 HDFS 和 MapReduce。随着 Hadoop 中一个处理框架的引入,这种情况迅速发生了改变。由于 YARN 的引入,Hadoop 快速转型成为一个支持多种并行处理模型的大数据平台。YARN 为 Hadoop 数据处理提供了通用的资源管理器和调度器,不仅包括 MapReduce,还支持其他的数据处理模型。这使得在单个 Hadoop 集群上可以支持多个处理框架和多样的工作负载,并使得这些不同的模型和负载可以有效地共享资源。关于 YARN,欲了解更多,可参见《Hadoop 权威指南》或 Apache YARN 官方文档(http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html)。
Java
Hadoop 和与之相关的许多工具都是使用 Java 语言编写的,并且许多基于 Hadoop 的应用开发也是使用 Java 语言。虽然面向非 Java 开发者的工具和概念不断涌现,但是对于使用 Hadoop 的用户来讲,了解 Java 仍然是弥足轻重的。
SQL
虽然 Hadoop 为数据打开了多种处理框架之门,但 SQL 仍然是 Hadoop 数据查询的常用接口。这是因为大量的开发人员和分析人员熟悉 SQL,所以使用 Hadoop 时了解如何写 SQL 仍然是很有意义的。关于 SQL 的介绍,可以参考 Lynn Beighley 编写的 Head First SQL。
Scala
Scala 是一种在 Java 虚拟机(Java Virtual Machine,JVM)上运行的编程语言,它支持面向对象编程和函数式编程模型。虽然 Scala 是面向通用场景的编程语言,但是它已成为大数据领域越来越流行的语言了。无论是在与 Hadoop 交互的项目实现中,还是处理数据的应用开发中,皆是如此。使用 Scala 作为基础实现语言的项目如 Apache Spark 和 Apache Kafka。因此,基于 Spark 的应用开发也支持使用 Scala。在本书中,许多示例也是使用 Scala 编写的。如果需要了解 Scala,可参见 Cay S. Horstmann 所著的《快学 Scala》;若想深入了解,请参考 Dean Wampler 和 Alex Payne 合著的《Scala 程序设计(第 2 版)》1。
Apache Hive
提到 SQL,不得不提 Hive,它是一个用于 Hadoop 数据处理和数据建模的非常流行的工具,提供 HDFS 上数据的结构化定义,及数据的类 SQL 查询功能。Hive 项目中包含有一个元数据存储,它不仅以 Hive 的数据结构来存储元数据信息(就是描述数据的数据),还可供其他组件访问,如 Apache Pig(一个更高一层的并行编程抽象)和 MapReduce,其中后者需要借助 HCatalog 组件。另外,其他开源项目——如 Cloudera Impala,一个 Hadoop 之上的低延迟查询引擎——也可以使用 Hive 的元数据存储服务,该服务可以提供对 Hive 中预先定义的对象的访问。关于 Hive,欲了解更多,请参见 Hive 网站(https://hive.apache.org/)、《Hadoop 权威指南》,或 Edward Capriolo 等人所著的《Hive 编程指南》。
Apache HBase
HBase 是 Hadoop 生态圈中另外一个频繁使用的组件。它是一个分布式 NoSQL 数据存储,提供 HDFS 上超大规模数据集的随机访问。虽然被称为 Hadoop 数据库,但 HBase 与关系型数据库截然不同,熟悉传统关系型数据库系统的人要想了解 HBase,需接受新的概念。HBase 是许多 Hadoop 架构中的一个核心组件,本书中多有涉及。欲了解更多有关 HBase 的内容,可参考 HBase 网站(https://hbase.apache.org/)、Edward Capriolo 所著的《HBase 权威指南》,或 Nick Dimiduk 和 Amandeep Khurana 合著的《HBase 实战》。
Apache Flume
Flume 是一个常用的数据采集工具,将基于事件的数据(如日志)转存至 Hadoop。我们就 Flume 的最佳实践和部署架构进行了整体总结和细节描述。关于 Flume 的更多细节,可参见 Flume 文档(http://flume.apache.org/documentation.html),或《Flume:构建高可用、可扩展的海量日志采集系统》。
Apache Sqoop
Sqoop 是 Hadoop 生态圈中另外一个流行的工具,它用来在外部数据存储(如关系型数据库)与 Hadoop 之间进行数据移动。我们会讨论 Sqoop 的最佳实践,以及在 Hadoop 架构中它的最佳位置。关于 Sqoop 的更多细节,可参见 Sqoop 文档(http://sqoop.apache.org/docs/1.4.5/index.html),或 Apache Sqoop Cookbook(O'Reilly)。
Apache ZooKeeper
恰如其名的 ZooKeeper 项目旨在提供一个集中化的服务,用来保障 Hadoop 生态圈中各个项目间的协同工作。本书中提及的大量组件,如 HBase,就依赖于 ZooKeeper 提供的服务,所以对 Zookeeper 有基本的了解是有益处的。参考 ZooKeeper 网站(http://zookeeper.apache.org),或 Flavio Junqueira 和 Benjamin Reed 合著的《ZooKeeper:分布式过程协同技术详解》。
1本书已由人民邮电出版社出版。——编者注
由此可见,本书的重点在于 Hadoop 生态圈中的开源工具。值得注意的是,很多传统企业级软件厂家提供了对 Hadoop 的支持,或者处于添加支持的过程中。如果你所在的公司已经使用了这样的企业级工具,那么尝试将这类工具集成到你的 Hadoop 应用开发环境中是大有裨益的。毕竟完成一项任务最好的工具是先前已经熟悉的工具。虽然了解本书中提及的工具,了解它们是如何集成到 Hadoop 中实现应用的,这些都是有意义的,不过在你的环境中选择使用第三方工具也是一个不错的选择。
重申一下,本书的目标不是介绍具体如何使用各种工具,而是讲述什么时候和为什么使用这样那样的工具,同时介绍最佳实践,以及最佳实践适用时的建议和不适用时的调整方法。我们希望本书能够对你构建成功的 Hadoop 解决方案有所帮助。
示例代码
就本书中的示例代码简单声明如下。我们尽量保证本书中的示例是最新的,并确保其正确性。获取最新版本示例代码,请访问本书的 GitHub 地址:https://github.com/hadooparchitecturebook/hadoop-arch-book。
目标读者
本书面向软件开发人员、架构师及项目主管等,满足大家了解 Apache Hadoop 及生态圈中工具的使用方法、建设端到端数据管理方案、集成 Hadoop 到已有数据管理架构等需求。我们的目标并不是深入研究特定的技术,比如 MapReduce,因为已有其他相关的参考资料。我们的目标是:介绍如何高效地集成 Hadoop 生态圈中的组件,以形成一个从原始数据开始直到数据消费掉的完整数据流水线,以及如何将 Hadoop 集成到已有的数据管理系统之中。
我们假定读者对 Hadoop 及相关工具(如 Flume、Sqoop、HBase、Pig 及 Hive 等)有所了解,但我们也提供了合适的参考资料作为补充内容。我们假定读者拥有 Java 编程经验,以及 SQL 和传统数据管理系统(如关系型数据库管理系统)的使用经验。
如果你是一名拥有 Hadoop 背景的技术专家,想要寻求架构或完整方案设计方面的最佳实践或者示例,那么本书再合适不过了。即使你是一名 Hadoop 专家,我们认为本书基于我们使用 Hadoop 的多年经验,包含了许多指引和最佳实践,仍然会让你有所受益。
通过本书,管理人员可基于实际的目标和项目情况,了解何种技术适用,从而为开发者选择合适的培训。
写作目的
多年以来,我们使用 Hadoop 构建大数据解决方案,无论是作为用户还是做客户支持,积累了一些经验。同时,Hadoop 市场也迅速成熟起来,关于深入了解 Hadoop 这一题材的资料也大量涌现。关于 Hadoop 及生态圈的相关工具,有大量的书籍、网站、课程等。尽管有如此多的资料,但在“有效集成这些工具以形成完整的解决方案”这一主题上,相关资源仍显不足。
与用户沟通时,无论这些用户是我们的客户、合作伙伴,还是与会人员,我们发现了一个共同的现象:在“对 Hadoop 有所了解”与“能够使用 Hadoop 解决实际问题”之间存在着巨大的鸿沟。举例来说,市面上有大量不错的资料可以帮助你了解 Apache Flume,但是如何判断这个工具是否适合你的用例呢?而且,一旦确定选择了 Flume 作为解决方案,怎样才能把它高效地集成到架构中呢?为了高效地使用 Flume,需要知道哪些最佳实践,以及需要做出哪些考量?
本书的目的就是缩小“对 Hadoop 有所了解”与“能够使用 Hadoop 形成实际解决方案”之间的差距。书中会介绍利用 Hadoop 实现解决方案时需要考虑的核心内容,并针对几个常见的用案提供完整的、端到端的解决方案示例。
本书结构
本书内容是按照在 Hadoop 上搭建解决方案的流程组织的,首先是 Hadoop 上的数据建模,接下来是将数据导入和导出 Hadoop,以及数据落地到 Hadoop 之后的数据处理,等等。当然,读者可以按照实际需求跳过部分内容。第一部分主要涵盖了使用 Hadoop 创建应用程序时需要考虑的问题,包括以下几章。
第 1 章的内容是 Hadoop 中的数据存储和数据建模,例如文件格式、数据组织及元数据管理。
第 2 章的内容是 Hadoop 上的数据导入和导出。这一章将会讨论数据采集和抽取时需要考虑的问题和模式,包括常见工具的使用,如 Flume、Sqoop 和文件传输。
第 3 章介绍 Hadoop 上访问和处理数据的工具和模式。我们会在这一章讨论常见的数据处理框架,如 MapReduce、Spark、Hive 和 Impala,以及各自适合的应用场景。
第 4 章通过讲述 Hadoop 上一些常见用例的实现方案来继续讨论数据处理框架。我们会使用 Spark 和 SQL 实现具体的例子,来阐释如何解决常见问题,比如数据去重和时间序列数据的处理。
第 5 章主要讨论在 Hadoop 上处理海量图数据的工具,如 Giraph 和 GraphX。
第 6 章讨论将各种过程与应用协调和调度工具(如 Apache Oozie)整合在一起。
第 7 章讨论 Hadoop 上的近实时处理。我们在这里会讨论相对较新的流式数据处理工具,如 Apache Storm 和 Apache Spark Streaming。
在第二部分中,我们将会在 Hadoop 上端到端地实现一些常见的应用程序。这几章的目的在于提供翔实的案例,讲述如何使用第一部分中提到的各个组件,来实现一个基于 Hadoop 的完整解决方案。
第 8 章介绍了一个基于 Hadoop 的点击流分析的示例。对于运行大型网站的公司来讲,点击流数据的存储和处理是一个非常常见的用例。它也适用于处理任何机器数据的应用。这一章中,我们会讨论使用 Flume 和 Kafka 这样的工具进行数据采集,讨论如何高效地存储和组织数据,并展示处理数据的示例。
第 9 章介绍了一个基于 Hadoop 的欺诈检测应用的示例,这是 Hadoop 一个日益常用的应用场景。这一示例将会涵盖在欺诈检测的解决方案中如何使用 HBase,以及如何使用近实时处理。
第 10 章的案例研究探索的是另外一个常见用例:使用 Hadoop 扩展已有的企业级数据仓库(Enterprise Data Warehouse,EDW)环境。这包括将 Hadoop 作为 EDW 的补充,并提供传统数据仓库的基本功能。
排版约定
本书使用了下列排版约定。
楷体
表示新术语。
等宽字体(
Constant width
)表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体(
Constant width bold
)表示应该由用户输入的命令或其他文本。
等宽斜体(
Constant width italic
)表示应该由用户输入的值或根据上下文确定的值替换的文本。
该图标表示提示、建议或一般注记。
该图标表示警告或警示。
使用代码示例
补充材料(代码示例、练习等)可以从 https://github.com/hadooparchitecturebook/hadoop-arch-book 下载。
本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发 O'Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和 ISBN。比如:“Hadoop Application Architectures by Mark Grover, Ted Malaska, Jonathan Seidman, and Gwen Shapira (O'Reilly). Copyright 2015 Jonathan Seidman, Gwen Shapira, Ted Malaska, and Mark Grover, 978-1-491-90008-6”。
如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过 permissions@ oreilly.com 与我们联系。
Safari® Books Online
Safari Books Online(http://www.safaribooksonline.com)是应运而生的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。技术专家、软件开发人员、Web 设计师、商务人士和创意专家等,在开展调研、解决问题、学习和认证培训时,都将 Safari Books Online 视作获取资料的首选渠道。
对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问 O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、 Jones & Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解 Safari Books Online 的更多信息,我们网上见。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室(100035)
奥莱利技术咨询(北京)有限公司
O'Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://shop.oreilly.com/product/0636920033196.do
对于本书的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com
要了解更多 O'Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
我们在 Facebook 的地址如下:http://facebook.com/oreilly
请关注我们的 Twitter 动态:http://twitter.com/oreillymedia
我们的 YouTube 视频地址如下:http://www.youtube.com/oreillymedia
致谢
我们非常感谢庞大的 Apache 社区,它们为 Hadoop 及其生态圈作出了很大的努力,否则本书将不可能存在。我们也非常感谢 Doug Cutting 先生为本书作序,更不用提他为 Hadoop 付出的一切。
有一大批人,他们的支持和努力使出版本书成为可能,首先是 Eric Sammer。Eric 一开始的支持和鼓励才使得本书成为现实。还有 Amandeep Khurana、Kathleen Ting、Patrick Angeles 以及 Joey Echeverria,他们都为本书早期的编写提供了珍贵的建议和反馈。
还有许多人在编写本书的过程中提供了珍贵的反馈和支持,尤其是那些花费时间和精力来审阅本书的人,他们是:Azhar Abubacker、Sean Allen、Ryan Blue、Ed Capriolo、Eric Driscoll、Lars George、Jeff Holoman、Robert Kanter、James Kinley、Alex Moundalexis、Mac Noland、Sean Owen、Mike Percy、Joe Prosser、Jairam Ranganathan、Jun Rao、Hari Shreedharan、Jeff Shmain、Ronan Stokes、Daniel Templeton、Tom Wheeler。
Andre Araujo、Alex Ding 和 Michael Ernest 为代码示例的测试验证,慷慨地贡献了许多时间。Akshat Das 在绘图和网站方面提供了许多帮助。
有许多审稿人帮助我们审阅,极大地提高了本书的质量。如果仍存在错误,我们全权负责。
我们要感谢 Cloudera 的管理层,让我们得以编写本书。我们尤其要感谢 Mike Olson,感谢他持续不断的鼓励和支持。
我们要感谢 O'Reilly 出版社的编辑 Brian Anderson 以及制作编辑 Nicole Shelby,感谢他们在本书出版过程中的帮助与努力。另外,我们还要感谢 O'Reilly 内外的许多人——Ann Spencer、Courtney Nash、Rebecca Demarest、Rachel Monaghan 和 Ben Lorica,他们在本书不同的阶段帮助过我们。
最后,对没有一一列出的帮助过我们的朋友,我们表示歉意。
Mark Grover的致谢
首先我要感谢我的父母,Neelam 和 Parnesh Grover。是你们给了我每天如沐春风般的爱和支持。还要感谢我的妹妹 Tracy Grover,那个让我欺负、关爱、赞美的姑娘,感谢你的陪伴。感谢 Cloudera 公司的前主管 Arun Singla 和主管 Ashok Seetharaman,感谢你们对本书一如既往的支持。特别感谢 Paco Nathan 和 Ed Capriolo,是你们鼓励我写下了这本书。
Ted Malaska的致谢
我要感谢我的妻子 Karen,以及我最爱的两个讨厌鬼,TJ 和 Andrew。
Jonathan Seidman的致谢
我要感谢我生命中最重要的三个人,Tanya、Ariel 和 Madeleine,感谢他们在本书长久的写作过程中的耐心、关爱和支持。还要感谢本书的合著者,我的好伙伴 Mark、Gwen 和 Ted。最后,我把这本书献给已逝的父母,Aaron 和 Frances Seidman。
Gwen Shapira的致谢
我要感谢我的丈夫 Omer Shapira,感谢几个月来我写书时他给予我的精神上的支持和耐心。感谢我的父亲 Lior Shapira,也是我的金牌推销员,告诉他所有的朋友有这样一本“大数据书”。尤其是要感谢我的主管 Jarek Jarcec,感谢他的支持;感谢我的团队,大家去年为我分担了好多工作。