大数据架构师带你深入Hadoop内幕:源代码环境准备,学这篇就够了

 源代码环境准备

数据!数据!数据!

今天,我们正被数据包围。全球 43 亿部电话、20 亿位互联网用户每秒都在不断地产生大量数据,人们发送短信给朋友、上传视频、用手机拍照、更新社交网站的信息、转发微博、点击广告等,使得机器产生和保留了越来越多的数据。数据的指数级增长对处于市场领导地位的互联网公司,如 Facebook、谷歌、雅虎、亚马逊、腾讯等提出了挑战。它们需要对TB 级别和 PB 级别的数据进行分析处理,以发现哪些网站更受欢迎,哪些商品更具有吸引力,哪些广告更吸引用户。传统的工具对于处理如此规模的数据集越来越无能为力。

现在,Hadoop 应运而生,庞大的信息流有了新的处理平台。

什么是 Hadoop

Hadoop 是 Apache 基金会下的一个开源分布式计算平台,以 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)和 MapReduce 分布式计算框架为核心,为用户提供了底层细节透明的分布式基础设施。HDFS 的高容错性、高伸缩性等优点,允许用户将Hadoop 部署在廉价的硬件上,构建分布式系统 ;MapReduce 分布式计算计算框架则允许用户在不了解分布式系统底层细节的情况下开发并行、分布的应用程序,充分利用大规模的计算资源,解决传统高性能单机无法解决的大数据处理问题。

Apache Hadoop 是目前分析海量数据的首选工具。

Hadoop 简史

谈到 Hadoop 的历史,就不得不提到 Lucene 和 Nutch。Hadoop 开始时是 Nutch 的一个子项目,而 Nutch 又是 Apache Lucene 的子项目。这 3 个项目都是由 Doug Cutting 创立,每个项目在逻辑上都是前一个项目的演进。

Lucene 是引擎开发工具包,提供了一个纯 Java 的高性能全文索引,它可以方便地嵌入各种实际应用中实现全文搜索 / 索引功能。Nutch 项目开始于 2002 年,是以 Lucene 为基础实现的搜索引擎应用。Lucene 为 Nutch 提供了文本搜索和索引的 API,Nutch 不光有搜索功能,还有数据抓取的功能。

但很快,Doug Cutting 和 Mike Calarella(Hadoop 和 Nutch 的另一位创始人)就意识到,他们的架构无法扩展以支持拥有数十亿网页的网络。这个时候,Google 的研究人员在 2003年的 ACM SOSP(Symposium on Operating Systems Principles)会议上发表的描述 Google 分布式文件系统(简称 GFS)的论文及时地为他们提供了帮助。GFS 或类似的系统可以解决他们在网络抓取和索引过程中产生的大量文件存储需求。于是,在 2004 年,他们开始写 GFS

的一个开源实现,即 Nutch 分布式文件系统(NDFS)。

2004 年,在 OSDI(Operating Systems Design and Implementation)会议上,Google 发表了论文,向全世界介绍了 MapReduce。2005 年初,Nutch 的开发者在 Nutch 上有了一个可工作的 MapReduce 应用,到当年的年中,所有主要的 Nutch 算法被迁移到 MapReduce 和NDFS 上。

在 Nutch0.8.0 版本之前,Hadoop 还属于 Nutch 的一部分,而从 Nutch0.8.0 开始,DougCutting 等人将其中实现的 NDFS 和 MapReduce 剥离出来成立了一个新的开源项目,这就是 Hadoop。同时,对比以前的 Nutch 版本,Nutch0.8.0 在架构上有了根本性的变化,它完全构建在 Hadoop 的基础之上了。这个时候,已经是 2006 年 2 月,大约在同一时间,DougCutting 加入雅虎,Yahoo 投入了专门的团队和资源将 Hadoop 发展成一个可在网络上运行的系统。

值得一提的是 Hadoop 名字的来源。

为软件项目命名时,Doug Cutting 似乎总会得到家人的启发。Lucene 是他妻子的中间名,也是她外祖母的名字。他的儿子在咿呀学语时,总把所有用于吃饭的词叫成 Nutch。DougCutting 如此解释 Hadoop 的得名:“这是我的孩子给一头吃饱了的棕黄色大象起的名字。我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子是这方面的高手,Googol 就是由小孩命名的。”

2008 年 1 月,Hadoop 已成为 Apache 顶级项目,证明它是成功的。通过这次机会,Hadoop 成功地被雅虎之外的很多公司应用,如 Facebook、纽约时报等。特别是纽约时报,它使用运行在亚马逊的 EC2 云计算上的 Hadoop,将 4TB 的报纸扫描文档压缩,转换为用于Web 的 PDF 文档,这个过程历时不到 24 小时,使用 100 台机器运行,这成为 Hadoop 一个良好的宣传范例。

2008 年 2 月,雅虎宣布其索引网页的生产系统采用了在 10 000 多个核的 Linux 集群上运行的 Hadoop。Hadoop 真正达到了万维网的规模。2008 年 4 月,在一个 900 节点的Hadoop 集群上,雅虎的研究人员运行 1TB 的 Jim Gray 基准排序,只用了 209 秒,而到了2009 年 4 月,在一个 1400 节点的集群上对 500GB 数据进行排序,只用了 59 秒,这显示了Hadoop 强大的计算能力。

2008 年开始,Hadoop 迈向主流,开始了它的爆发式发展,出现了大量的相关项目,如 2008 年 的 HBase、ZooKeeper 和 Mahout,2009 年 的 Pig、Hive 等。 同 时, 还 出 现 了 像Cloudera(成立于 2008 年)和 Hortonworks(以雅虎的 Hadoop 业务部门为基础成立的公司)这样的专注于 Hadoop 的公司。

经过多年的发展,Hadoop 已经从初出茅庐的小象变身为行业巨人。

Hadoop 的优势

将 Hadoop 运用于海量数据处理,主要有如下几个优势:

❑方便 :Hadoop 可以运行在一般商业机器构成的大型集群上,或者是亚马逊弹性计算云(Amazon EC2)等云计算服务上。

❑弹性 :Hadoop 通过增加集群节点,可以线性地扩展以处理更大的数据集。同时,在集群负载下降时,也可以减少节点,以高效使用计算资源。

❑健壮 :Hadoop 在设计之初,就将故障检测和自动恢复作为一个设计目标,它可以从容处理通用计算平台上出现的硬件失效的情况。

❑简单:Hadoop 允许用户快速编写出高效的并行分布代码。

由 于 Hadoop 具 有 上 述 优 势, 使得 Hadoop 在 学术界和工业界都 受欢 迎。 今 天,Hadoop 已经成为许多公司和大学基础计算平台的一部分。学术界如内布拉斯加大学通过使用 Hadoop,支持紧凑型 m 子螺旋形磁谱仪实验数据的保存和计算 ;加州大学伯克利分校则对 Hadoop 进行研究,以提高其整体性能;在国内,中国科学院计算技术研究所在 Hadoop 上开展了数据挖掘和地理信息处理等的研究。在工业界,Hadoop 已经成为很多互联网公司基础计算平台的一个核心部分,如雅虎、Facebook、腾讯等;传统行业,如传媒、电信、金融,也在使用这个系统,进行数据存储与处理。

如今,Hadoop 分布式计算基础架构这把“大伞”下,已经包含了多个子项目。而海量数据处理也迅速成为许多程序员需要掌握的一项重要技能。

Hadoop 生态系统

经过几年的快速发展,Hadoop 现在已经发展成为包含多个相关项目的软件生态系统。

狭义的 Hadoop 核心只包括 Hadoop Common、Hadoop HDFS 和 Hadoop MapReduce 三个子项目,但和 Hadoop 核心密切相关的,还包括 Avro、ZooKeeper、Hive、Pig 和 HBase 等项目,构建在这些项目之上的,面向具体领域、应用的 Mahout、X-Rime、Crossbow 和 Ivory 等项目,以及 Chukwa、Flume、Sqoop、Oozie 和 Karmasphere 等数据交换、工作流和开发环境这样的外围支撑系统。它们提供了互补性的服务,共同提供了一个海量数据处理的软件生态系统,Hadoop 生态系统如图 1-1 所示。

下面详细介绍生态系统的组成。

1. Hadoop Common

从 Hadoop 0.20 版 本 开 始, 原 来 Hadoop 项 目 的 Core 部 分 更 名 为 Hadoop Common。Common 为 Hadoop 的其他项目提供了一些常用工具,主要包括系统配置工具 Configuration、远程过程调用 RPC、序列化机制和 Hadoop 抽象文件系统 FileSystem 等。它们为在通用硬件上搭建云计算环境提供基本的服务,并为运行在该平台上的软件开发提供了所需的 API。

2. Avro

Avro 由 Doug Cutting 牵头开发,是一个数据序列化系统。类似于其他序列化机制,Avro可以将数据结构或者对象转换成便于存储和传输的格式,其设计目标是用于支持数据密集型应用,适合大规模数据的存储与交换。Avro 提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用 RPC 和简单动态语言集成等功能。

3. ZooKeeper

在分布式系统中如何就某个值(决议)达成一致,是一个十分重要的基础问题。

ZooKeeper 作为一个分布式的服务框架,解决了分布式计算中的一致性问题。在此基础上,ZooKeeper 可用于处理分布式应用中经常遇到的一些数据管理问题,如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。ZooKeeper 常作为其他 Hadoop 相关项目的主要组件,发挥着越来越重要的作用。

4. HDFS

HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是 Hadoop 体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS 简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。

5. MapReduce

MapReduce 是一种计算模型,用以进行大数据量的计算。Hadoop 的 MapReduce 实现,和 Common、HDFS 一起,构成了 Hadoop 发展初期的三个组件。MapReduce 将应用划分为Map 和 Reduce 两个步骤,其中 Map 对数据集上的独立元素进行指定的操作,生成键 - 值对形式中间结果。Reduce 则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce 这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。

6. HBase

Google 发表了 BigTable 系统论文后,开源社区就开始在 HDFS 上构建相应的实现HBase。HBase 是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase 采用了 BigTable 的数据模型 :增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。HBase 提供了对大规模数据的随机、实时读写访问,同时,HBase 中保存的数据可以使用 MapReduce 来处理,它将数据存储和并行计算完美地结合在一起。

7. Hive

Hive 是 Hadoop 中的一个重要子项目,最早由 Facebook 设计,是建立在 Hadoop 基础上的数据仓库架构,它为数据仓库的管理提供了许多功能,包括 :数据 ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。Hive 提供的是一种结构化数据的机制,定义了类似于传统关系数据库中的类 SQL 语言 :Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。

8. Pig

Pig 运行在 Hadoop 上,是对大型数据集进行分析和评估的平台。它简化了使用 Hadoop进行数据分析的要求,提供了一个高层次的、面向领域的抽象语言 :Pig Latin。通过 PigLatin,数据工程师可以将复杂且相互关联的数据分析任务编码为 Pig 操作上的数据流脚本,通过将该脚本转换为 MapReduce 任务链,在 Hadoop 上执行。和 Hive 一样,Pig 降低了对大型数据集进行分析和评估的门槛。

9. Mahout

Mahout 起源于 2008 年,最初是 Apache Lucent 的子项目,它在极短的时间内取得了长足的发展,现在是 Apache 的顶级项目。Mahout 的主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout 现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法。除了算法,Mahout 还包含数据的输入 / 输出工具、与其他存储系统(如数据库、MongoDB 或Cassandra)集成等数据挖掘支持架构。

10. X-RIME

X-RIME 是一个开源的社会网络分析工具,它提供了一套基于 Hadoop 的大规模社会网络 / 复杂网络分析工具包。X-RIME 在 MapReduce 的框架上对十几种社会网络分析算法进行了并行化与分布式化,从而实现了对互联网级大规模社会网络 / 复杂网络的分析。它包括HDFS 存储系统上的一套适合大规模社会网络分析的数据模型、基于 MapReduce 实现的一系列社会网络分析分布式并行算法和 X-RIME 处理模型,即 X-RIME 工具链等三部分。

11. Crossbow

Crossbow 是在 Bowtie 和 SOAPsnp 基础上,结合 Hadoop 的可扩展工具,该工具能够充分利用集群进行生物计算。其中,Bowtie 是一个快速、高效的基因短序列拼接至模板基因组工具;SOAPsnp 则是一个重测序一致性序列建造程序。它们在复杂遗传病和肿瘤易感的基因定位,到群体和进化遗传学研究中发挥着重要的作用。Crossbow 利用了 Hadoop Stream,将Bowtie、SOAPsnp 上的计算任务分布到 Hadoop 集群中,满足了新一代基因测序技术带来的海量数据存储及计算分析要求。

12. Chukwa

Chukwa 是开源的数据收集系统,用于监控大规模分布式系统(2000+ 以上的节点 , 系统每天产生的监控数据量在 T 级别)。它构建在 Hadoop 的 HDFS 和 MapReduce 基础之上,继承了 Hadoop 的可伸缩性和鲁棒性。Chukwa 包含一个强大和灵活的工具集,提供了数据的生成、收集、排序、去重、分析和展示等一系列功能,是 Hadoop 使用者、集群运营人员和管理人员的必备工具。

13. Flume

Flume 是 Cloudera 开发维护的分布式、可靠、高可用的日志收集系统。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume 中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume 数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume 还具有能够将日志写往各种数据目标(可定制)的能力。总的来说,Flume 是一个可扩展、适合复杂环境的海量日志收集系统。

14. Sqoop

Sqoop 是 SQL-to-Hadoop 的缩写,是 Hadoop 的周边工具,它的主要作用是在结构化数据存储与 Hadoop 之间进行数据交换。Sqoop 可以将一个关系型数据库(例如 MySQL、Oracle、PostgreSQL 等)中的数据导入 Hadoop 的 HDFS、Hive 中,也可以将 HDFS、Hive中的数据导入关系型数据库中。Sqoop 充分利用了 Hadoop 的优点,整个数据导入导出过程都是用 MapReduce 实现并行化,同时,该过程中的大部分步骤自动执行,非常方便。

15. Oozie

在 Hadoop 中执行数据处理工作,有时候需要把多个作业连接到一起,才能达到最终目的。针对上述需求,Yahoo 开发了开源工作流引擎 Oozie,用于管理和协调多个运行在Hadoop 平台上的作业。在 Oozie 中,计算作业被抽象为动作,控制流节点则用于构建动作间的依赖关系,它们一起组成一个有向无环的工作流,描述了一项完整的数据处理工作。

Oozie 工作流系统可以提高数据处理流程的柔性,改善 Hadoop 集群的效率,并降低开发和运营人员的工作量。

16. Karmasphere

Karmasphere 包括 Karmasphere Analyst 和 Karmasphere Studio。其中,Analyst 提供了访问保存在 Hadoop 里面的结构化和非结构化数据的能力,用户可以运用 SQL 或其他语言,进行即时查询并做进一步的分析。Studio 则是基于 NetBeans 的 MapReduce 集成开发环境,开发人员可以利用它方便快速地创建基于 Hadoop 的 MapReduce 应用。同时,该工具还提供了一些可视化工具,用于监控任务的执行,显示任务间的输入输出和交互等。需要注意的是,在上面提及的这些项目中,Karmasphere 是唯一不开源的工具。

正是这些项目的发展,带来了廉价的处理大数据的能力,让 Hadoop 成为大数据行业发展背后的驱动力。如今,Hadoop 已成为分布式大数据处理事实上的标准。

准备源代码阅读环境

在研究一个开源项目之前,都需要安装与配置基本的开发环境和源代码的阅读环境。这一系列内容包括:安装与配置 JDK、安装开发调试 IDE、安装与配置相关辅助工具等。

安装与配置 JDK

在分析 Hadoop 的源代码前,需要做一些准备工作,其中搭建 Java 环境是必不可少的。

Hadoop 的运行环境要求 Java 1.6 以上的版本。打开
http://www.oracle.com/technetwork/java/javase/downloads/index.html 页面,可以下载最新的 JDK 安装程序,下载页面如图 1-2 所示

安装完后,要检查 JDK 是否配置正确。

某些第三方的程序会把自己的 JDK 路径加到系统 PATH 环境变量中,这样,即便安装最新版本的 JDK,系统还是会使用第三方程序所带的 JDK。在 Windows 环境中,需要正确配置的 Java 运行时环境变量有 JAVA_HOME、CLASSPATH 和 PATH 等。

方便起见,我们往往为操作系统本身指定一个系统级别的环境变量。例如,Windows 平台上的系统环境变量可以在“系统属性”的“高级”选项卡中找到,可在其中配置 JAVA_HOME、PATH 和 CLASSPATH 值。 图 1-3 是 Windows XP 操作系统中为系 统添加 JAVA_HOME 环境变量的例子。

安装并配置完成后,可以在命令行窗口中输入“java -version”命令检测当前的 JDK 运行版本。如果配置完全正确,会显示当前客户端的 JRE 运行版本,如图 1-4 所示。

安装 Eclipse

在 成 功 安 装 和 配 置 JDK 后, 还 需 要 安 装 进 行 Java 开 发 调 试 的 IDE(IntegratedDevelopment Environment,集成开发环境),因为一个好的开发环境和源代码阅读环境可以使工作效率事半功倍。目前比较常用的 Java 开发 IDE 主要有 Eclipse 和 NetBeans 等,读者可以任意选择自己习惯的 IDE 作为开发工具。本书以 Eclipse 集成开发环境为例,着重介绍在 Eclipse 中开发与调试源码的方法。读者也可以举一反三,在其他 IDE 中做相应的尝试。

Eclipse 是一个界面友好的开源 IDE,并支持成千上万种不同的插件,为代码分析和源码调试提供了极大的便利。可以在 Eclipse 官方网站(
http://www.eclipse.org/downloads/)找到 Eclipse 的各个版本(对 Hadoop 源码进行分析,只需要下载 Eclipse IDE for Java SEDevelopers)并下载安装。Eclipse 下载页面如图 1-5 所示。Eclipse 是基于 Java 的绿色软件,解压下载得到 ZIP 包后就能直接使用。关于 Eclipse 的基本使用已超出了本书的范围,因此下面仅向读者简要介绍如何使用 Eclipse 进行一些基本的源代码分析工作。

1. 定位某个类、方法和属性

在分析源代码的过程中,有时候需要快速定位光标位置的某个类、方法和属性,在Eclipse 中可通过按 F3 键,方便地查看类、方法和变量的声明和定义的源代码。

有时候在查看一些在 JDK 库中声明 / 定义的类、方法和变量的源代码时,打开的却是相应的 CLASS 文件(字节码),为此 Eclipse 提供了一个功能,把字节码和源代码关联起来,这样,就可以查看(提供源代码)第三方库的实现了。

Eclipse 打开字节码文件时,可以单击“Attach Source”按钮进行字节码和源代码关联,如图 1-6 所示。

在查看 java.net.URL 时,Eclipse 提示代码关联,将 JDK 中附带的 JDK 源文件压缩包(在安装目录下可以找到,名字是“src.zip”)绑定到“rt.jar”,以后,只要访问该 JAR 包中的字节码文件,Eclipse 就会自动显示相应的源代码文件。

其他第三方 Java 插件的源代码文件的载入方法类似。

2. 根据类名查找相应的类

如果知道希望在编辑器中打开的 Java 类的名称,则找到并打开它的最简单的方法是使用快捷键 Ctrl+Shift+T(或者单击 Navigate → Open Type)打开 Open Type 窗口,在该窗口中输入名称,Eclipse 将显示可以找到的匹配类型列表。图 1-7 显示了 Hadoop 1.0 中名字包含“HDFS”的所有类。

3. 查看类的继承结构

Java 是面向对象的程序设计语言,继承是面向对象的三大特性之一,了解类、接口在继承关系上的位置,可以更好地了解代码的工作原理。选中某个类并使用 Ctrl + T 快捷键(或单击 Navigate → Quick Type Hierarchy)可以显示类型层次结构。

层次结构将显示所选元素的子类型。如图 1-8 所示,该列表显示已知的所有
org.apache.hadoop.fs.FileSystem 子类。

4. 分析 Java 方法的调用关系

在 Eclipse 中可以分析 Java 方法的调用关系,具体做法如下 :在代码区中选择相应的方法定义,然后用鼠标右键选取 Open Call Hierarchy 项或者使用快捷键 Ctrl+Alt+H,则可以在Call Hierarchy 视图中看到方法的调用关系,该视图还提供了一层一层的方法调用追溯功能,对查找方法的相互调用关系非常有用,如图 1-9 所示。

安装辅助工具 Ant

在安装和配置了 JDK 和 Eclipse 后,为了编译 Hadoop,还需要安装辅助工具 Ant。

对 Hadoop 这样复杂的项目进行构建,不是仅仅将 Java 源文件编译并打包这么简单,项目中使用到的各种资源都需要得到合理的安排,如有些文件需要拷贝到指定位置,有些类需要放入某个 JAR 归档文件,而另外一些类则需要放入另外一个 JAR 归档文件等,这些工作如果全部由手工执行,项目的构建部署将会变得非常困难,而且难免出错。Ant 是针对这些问题推出的构建工具,在 Java 的项目中得到了最广泛的使用。

Ant 跨平台、可扩展,而且运行高效,使用 Ant,开发人员只需要编写一个基于 XML 的配置文件(文件名一般为 build.xml),定义各种构建任务,如复制文件、编译 Java 源文件、打包 JAR 归档文件等,以及这些构建任务间的依赖关系,如构建任务“打包 JAR 归档文件”需要依赖另外一个构建任务“编译 Java 源文件”。Ant 会根据这个文件中的依赖关系和构建任务,对项目进行构建、打包甚至部署。

和 Hadoop 一 样,Ant 也 是 Apache 基 金 会 支 持 的 项 目, 可 以 在 http://ant.apache.org/

bindownload.cgi 下载,下载页面如图 1-10 所示。

和 Eclipse 类似,Ant 也是绿色软件,不需要安装,解压缩下载的文件后需要做一些配置,用户需要添加环境变量 ANT_HOME(指向 Ant 的根目录),并修改环境变量 PATH(在Windows 环境下,添加 %ANT_HOME%\bin 到 PATH 中)。安装并配置完成后,可以在命令行窗口中输入“ant -version”命令来检测 Ant 是否被正确设置。

Hadoop 的 Ant 还使用了一个工具:Apache Ivy,它是 Ant 的一个子项目,用于管理项目的外部构建依赖项。外部构建依赖项是指软件开发项目的构建需要依靠来自其他项目的源代码或 JAR 归档文件,例如,Hadoop 项目就依靠 log4j 作为日志记录工具,这些外部依赖项使得构建软件变得复杂。对于小项目而言,一种简单可行的方法是将其依赖的全部项目(JAR文件)放入一个目录(一般是 lib)中,但当项目变得庞大以后,这种方式就会显得很笨拙。

Apache 的另外一个构建工具 Maven 中,引入了 JAR 文件公共存储库的概念,通过外部依赖项声明和公开的公共存储库(通过 HTTP 协议)访问,自动查找外部依赖项并下载,以满足构建时的依赖需要。

Ivy 提供了 Ant 环境下最一致、可重复、易于维护的方法,来管理项目的所有构建依赖项。和 Ant 类似,Ivy 也需要开发人员编写一个 XML 形式的配置文件(一般文件名为 ivy.xml),列举项目的所有依赖项 ;另外还要编写一个 ivysettings.xml 文件(可以随意为此文件命名),用于配置下载依赖关系的 JAR 文件的存储库。通过 Ant 的两个 Ivy 任务 ivy:settings和 ivy:retrieve,就可以自动查找依赖项并下载对应的 JAR 文件。

安装类 UNIX Shell 环境 Cygwin

对于在 Windows 上工作的读者,还需要准备类 UNIX Shell 环境的 Cygwin。

Cygwin 是用于 Windows 的类 UNIX Shell 环境,由两个组件组成 :UNIX API 库(它模拟UNIX 操作系统提供的许多特性),以及在此基础上的 Bash Shell 改写版本和许多 UNIX实用程序,它们一起提供了大家熟悉的 UNIX 命令行界面。

Cygwin 的安装程序 setup.exe 是一个标准的 Windows 程序,通过它可以安装或重新安装软件,以及添加、修改或升级 Cygwin 组件。其下载页面为
http://cygwin.com/index.html,如图 1-11 所示。

执行安装程序 setup.exe,并在安装程序的步骤 4(Cygwin Setup – Select Package)中选择 UNIX 的在线编辑器 sed,如图 1-12 所示(可以利用 Search 输入框快速找到 sed)。

在安装 sed 时,setup.exe 会自动安装它依赖的包。在 Cygwin 中,可用的包超过 1000 个,所以只需选择需要的类别和包,以后随时可以通过再次运行 setup.exe,添加整个类别或单独的包。在 Windows 下构建 Hadoop,只需要文本处理工具 sed。

安装完成后,使用 Start 菜单或双击 Cygwin 图标启动 Cygwin。可以在 Shell 环境中执行“ant -version | sed "s/version/Version/g"”命令验证 Cygwin 环境,如图 1-13 所示。

准备 Hadoop 源代码

在 Hadoop 的官方网站(http://hadoop.apache.org/)中,可以找到 Hadoop 项目相关的信息,如图 1-14 所示。

下载 Hadoop

前面在介绍 Hadoop 生态系统的时候,已经了解到 Hadoop 发展初期的系统中包括Common( 开 始使用的名 称 是 Core)、HDFS 和 MapReduce 三 部 分, 现 在 这些子系统都已 经 独 立, 成 为 Apache 的 子 项 目。 但 在 Hadoop 1.0 的 发 行 包 中,Common、HDFS 和MapReduce 还 是 打 包 在 一 起, 我 们 只 需 要 下 载 一 个 hadoop-1.0.0.tar.gz 包 即 可。 注 意,Hadoop 官方也提供 Subversion(SVN)方式的代码下载,SVN 地址为
http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.1.0/。

熟悉 Subversion 的读者,也可以通过该地址下载 Hadoop1.0 版本代码,该 Tag 也包含了上述三部分的代码。

Apache 提供了大量镜像网站,供大家下载它的软件和源码,上面提到的 hadoop-1.0.0.tar.gz 的 一 个 下 载 地 址 为
http://apache.etoak.com/hadoop/common/hadoop-1.0.0,如图 1-15 所示。

该地址包含了 Hadoop 1.0 的多种发行方式,如 64 位系统上的 hadoop-1.0.0-1.adm64.rpm、不包含源代码的发行包 hadoop-1.0.0.bin.tar.gz 等。下载的 hadoop-1.0.0.tar.gz 是包括源代码的 Hadoop 发行包。

创建 Eclipse 项目

解压下载的 hadoop-1.0.0.tar.gz 包,假设解压后 Hadoop 的根目录是 E:\hadoop-1.0.0,启动 Cygwin,进入项目的根目录,我们开始将代码导入 Eclipse。Hadoop 的 Ant 配置文件build.xml 中提供了 eclipse 任务,该任务可以为 Hadoop 代码生成 Eclipse 项目文件,免去创建 Eclipse 项目所需的大量配置工作。只需在 Cygwin 下简单地执行“ant eclipse”命令即可,如图 1-16 所示。

命令运行结束后,就可以在 Eclipse 中创建项目了。打开 Eclipse 的 File → New → JavaProject,创建一个新的 Java 项目,选择项目的位置为 Hadoop 的根目录,即 E:\hadoop-1.0.0,然后单击“Finish”按钮,就完成了 Eclipse 项目的创建,如图 1-17 所示。

完成上述工作以后,Eclipse 提示一个错误 :“Unbound classpath variable: 'ANT_HOME/lib/ant.jar' in project 'hadoop-1.0.0'”。

显然,我们需要设置系统的 ANT_HOME 变量,让 Eclipse 能够找到编译源码需要的Ant 库,选中项目,然后打开 Eclipse 的 Project → Properties → Java Build Path,在 Libraries页编辑(单击“Edit”按钮)出错的项:ANT_HOME/lib/ant.jar,创建变量 ANT_HOME(在接下来第一个对话框里单击“Varliable”,第二个对话框里单击“New”按钮),其值为 Ant的安装目录,如图 1-18 所示。

由于本书只分析 Common 和 HDFS 两个模块,在 Project → Properties → Java Build Path的 Source 页只保留两个目录,分别是 core 和 hdfs,如图 1-19 所示。

完成上述操作以后,创建 Eclipse 项目的任务就完成了。

Hadoop 源代码组织

打开已经解压的 Hadoop 1.0 源代码,进入 src 目录,该目录包含了 Hadoop 中所有的代码,如图 1-20 所示。

前面已经提到过,Hadoop 1.0 的发行包中,Common、HDFS 和 MapReduce 三个模块还是打包在一起的,它们的实现分别位于 core、hdfs 和 mapred 子目录下。源代码目录 src 下还有若干值得关注的子目录,具体如下。

❑tools :包含 Hadoop 的一些实用工具的实现,如存档文件 har、分布式拷贝工具distcp、MapReduce 执行情况分析工具 rumen 等。

❑benchmarks :包含对 Hadoop 进行性能测试的两个工具 gridmix 和 gridmix2,通过这些工具,可以测试 Hadoop 集群的一些性能指标。

❑c++:需要提及的是 libhdfs,它通过 Java 的 C 语言库界面,实现了一套访问 HDFS 的C 接口。

❑examples : 为 开 发 人 员 提 供 了 一 些 使 用 Hadoop 的 例 子, 不 过 这 些 例 子 只 涉 及MapReduce 的 API,本书中不会讨论这部分内容。

❑contrib :是 contribution 的缩写,包含大量 Hadoop 辅助模块的实现,如在亚马逊弹性计算云上部署、运行 Hadoop 所需的脚本就在 contrib\ec2 目录下。

❑test :包含项目的单元测试用例,在该目录中能找到 Common、HDFS 和 MapReduce等模块的单元测试代码。

小结

大数据以及相关的概念、技术是业界和学界最近关注的热点内容,Hadoop 在其中扮演了十分重要的角色。本节首先对 Hadoop 进行了简单的介绍,展示了蓬勃发展的 Hadoop 生态系统和 Hadoop 的简单历史。并在此基础上,向读者介绍了阅读分析 Hadoop 所必需的开发环境的搭建过程,包括:安装与配置 JDK、安装与配置 Eclipse、安装与配置辅助工具的工作。最后,在上述环境中,从零开始建立了一个包含 Hadoop Common 和 HDFS 的源码环境,为进一步学习 Hadoop 源代码做好准备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值