前言

前言

我们处在一个由数据主导决策的时代。存储成本在降低,网络速度在提升,周围的一切都在变得可以数字化,因此我们会毫不犹疑地下载、存储或与周围的其他人分享各类数据。大约20年前,相机还是一个使用胶片来捕捉图片的设备,每张照片所捕捉的都要是一个近乎完美的镜头,且底片的存储也要小心翼翼,以防损坏。要冲洗这些照片则需要更高的成本。从你按动快门到看到拍摄的图片几乎需要一天的时间。这意味着捕捉下来的信息要少得多,因为上述因素阻碍了人们记录生活的各个瞬间,只有那些被认为重要的时刻才被记录下来。

然而,随着相机的数字化,这种情况得到了改变。我们几乎随时随地都会毫不犹疑地拍照;我们从来不担心存储的问题,因为TB级别(240)的外部磁盘可以提供可靠的备份;我们也很少到哪儿都带着相机,因为可以使用移动设备拍摄照片;我们还有如Instagram这样的应用给照片添加特效并分享这些美图;我们收集关于图片的意见和信息,还会基于这些内容做出决策;我们几乎不放过任何时刻,无论它们重要与否,都会将其存入纪念册中。大数据的时代来临啦!

在商业上,大数据时代也带来了类似的变化。每项商业活动的方方面面都被记录了下来:为提高服务质量,记录下用户在电子商务页面上的所有操作;为进行交叉销售或追加销售,记录下用户买下的所有商品。商家连客户的DNA恨不得都想掌握,因此只要是能得到的客户数据,他们都会想办法得到,并一个一个掐指研究。商家也不会受到数据格式的困扰,无论是语音、图像、自然语言文本,还是结构化数据,他们都会欣然接受。利用这些数据点,他们可以驱使用户做出购买决定,并且为用户提供个性化的体验。数据越多,越能为用户提供更好、更深入的个性化体验。

从某些方面来讲,我们已经准备好接受大数据的挑战了。然而,分析这些数据的工具呢?它们能处理如此庞大、快速、多样化的新数据吗?理论上说,所有数据都可以放到一台机器上,但这样一台机器的成本要多少?它能满足不断变化的负载需求吗?我们知道超级计算机可以做到这一点,但是全世界的超级计算机也就那么几台,而且都不具有伸缩性。替代方案就是构建一组机器、一个集群或者串联的计算单元来完成一项任务。一组使用高速网络互相连接的机器可以提供更好的伸缩性和灵活性,但那还不够。这些集群还要可编程。大量的机器,就像一群人,需要更多的协调和同步。机器的数量越多,集群中出现故障的可能性就越大。如何使用一种简单的方法处理同步和容错,从而减轻程序员的负担呢?答案是使用类似于Hadoop的系统。

Hadoop可以认为是大数据处理的同义词。简单的编程模型,“一次编码,任意部署”,和日益增长的生态圈,使得Hadoop成为一个可供不同技能水平的程序员共同使用的平台。今天,它是数据科学领域首屈一指的求职技能。要去处理和分析大数据,Hadoop成为了理所当然的工具。Hadoop 2.0扩张了它的羽翼,使其能覆盖各种类型的应用模式,并解决更大范围的问题。它很快成为所有数据处理需求的一个通用平台,并将在不久的将来成为各个领域中每个工程师的必备技能。

本书涵盖了对MapReduce、Pig和Hive的优化及其高级特性,同时也展示了如何使用Hadoop 2.0版本扩展Hadoop的能力。

Hadoop 2.0版本的发布使其成为一个通用群机计算平台。本书阐明了为实现这一点而在平台层面所做出的改变,也介绍了对MapReduce作业以及像Pig、Hive这种高级抽象功能进行优化的行业准则,并对一些高级作业模式以及它们的应用进行了讨论。这些论述将帮助Hadoop用户优化已有的应用作业,并将它们迁移到Hadoop 2.0版本。随后,本书深入探讨了Hadoop 2.0的专属特性,如YARN(Yet Another Resource Negotiator)、HDFS联合,并辅以实例。本书后半部分还探讨了使用其他文件系统替换HDFS的问题。只要理解了上述这些问题,Hadoop用户就可以将Hadoop应用扩展到其他的应用模式和存储格式,使集群的资源得到更高效的利用。

这是一本聚焦于Hadoop高级概念和特性的参考书,每一个基本概念都使用代码段或者示意图来解释,而这些概念在章节中出现的顺序则是由数据处理流程的先后决定的。

本书内容

  • 第1章,Hadoop 2.X,讨论Hadoop 2.X版本相比先前的版本做了哪些改进。

  • 第2章,MapReduce进阶,通过举例帮助你理解Hadoop MapReduce的最佳实践和最佳模式。

  • 第3章,Pig进阶,讨论Pig的高级特性,它是一种在Hadoop中编写MapReduce作业的框架。

  • 第4章,Hive进阶,讨论Hadoop MapReduce中一种更高层面的SQL抽象(即Hive)的高级特性。

  • 第5章,序列化和Hadoop I/O,讨论Hadoop的IO能力。这一章着重讨论了Hadoop中序列化和反序列化支持的概念,以及它们存在的必要性;Avro,一种第三方序列化框架;Hadoop中可用的数据压缩编码器;上述组件间的权衡;最后,介绍了Hadoop中的文件格式。

  • 第6章,YARN——其他应用模式进入Hadoop的引路人。讨论Hadoop 2.X中一种新的资源管理器——YARN(另一种资源协调者),以及它如何将其他计算模式引入到Hadoop平台中。

  • 第7章,基于YARN的Storm——Hadoop中的低延时处理,讨论的是一种与MapReduce这样的批量处理系统恰恰相反的计算模型,即让数据流向计算,并对两种不同的模式进行了对比。本章也讨论了Apache Storm的架构以及如何在Storm中开发应用。最后,你将学习如何在Hadoop 2.X中使用YARN来配置Storm。

  • 第8章,云上的Hadoop,讨论云计算的特点,以及云计算服务供应商如何使用Hadoop平台提供服务。此外,还深入探讨了亚马逊的Hadoop服务管理,也就是所谓的Elastic MapReduce(EMR),并研究如何在Hadoop EMR集群中准备并执行作业。

  • 第9章,HDFS替代品,讨论HDFS相对于其他文件系统的优点和缺点。本章还特别关注Hadoop对亚马逊的S3云存储服务的支持。最后,通过实现Hadoop对S3原生文件系统的支持来扩展Hadoop,从而证明Hadoop HDFS的可扩展性。

  • 第10章,HDFS联合,讨论HDFS联合的优点及其架构。同时还讨论在MapReduce环境中HDFS获得成功的核心因素:块布局策略。

  • 第11章,Hadoop安全,聚焦于Hadoop集群的安全方面。安全的主要保障是认证、授权、审计和数据保护。我们会在这些方面一一阐述Hadoop的特点。

  • 第12章,使用Hadoop进行数据分析,讨论更高级的分析流程、机器学习等相关技术,以及它们对Hadoop的支持。本章列举了一个在Hadoop中使用Pig分析文档的例子,以演示数据分析功能。

  • 附录,微软Windows中的Hadoop,探索在Hadoop 2.0版本中微软Windows操作系统对Hadoop的原生支持。本章中,我们将了解Windows是如何原生支持Hadoop的构建和部署的。

阅读准备

在尝试本书中的例子之前,你需要准备以下软件。

  • Java开发工具包(JDK 1.7及以上版本):这是Oracle公司的一个免费软件,它为开发者提供了JRE(Java Runtime Environment)和其他工具。下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

  • 编写Java代码用的集成开发环境:这里使用IntelliJ IDEA来开发例子,但其他的集成开发环境也是可以使用的。IntelliJ IDEA的社区版本可以从这里下载:https://www.jetbrains.com/idea/download/

  • Maven:本书中使用Maven构建例子。Maven可以自动解决依赖,并使用XML文件进行配置。各章中的示例代码可以使用两个简单的Maven命令来构建成一个JAR文件:

    mvn compile
    mvn assembly:single
    
    

    这些命令将代码编译成一个JAR文件,并与依赖的文件一起生成一个联合JAR文件。在构建联合JAR文件时,很关键的一点是要修改pom.xml文件中引用的mainClass为需要执行的类名。

    Hadoop相关的JAR文件可以使用如下命令执行:

    hadoop jar <jar file> args
    
    

    这个命令直接从pom.xml文件中指定的mainClass获取驱动程序。你可以从http://maven.apache.org/download.cgi下载得到Maven。用于构建本书例子的Maven的XML文件模板如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://
    maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>MasteringHadoop</groupId>
      <artifactId>MasteringHadoop</artifactId>
      <version>1.0-SNAPSHOT</version>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
            </configuration>
          </plugin>
          <plugin>
            <version>3.1</version>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>MasteringHadoop.MasteringHadoopTest</mainClass>
                </manifest>
              </archive>
            </configuration>
          </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                <archive>
                  <manifest>
                    <mainClass>MasteringHadoop.MasteringHadoopTest</mainClass>
                  </manifest>
                </archive>
                <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
              </configuration>
        </plugin>
          </plugins>
          <pluginManagement>
            <plugins>
              <!--这个插件的配置只用于保存Eclipse m2e的设置。
                  它对Maven构建没有影响。 -->
              <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                  <lifecycleMappingMetadata>
                    <pluginExecutions>
                      <pluginExecution>
                        <pluginExecutionFilter>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-dependency-plugin</artifactId>
                          <versionRange>[2.1,)</versionRange>
                          <goals>
                            <goal>copy-dependencies</goal>
                          </goals>
                        </pluginExecutionFilter>
                        <action>
                          <ignore />
                        </action>
                      </pluginExecution>
                    </pluginExecutions>
                  </lifecycleMappingMetadata>
                </configuration>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>
      <dependencies>
        <!-- 依赖可以设置在这里 -->
      </dependencies>
    </project>
    
  • Hadoop 2.2.0:试验书中的例子一般需要使用Apache Hadoop。附录详细介绍了在Windows平台下安装单机版Hadoop的方式。对于其他的操作系统,如Linux或Mac,安装步骤也类似甚至更简单,它们可以在如下地址找到:http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/SingleNodeSetup.html

本书读者

这是一本为处于各个阶段的读者所写的书。Hadoop的新手可以用它来升级自己在此技术领域的技能;有经验的人可以增强他们对Hadoop的了解,以解决工作中遇到的具有挑战性的数据处理难题;在工作中使用Hadoop、Pig或者Hive的人可以通过书中的建议提高他们作业运行的速度和效率;喜欢猎奇的大数据专业人士可以通过本书了解Hadoop的扩展领域,掌握它是如何通过融合其他应用模式来扩张自己的领地的,而不是仅限于MapReduce;最后,Hadoop 1.X的用户可以深入了解升级2.X后有哪些不同凡响之处。阅读本书之前,希望读者对Hadoop有一定的了解,但不需要你是这方面的专家。建议你在公司、云平台或者自己的台式机/笔记本上尝试安装Hadoop,以了解一些基本的概念。

排版约定

阅读本书时你会发现不同类别的信息使用了不同的文本样式,下面举例说明其中一些样式,及其表示的含义。

文本中的代码是这样表示的:“FileInputFormat的子类与相关联的类一般作为Hadoop作业的输入。”

代码块的表示方法如下:

return new CombineFileRecordReader<LongWritable, 
Text>((CombineFileSplit) inputSplit, taskAttemptContext, 
MasteringHadoopCombineFileRecordReader.class); 
}

命令行输入和输出的表示方法如下:

14/04/10 07:50:03 INFO input.FileInputFormat: Total input paths to process : 441

新术语和重要的关键字用楷体表示。

 这个图标表示警告或需要特别注意的内容。

 

 这个图标表示提示或者诀窍。

读者反馈

我们非常欢迎读者的反馈。告诉我们你觉得这本书怎么样,以及你喜欢哪部分或不喜欢哪部分。有了读者的反馈,我们才能继续写出真正能让大家充分受益的作品。

如果你想反馈信息,很简单,发送电子邮件至feedback@packtpub.com,并请在邮件的主题中注明书名。

如果你也是某个领域的专家,并且有兴趣编写或者合作出版一本书,请参见我们的作者指南: www.packtpub.com/authors

客户支持

很高兴你能成为本书的读者,而我们也会提供很多东西让你倍感物有所值。

下载示例代码

凡是通过http://www.packtpub.com网站账户购买的Packt书籍,书中的示例代码都可以从网站上下载。如果你是从其他地方购买了本书,也可以访问http://www.packtpub.com/support并注册,我们会将示例代码通过邮件发送给你。

你也可以从我们的GitHub上获取到最新的示例代码:https://github.com/karanth/MasteringHadoop

勘误表

虽然我们会全力确保书中内容的准确性,但错误仍在所难免。如果你在某本书中发现了错误(文字错误或代码错误),而且愿意向我们提交这些错误,我们感激不尽。这样不仅可以消除其他读者的疑虑,也有助于改进后续版本。若想提交你发现的错误,请访问http://www.packtpub.com/submit-errata,在“Errata Submission Form”(提交勘误表单)中选择相应图书,输入勘误详情。勘误通过验证之后将上传到Packt网站,或添加到现有的勘误列表中。若想查看某本书的现有勘误信息,请访问http://www.packtpub.com/support,选择相应的书名。

版权声明

对所有媒体来说,互联网盗版都是一个棘手的问题。Packt很重视版权保护。如果你在互联网上发现我们公司出版物的任何非法复制品,请及时告知我们网址或网站名称,以便我们采取补救措施。

如果发现可疑盗版材料,请通过copyright@packtpub.com联系我们。

你的举报可以帮助我们保护作者权益,也有利于我们不断出版高品质的图书。我们对你深表感激。

疑难解答

如果你对本书的任何内容存有疑问,请发送电子邮件到questions@packtpub.com,我们会尽力解决。

目录

  • 版权声明
  • 推荐序一
  • 推荐序二
  • 译者序
  • 前言
  • 致谢
  • 第 1 章 Hadoop 2.X
  • 第 2 章 MapReduce进阶
  • 第 3 章 Pig进阶
  • 第 4 章 Hive进阶
  • 第 5 章 序列化和Hadoop I/O
  • 第 6 章 YARN——其他应用模式进入Hadoop的引路人
  • 第 7 章 基于YARN的Storm——Hadoop中的低延时处理
  • 第 8 章 云上的Hadoop
  • 第 9 章 HDFS替代品
  • 第 10 章 HDFS联合
  • 第 11 章 Hadoop安全
  • 第 12 章 使用Hadoop进行数据分析
  • 附录 微软Windows中的Hadoop