|
2.2 Hadoop 基础知识0 t" G1 B6 ^6 A' B+ N9 g. b
2.2.1 术语解释
: `- d" y. C F$ Y- j为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。
- S) n4 F' o' f; X# D( W5 R( 1) Hadoop 1.0+ z" u3 K% L$ U' t j
Hadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多
+ L, j+ Y( k' l' }' N9 J个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、% P9 b$ p- \5 g
0.22.x和 CDH3 [1] 。
9 F2 G7 ~/ E, F- ?) z( 2) Hadoop 2.0
# u o1 S5 P7 s9 oHadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop( U9 B7 y1 {$ X. d4 ]9 M/ f! ]
1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和1 v4 _+ |+ D/ k6 ~4 ~% ?8 A" _
横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,% x2 x' }* g- U" }6 D% G' g$ M
它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager* w2 P" A( k9 t
负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于
. V- q3 X% E3 Q5 rYARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计! l+ ]( q3 @' c: M6 D
算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。" E1 k. Q0 m) j* ^ C7 ?6 w& g. B' Q
图2-4 Hadoop 1.0与Hadoop 2.0+ E' p# m& J4 Z7 T7 D
( 3) MapReduce 1.0或MRv1
3 C& b2 l1 y- j2 @& o2 J- IMapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽; J9 q l$ B' A2 v8 H- q0 H5 j
象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本 j9 t T h0 Q+ s
地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和) N$ S* E% i/ t% G9 b+ [6 c
ReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干% ~4 h( E1 o- x& _
个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令
. G: J; ]' W* s1 G3 l; e$ E并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。/ V: w \# x$ e! f u! T2 L9 ^
( 4) MRv2
7 f5 Z, p1 j8 AMRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于
) j4 }1 i) h) b( R2 q资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源
! K+ |: l1 L4 x1 K9 ^9 c. {管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管
- W( A v" Q, V! K理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。+ F/ Q/ g$ ~4 |0 e4 ?8 g
( 5) YARN8 D3 ~/ m- m$ X8 [& }( [8 a/ P/ n
YARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不- V# M! H3 J7 t6 h6 [5 \3 u! j
仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。
, P0 }* D9 c9 j: OYARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下
2 n% C* a4 ~; e3 k; A一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。
7 |8 E$ m7 `' b! h( 6) HDFS Federation
4 a7 s4 M/ e( W' n0 F/ NHadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS* H0 [; Y7 a G/ M: r$ I8 V9 I8 Y
Federation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。- f4 R# ~3 \! l# f
2.2.2 Hadoop版本变迁 U9 B* N: q+ H. b5 n# o
当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,8 k% T, }+ k u- I0 h
先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main9 B2 W) b" G1 g4 L; x
codeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版; r( n& ~# c2 x' v4 N- Y
( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成2 N- ^% E/ h, S) v. H
为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分' \8 x$ F3 j4 H
支可能先于版本低的分支发布。
* G. _( \$ M, g3 e由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大
, c4 t3 U0 P2 ~) `特性:8 \7 G9 ^7 x7 n
❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初5 \5 [) m. i9 Y% r5 r
的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有
. F' t% P' X! `! e7 Z4 j6 L5 `8 r' S些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。
' ]$ W" X. o+ u* Q❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系# r \1 ^8 W! L' y" E
统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省
: o5 E+ m! z. Z/ `7 g大量存储空间。1 e9 j1 c! B$ M7 z
❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者
1 M9 a+ `) V5 L2 z; }# z8 W* n* r9 ~目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。: M4 v% ^" Q q: q' e
❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便: X1 `3 \* j1 K) M2 ^! ^
可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀
; V- _1 ^& P/ A. Y4 ]' q掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于' F. p. b- ?, \4 l3 z( K X
Kerberos和Deletion Token的安全认证和授权机制的工作。% |2 _5 _; W! `4 N6 Y
❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程
) X3 }% X2 U b p5 n) { n模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。- l+ Y2 H( h( o% c
❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的
' I7 M; z1 N: b; i: U& o资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将
C! x- q# `3 c" h [其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。8 ^3 B) N1 p8 r" L) _# o0 e
❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以
. K8 O6 Z. Y& a1 z横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。
5 z4 D: {7 v9 h, P) W. {❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一
: @' y, O) p+ N: G3 f4 l. G个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。
; u+ A* p; S l9 K4 e到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。
3 J$ i* z$ L. V图2-5 Hadoop版本 变迁图 [13]; B$ F& O+ B- ]* n/ W% N
Apache Hadoop的四大分支构成了三个系列的Hadoop版本。+ t# m+ @) t$ r
( 1) 0.20.X系列* w* `8 q1 m" Y% [8 e d
0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与
3 r( q: I. w" K e! ?; t& A# T* CSecurity。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的3 J- J4 {, l$ }( v' ~+ a
1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之
6 ^+ o# ^8 P1 b0 e) e. g/ p1 Utrunk上有的一些特性0.20.X系列版本却没有。, B/ ^. e$ M$ x6 C5 R" _! A% F8 m
( 2) 0.21.0/0.22.x系列; ~/ ?* h% }7 v" |) w; q; D. {( M
这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对+ W" Y, u1 t% m; w7 k: H3 K: M, W
Common模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同+ T+ j1 e! l: o9 w A6 X b
时, 模块间可以独立开发。 具体各个模块的改进如下:
, T) R2 z3 G. h❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。
: }+ M: _' z( s2 Z8 |❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔( O a! t, _/ {, r
除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。
* a$ N! q- W; p* n2 A❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。* c/ t3 t% r, {1 L& x, H
0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。# g, ^+ Z% e$ N
( 3) 0.23.X系列3 R$ m% c @- w7 Y: }7 \8 U
0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资( q, n/ P* y; t% v- N$ g4 ^6 v9 `4 ?
源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]
1 y- h% B: R: K- }% v( y等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。
4 g( Y4 p5 F! z4 r# ^7 k1 n( 4) 2.X系列
" T L" L, C( P4 ?! [/ A/ I) ~/ y同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。
1 u' l* ?0 I8 d' E) {2 f5 d$ a( z( C表2-1总结了Hadoop各个发布版的特性以及稳定性。: A! s0 N& |) f( |" K
表2-1 Hadoop各个发布版特性以及稳定性: f; t0 M6 t9 g8 I; }6 \
㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。' a% ~- O+ c& K& k9 A
本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以: Y5 x' v+ j: Z5 V. @2 s
Apache Hadoop 2.2.0及更高稳定版本为主。
* ~4 B, O7 _7 }3 J3 a$ r[1] 下载地址为http://archive.cloudera.com/cdh/3/。5 @* Q1 f1 {8 P9 Q! N- G# O
[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。
Q$ F. Q) z+ a[3] 官方网址: http://incubator.apache.org/mesos/。/ M& U' l( v( ~* S N! ]0 r
[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。% T1 V. v4 t( ~/ R9 `
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。( z* q8 z( |2 z9 f8 X
[6] 参考http://hbase.apache.org/book/hadoop.html。1 U( k) I" N; o- P# \
[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。1 Y7 U p9 k N+ d7 O7 J
[8] 参考https://issues.apache.org/jira/browse/HDFS-245。 ?$ K" O# P' ?8 t5 U4 \
[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。& ?: e* k2 i: \6 e$ ~
[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。( E9 t3 s% R; P! _$ C: a
[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。
B( E0 ?4 {& U. E* P[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。# n* S( Z- v4 Q$ W6 R; f
[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。8 C9 l; b Y) V" c; k/ e
[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。
3 W; v! b( ~: u( g/ _[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。) `$ z2 x/ C: g4 C2 W% O9 y
[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。
) V" j, K! P; _; K, h/ X
. L3 C2 ^( f5 i- X* V
% W+ c: s$ @- n# u- P8 W6 g |
|