HDFS联邦管理,该管理将HDFS的命名空间分散到多个 namenode中以支持包含有大规模数据文件的集群。详情请参见 3.2.3节。 HDFS的高可用性,针对系统崩遗而启用备用的namenode来避免 namenode的单点故障问题。详情参见3.2.4节。 表I-2只包含HDFS和MapReduce的一些特性。Hadoop生态系统中其他一 些项目也在不断演化中,同时在这些项目中选出一部分组件联合使用具有 一 定的挑战。幸运的是,现在我们不需要亲自做这些配置了。Apache Bigtop项目(http:/incubator.apache.org/bigtop对Hadoop组件的软件栈进行 了内部测试并提供Linux安装包(RPM和Debian安装包)。同时,也有一些 厂商提供兼容套件的Hadoop版本。 表1-2.Hadoop发行版本系列支持的特性 特性 1.x 0.22 2.× 安全认证 是 否 是 旧的配置名称 是 弃用 弃用 新的配置名称 否 是 是 I旧的MapReduce API 是 是 是 新的MapReduce API 是(加入部分缺失类库) 是 是 MapReduce I运行环境(经典) 是 是 否 MapReduce2运行环境(YARN) 否 否 是 HDFS联邦管理 否 否 是 HDFS高可用 否 否 是 1.6.1本书包含的内容 本书包含表1-2中所有的发行版。我们在这里对一些特殊发行版中包含的 特性进行说明。 除了我们明确说明的少数几个例子不能在任意一个发行版本上运行之外, 本书中包含的代码可以在任意一个发行版本上运行。本书配套网站提供的 示例代码我们已经在表中所包含的所有发行版本上多次测试过。 16 第1章
1.配置名称 为了有一个更加规范的命名结构,在1x之后的发行版本中的配置属性命名 与之前的版本已经不同。例如,与namenode相关的HDFS属性增加了前缀 dfs.namenode,故dfs.name.dir已修改为dfs.namenode.name.dir。类似, MapReduce属性增加了mapreduce前缀,而非原来的mapred前缀,因此 mapred.job.name已修改为mapreduce,job.name。 对于1.x版本中已包含的属性,本书仍然使用原先的(被废弃的)命名方式, 因为这些命名仍然可在表中列出的Hadoop发行版本中使用。如果使用1.x 之后的版本,你可能希望在配置文件中使用新的属性名,以免出现使用被废弃命 名时的警告。Hadoop网站(http:/∥hadoop.apache.org/common/.docs/r0.23.0/ hadoop-project-dist/hadoop-common/DeprecatedProperties..htm)列出了弃用的 名称及其替代名称。 2.MapReduce API 在2.4.1节的补充内容“旧的和新的Java MapReduce API”中,提供了两组 Java MapReduceAPI。本书中使用新的API提供示例代码,不过还是有一些 本例使用了1.x版中没有的新的API,这些示例代码可以在本书列的所有发 行版本使用。本书中使用旧API版本(在oldapi包中)的示例代码可以在本书 配套网站下载。 这两类API中存在着本质的区别,我们将进行详细叙述。 1.6.2兼容性 将Hadoop版本升级成另外一个版本时,需要仔细考虑需要升级步骤。同时 还要考虑几个方面:API兼容性、数据兼容性和连接兼容性。 API兼容性重点考虑用户代码和发行的Hadoop API之间的对比,例如Java MapReduce API。主发行版本(例如从1.x,y到2.0.O)是允许破坏API兼容性 的,因此用户的程序要修改并重新编译。次重点发行版本(例如从到1.0x 到1.1.0)和单点发行版本(例如从1.0.1到1.0.2)不应该破坏兼容性。① ①1.0之前的发行版本遵行主发行版本的规则,因此版本号从0.1.0到0.2.0是一个主 版本的,因此也许会破坏API兼容性。 初识Hadoop 17
Hadoop针对API函数使用分类模式来表征其稳定性。按照先前的命 名规则,API兼容性包括标i记为InterfaceStability.Stable。公开发 行的Hadoop API中包含有部分函数,标记为interfaceStability. Evolving或者InterfaceStability,.Unstable(上述标注包含在 org.apache.hadoop.classification软件包中),这意味允许它们分 别在次重点发行版本和单点发行版本中破坏兼容性。 数据兼容性主要考虑持久数据和元数据的格式,例如在HDFS namenode中 用于存储持久数据的格式。这些格式允许在主重版本和次版本之间修改, 但是这类修改对用户透明,因为系统升级时数据会自动迁移。系统升级路 径有一些限制,这些限制包含在发行须知中。例如,在系统升级过程中可 能需要通过某个中间发行版本依次升级,而非一步直接升级到最新版本。 103.3节“升级”将对此进行详细讨论。 连接兼容性主要考虑通过利用RPC和HTTP这样的连接协议来实现客户端 和服务器之间的互操作性。有两类客户端:外部客户端(由用户运行)和内部 客户端(作为整个系统的一部分在集群中运行,例如datanode和tasktracker 的后台进程)。总之,内部客户端需要在加锁状态进行升级;旧版本的 tasktracker无法与新版本的jobtracker一起工作。未来可能支持升级的回 滚,这种情况下需要允许集群后台程序按阶段进行升级,以便在升级过程 中集群对外部客户端而言仍然是可用的。 对于用户所运行的外部客户端(例如某个程序从HDFS读写文件或 MapReduce提交作业的客户端)客户端与服务器必须有相同的主版本号,但 是允许有更低的次版本号和单点发行版本(例如,客户端1.0.1版本可以与 服务器1.0.2或者1.1.0一起工作,但是与服务器2.0.0版本不能一起工 作)。所有特例在发行须知中都有详细的说明。 18第1章
第2章 关于MapReduce MapReduce是一种可用于数据处理的编程模型。该模型比较简单,但要想 写出有用的程序却不太容易。Hadoop可以运行各种语言版本的MapReduce 程序。在本章中,我们将看到同一个程序的Java、Ruby、Python和C++语 言版本。最重要的是,MapReduce程序本质上是并行运行的,因此可以将 大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。 MapReduce的优势在于处理大规模数据集,所以这里先来看一个数据集。 2.1气象数据集 在我们的例子里,要写一个挖掘气象数据的程序。分布在全球各地的很多 气象传感器每隔一小时收集气象数据和收集大量日志数据,这些数据是半 结构化数据且是按照记录方式存储的,因此非常适合使用MapReduce来 分析。 数据格式 我们使用的数据来自美国国家气候数据中心(National Climatic Data Center, 简称NCDC,http://www.ncdc.noaa.gov。这些数据按行并以ASCII格式存 储,其中每一行是一条记录。该存储格式支持丰富的气象要素,其中许多 要素可以选择性地列入收集范围或其数据所需的存储长度是可变的。为了 简单起见,我们重点讨论一些基本要素(比如气温),这些要素始终都有而且 长度都是固定的。 范例2-1显示了一行采样数据,其中重要字段被突出显示。该行数据被分
成很多行以突出每个字段,但在实际文件中,这些字段被整合成一行且没 有任何分隔符。 范例21.国家气候数据中心数据记录的格式 8057 332130 USAF weather station identifier 99999 WBAN weather station identifier 19500181 observation date 6300 observation time 4 +51317 latitude (degrees x 1000) +028783 longitude (degrees x 1000) FM-12 +0171 elevation (meters) 99999 ve20 326 wind direction (degrees) 1 quality code N 8872 1 80456 sky ceiling height (meters) 1 quality code c 日 010008 visibility distance (meters) 1 quality code N 9 -0128 air temperature (degrees Celsius x 10) 1 quality code -0139 dew point temperature (degrees Celsius x 10) 1 quality code 10268 atmospheric pressure (hectopascals x 10) 1 quality code 数据文件按照日期和气象站进行组织。从1901年到2001年,每一年都有 一个目录,每一个目录中包含各个气象站该年气象数据的打包文件及其说 明文件。例如,1999年对应文件夹下面就包含下面的记录: 1s raw/1990 head 010010-99999-1990.gz 810814-99999-1990.gz 018015-99999-1996.g2 010016-99999-1998.g2 018817-99999-1990.gz 018030-99999-1990.g2 010040-99999-1990.g2 010080-99999-1996.gz 20 第2章