|
2.2 Hadoop 基础知识* N1 L$ p$ Z9 V8 K- X8 b& o8 ]
2.2.1 术语解释
9 T' u+ ]. ]# Q( {" ^5 U为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。; ^9 `( s. c% {! c3 f- a
( 1) Hadoop 1.0
. \0 a2 z5 o: E1 @! P& ~9 M1 kHadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多+ G! h' O4 Q9 d( |4 _3 _
个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、8 G+ i! e1 Y% r) P5 d+ N* I
0.22.x和 CDH3 [1] 。4 T9 ^9 m8 l/ D3 r$ B o
( 2) Hadoop 2.0. P. R' N0 p1 n9 l1 k+ B
Hadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop: Q6 ~& Q, K4 |: I( X
1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和
8 X1 L) {( Z- ]7 K横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,
! i; ?2 u5 d# x它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager/ B2 O `) b4 d3 v' E
负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于. z" l4 g9 C& _( \$ x
YARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计
' Q7 k9 c2 F& B( f; x算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。
# J' W. w, a# Q图2-4 Hadoop 1.0与Hadoop 2.0
c# E0 K" F1 I, d9 v0 q( 3) MapReduce 1.0或MRv1
- a& I, X; f' T: b6 Y9 ~+ J! O5 y5 vMapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽3 q: Z& J: { f- B. }$ V5 t! L! `
象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本
0 h- H9 l9 b. p* h5 I地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和
$ w6 L: p& s/ I, q2 L- rReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干
. m/ G0 U' I V3 ~$ M0 E1 f9 M个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令
8 ~1 V* v4 m/ U并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。
x' m) ^9 K# I4 o9 s3 p1 t& [( 4) MRv2
3 ?6 R i c, EMRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于
& A% ?, T5 T& s$ T4 ^. `资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源3 G/ i+ }# ^' C' E1 t# @. b) F
管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管
$ |7 v7 H7 Y% M9 N; Z5 T6 F/ f$ W理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。6 J( [- \ J8 x
( 5) YARN" z- Y9 w- E$ D" Q6 E
YARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不
5 h5 o& B, L; A. }1 W" ^3 K仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。# N/ `, K- l% k% z
YARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下7 V% B& }0 Z% W3 m! Y) g7 s
一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。
0 q4 d2 E6 E- s5 Q4 \4 M( 6) HDFS Federation
" y( G1 h. @$ G/ b2 s) @. @Hadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS7 h$ w4 R ]4 n0 ]1 B( {0 D0 \; Q6 n
Federation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。
! h) R! B5 m; b2 u5 c2.2.2 Hadoop版本变迁! N! \& O- A2 |1 Q2 M( b
当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,. K7 I& w/ o, e
先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main
# n! m7 R3 L# K/ H/ U ~, ]( f' @& @codeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版' x7 \0 |: K: Y7 f2 I$ _) L
( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成
9 h/ ^8 O& r" |9 Q8 z# M) X为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分
4 G2 P9 n3 q; J3 M7 ~/ H支可能先于版本低的分支发布。
* x- P0 \* Q2 U, O, x9 ^由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大
`' P! V8 a/ [" t特性:
& `3 P& ]1 K* L% M7 M❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初
Z8 ~0 s2 C5 l. Y; W% w0 F+ W的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有. L9 g' J9 U0 d) b# w
些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。
, e2 c6 c: k( E# _: Z3 a❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系
. @9 G. t" N+ t0 T% K9 K统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省
" o( k5 _7 T9 C9 ?# a* e大量存储空间。
$ L; V8 D) j% F# B/ F: I) q❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者
" i% A) C& [( k; @$ v目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。6 C, g" `6 F* ]( q9 \ [9 ]
❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便# g( h7 v& m( _& R, M
可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀
1 m" W# Q. T( C6 L4 _掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于7 w5 k3 z! C+ e' d$ b
Kerberos和Deletion Token的安全认证和授权机制的工作。
, _& F4 g# s; \7 \ E; |❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程
3 w1 J4 W9 i' v6 s) u S+ X+ ]+ P模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。
% N! e& j- a: U6 B❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的" E% a `* `0 C
资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将
, I" c/ c9 _( B4 Z* j* {其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。% w6 r. L0 X4 |; t, d
❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以" ^/ p% M! y" Y+ a; t) q4 [) s3 L
横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。
" T7 L8 u+ l0 ?+ ~❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一& L9 y% j+ t( T8 {$ R1 f
个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。
7 `8 j) Z; `$ c到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。$ J" W2 e) s4 p, J# _/ ]) s) l
图2-5 Hadoop版本 变迁图 [13]
7 G; m. \' _. p4 S( U; aApache Hadoop的四大分支构成了三个系列的Hadoop版本。/ u) d( g! k5 i4 Y
( 1) 0.20.X系列
5 x3 E1 K, T/ j7 M% a- h0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与
( V# l2 R) i9 W3 M3 J5 f& fSecurity。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的
4 p7 s# F/ Q- G5 \4 J( F1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之; a" @6 h) e! B& U
trunk上有的一些特性0.20.X系列版本却没有。+ o3 a' `+ V |& Y
( 2) 0.21.0/0.22.x系列0 Q; T- X) o0 x/ M# \9 S
这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对, m7 B% g- i. ~: `4 D' D9 R2 a
Common模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同6 P- p- T; a* ~. S
时, 模块间可以独立开发。 具体各个模块的改进如下:
7 T! t4 x; P4 r0 X4 b' M% d. l+ b❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。
( |$ x* T f) z❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔& B1 i4 h& I: o- E
除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。5 e6 \% l3 R. W" a
❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。
* `0 a4 Z u9 y5 T0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。7 P( J' |' Z1 {. v5 ^, |5 B
( 3) 0.23.X系列/ B, ], m9 [' Q+ ~: G
0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资
: T: }; F0 M |( J. s源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]0 \" m8 F w* ?
等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。
2 ~; {2 R+ _4 w; @, C) Y( 4) 2.X系列; L( G+ c9 |7 f
同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。
) [7 b* ~" d. t9 B表2-1总结了Hadoop各个发布版的特性以及稳定性。
+ E) h+ _" p+ n9 A! [$ j表2-1 Hadoop各个发布版特性以及稳定性
* ~- E' P4 U& E; t* t& j7 @. ^㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。
! r6 R+ Q2 w; t2 K! c本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以
! d$ r2 E* H; g X7 W. b4 e+ l4 mApache Hadoop 2.2.0及更高稳定版本为主。3 M" L0 d/ s; T; \" H; }- n
[1] 下载地址为http://archive.cloudera.com/cdh/3/。+ P2 l! d# q( m1 `: G
[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。! _6 J, `% ~4 ~% t
[3] 官方网址: http://incubator.apache.org/mesos/。
5 ^& p$ w$ T: Q! V' Z; e[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。/ Y* P6 P4 ~ X! v, s" w8 t" u# w: z
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。
( g- W$ U$ }: o$ q2 G3 J4 T0 s/ o4 c[6] 参考http://hbase.apache.org/book/hadoop.html。' E% |7 ^7 ^6 B8 _- A5 t, [- ^
[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。
) Y7 h6 i8 k: p[8] 参考https://issues.apache.org/jira/browse/HDFS-245。
) D2 s; G$ ^4 g; `+ L8 Z# J2 f[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。
- X: ?1 J! i- ?[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。7 H# U3 i9 u2 f& P
[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。' W P8 E! ]; Q) k
[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。2 ?! X# g2 I" n, j: z; A
[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。
: J+ R& d3 _* `4 G& x R[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。+ ^! a+ k5 u/ z" b& n% J, m: _' P
[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。' v; l( w& Q, ?" z" D+ `2 C
[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。 7 ~. t& {# M8 x) r5 `* w9 P) Y
% [& `, H# c0 i/ E; Y1 g" r5 o# u) n
b/ l' v5 J' V I
|
|