|
2.2 Hadoop 基础知识
- u3 S# _! P0 r2.2.1 术语解释/ `' ~) |* ]3 p7 V6 A, [* }
为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。
3 ^' d; |2 G W6 O. V/ N( 1) Hadoop 1.0
" c. d$ c/ y: U' VHadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多 }+ X: l5 `! m- F% f
个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、$ g4 J" T) Y/ Q4 n6 x
0.22.x和 CDH3 [1] 。; l8 p9 I) t8 E0 {8 Q
( 2) Hadoop 2.0
& ~6 r0 E( {7 NHadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop
$ s+ S! b: ^; G) H5 Q! y1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和
$ f i ]/ c2 M2 W4 }4 T: F' y s横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,5 b( _+ [" y# a' W
它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager
# S! Q, {6 f. ^负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于
/ q4 v& ~; E* h& \3 ?: R* ~YARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计$ h0 ?% r+ p" L/ C( n
算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。) z: m" A4 R9 p0 z
图2-4 Hadoop 1.0与Hadoop 2.0; c4 s4 W- [9 f4 G9 R
( 3) MapReduce 1.0或MRv1
( G: d9 Q; s+ N+ XMapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽
$ `: i; b8 o+ O) q" z4 R象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本
" L, H. i! T# w) T) d% M Y地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和
; [( Z! r5 c$ U4 s! SReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干0 } A$ ]! ~+ W7 J+ l
个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令% a: ]# B" f+ g* i; W
并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。
: g3 W. D/ I8 v& n- z( 4) MRv22 i9 @: h0 X [4 L% g
MRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于
" l* {( O" `( r3 l1 P: d) {资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源6 D* t' C& t" ^: t7 I3 l8 x
管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管% U( ^* g7 \ w# N% D9 o: ~
理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。: n% v* i7 i @( e
( 5) YARN0 s& w6 k; ]. i. N: l
YARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不9 J& h6 C* G( A$ U( k5 ^1 G
仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。
) [! ` a$ T) s; DYARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下' _, r1 x! x- F3 S# V" D8 {+ Y% K* P
一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。, c! d% z+ `3 z( x! U4 [' d5 P
( 6) HDFS Federation
' I9 r0 \, Q) k" A. n, E& oHadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS
; ~" `6 u) N3 Z& B# W/ d UFederation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。
& t/ Q9 X' ~0 _, N' V8 S% p2.2.2 Hadoop版本变迁
# \, Q2 f( w; | }& M) q当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,8 M3 K. G- c. |- S6 a( N
先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main
: G/ T3 S! `1 Q/ n0 Scodeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版& ^( V# `+ Z0 M( ] q$ a' i8 K
( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成- B; c4 v: r E# d: O. g0 M7 X
为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分
! c: G9 p! X( b7 w3 u* S支可能先于版本低的分支发布。
9 k9 d* t, I% d+ |由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大
8 e& U# q6 y% v) ^( T6 q4 F特性:9 @8 V: R9 x u# }4 w! J0 {
❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初
, p2 S; p5 a* \6 o的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有& U9 @0 V7 y5 d. c' w) ~1 _9 N
些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。
# S+ ^: Q* c/ W$ b$ l❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系4 V( y! P% }4 r/ R7 g
统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省5 e' P( u3 u/ F3 l6 ?: T2 s2 S
大量存储空间。
# Y N) ?/ J- ?& d❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者
) _" N5 K' P7 @$ o% D' }% [2 ~目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。
3 K i( e, L' D) f n# a5 z L❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便; G. `- I( x/ y x& n: E& o6 X
可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀( V5 _1 a* h# a' _& Q/ h
掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于
9 {2 f4 o0 m, s U. E- CKerberos和Deletion Token的安全认证和授权机制的工作。
# A* x% |# e! ~' T❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程
, @" k0 T* e6 d. n1 r& `, o2 |模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。. Q3 Z6 E; X e. }3 _
❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的
1 ^/ v4 U o. C; r- l5 P, Z. D资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将' A4 t. K9 n5 N2 F6 [" ~ l
其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。- j% \" h# C' z% f4 x
❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以
! S; }7 a! @+ G" n! G2 V J横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。
" r, ^% P: Z( W0 g! \❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一
+ d* q2 |# S. x' y* F个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。
' \7 N+ X& j7 { `8 x4 ?到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。
, e# b8 a7 p, z( U图2-5 Hadoop版本 变迁图 [13]
7 P; Y( K+ X! c6 X4 O) cApache Hadoop的四大分支构成了三个系列的Hadoop版本。
, V. y* m! S$ d S* M, C% G7 W) @( 1) 0.20.X系列1 `1 f/ B6 e, l8 L/ k
0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与
5 g$ Y" s8 i. V6 TSecurity。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的- X9 b2 c% R/ K9 n- L4 P9 f
1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之
" ?+ F, b+ k- Strunk上有的一些特性0.20.X系列版本却没有。: m9 B6 N+ f0 v0 E
( 2) 0.21.0/0.22.x系列
) L3 u/ P5 v7 X" t* c2 v* ~' S这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对
6 _# o9 [0 s- H& s( j2 |/ lCommon模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同) T3 l$ Q3 f+ b
时, 模块间可以独立开发。 具体各个模块的改进如下:" M; v3 S; Z( l( E
❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。
$ W6 V! M7 c* N! N4 N# f❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔1 l0 }) d, `8 d0 H
除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。! F/ y+ G5 x, }% z
❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。# w1 i( O9 A' ~& H2 i
0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。0 ?+ E/ h1 N' \
( 3) 0.23.X系列
- t8 j. {. H$ J& `) d$ e0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资8 C" A+ q8 D4 `- N+ T
源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]
( v2 W6 |: N6 ]; u c等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。
8 E3 B( _; |: i" [3 p/ T+ U/ @( 4) 2.X系列$ C; e. K' x$ O+ b
同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。
8 E. t1 z& V& v5 h# q: I表2-1总结了Hadoop各个发布版的特性以及稳定性。& [" U+ {7 v J
表2-1 Hadoop各个发布版特性以及稳定性
# y6 L; ]- z/ P1 G& Z5 W/ f" M* X" c㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。! c( {- c# X; r0 `' t3 o
本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以
* x$ i! ?- }! X( y; jApache Hadoop 2.2.0及更高稳定版本为主。
1 s. q0 h/ T7 j( _0 c[1] 下载地址为http://archive.cloudera.com/cdh/3/。
. _8 D1 R6 G+ q( c9 a[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。/ X# k( e* r3 w/ Z8 }6 p
[3] 官方网址: http://incubator.apache.org/mesos/。
- I2 L; }+ [* h7 b2 H. o9 v! O/ h[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。4 N1 L) Q. ^7 m, f- S
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。
8 z+ D/ a K, F: b[6] 参考http://hbase.apache.org/book/hadoop.html。
' ^2 G' U& m; B: M. J/ [[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。2 u. X, k9 L- ~0 P8 T, |
[8] 参考https://issues.apache.org/jira/browse/HDFS-245。' u0 E2 E2 U/ P
[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。
( O5 ?; v5 ?' M6 A6 ?5 P[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。
R9 S4 v" \8 o; q$ p3 E1 u[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。' E6 q! @: F3 `# o6 S
[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。5 A! ` o8 C3 l: ^2 t; q& k: R
[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。2 @2 D0 X% }* O1 c
[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。
: a: r* ^' b. Z[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。
$ w; n2 Z7 v0 y0 L" s[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。
& u2 K% d5 i$ |8 D% I! h
+ O. q1 l& C: j; \) \; `9 |# z9 _# f# K5 u! Z
|
|