|
2.2 Hadoop 基础知识
2 x) Z( \5 w7 ~1 R7 R, i G2.2.1 术语解释
/ { `8 F8 K. |* ~为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。
8 t# C8 p4 Y$ X% g) ~, G/ w7 B3 p( 1) Hadoop 1.0
% m5 ?6 b1 x9 h$ AHadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多- U# G$ \+ @# Z
个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、
5 K# H9 O H4 w4 h$ A9 T3 Q0.22.x和 CDH3 [1] 。1 M, }+ y+ N3 P. K" a) S' a
( 2) Hadoop 2.04 c8 b4 A k$ p3 T( T) a
Hadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop' P# N e. ?# }
1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和/ ^$ H+ I0 N9 e! G4 i
横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,- @1 z- W. K# s" g+ `8 E
它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager
# S3 I# w/ o9 Q& E Y负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于
b( P, C+ V7 Y2 ?/ H" n$ _' IYARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计* W1 F% s; E4 S" W
算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。5 E. M7 l, g) `6 b+ r6 n& }
图2-4 Hadoop 1.0与Hadoop 2.0' E6 E( Q$ N# N3 q+ @ J! ?
( 3) MapReduce 1.0或MRv1& s: f& l6 N8 {; y- P- U$ Q9 r
MapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽
, y: l1 l5 ?2 g象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本
* d( ]3 v2 T4 i. Z' a5 v- @地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和
& Y! n0 _& _) dReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干
( ~* K+ O1 H6 c9 E) v个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令
9 K( p6 U' p/ b B# [. A$ O0 I. ]- S并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。
8 s F- n2 s/ F5 e+ i, _& i( 4) MRv2) e' `- c' r; G
MRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于
. u0 a$ e% r2 p0 C% D资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源
4 q7 \" E; z& u2 a; j: ^管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管* X+ ?1 N4 z1 p6 i: [2 s
理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。
; |$ s; M* q+ C7 F8 E( F( 5) YARN" s1 j) @5 A8 o0 N( h0 j4 P
YARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不
3 f5 E' T" v7 |, M( I仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。
; F% }9 N# \. S% Z4 u! G/ QYARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下
) |) n9 r: k- J: }5 ~一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。+ I Z2 u% @/ r" u' @
( 6) HDFS Federation
8 @. k1 y1 t2 Z U# n! kHadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS
3 z, r2 x) e/ Z7 LFederation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。
" z+ U5 {, |6 b8 E0 f' Z2.2.2 Hadoop版本变迁" j3 E6 H! q6 C8 z
当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,
) X- e8 Z2 F2 M% n! q7 _ | K% m先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main6 H9 f9 X: G8 D% [3 J5 @
codeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版: D$ K* G. D9 D# f: a
( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成
( L9 E& o, m2 ~* x: r9 D2 N为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分
+ V1 w6 U( A. s* A! v4 F支可能先于版本低的分支发布。
* V+ P, q8 n; W. A4 H7 q |由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大' N) v7 X/ {# p; h" _& A
特性:
! D+ {5 x- W% ~$ b. [❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初3 N; c* [( T7 l! j/ ]' n
的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有
& Q0 v, t. n1 _7 S* \3 g. t些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。
& O; Q2 l @7 |8 F❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系) Q, B: L" t( F
统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省# T% @' o: N8 e1 o5 D/ \
大量存储空间。) V" Y. t% N2 p7 S3 M4 F- b
❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者
- G( I% E. _/ l% T% }+ N目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。
( X: v( j7 W# N( P❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便
- C' [) P# t/ V2 h" Q3 H* j可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀! T) N4 Q0 W- W& a/ N( r+ l
掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于
/ Z* K: V# k" t, r3 P, v( W/ ]" qKerberos和Deletion Token的安全认证和授权机制的工作。9 e3 ^/ }8 ?1 S) t3 X
❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程" K [9 D8 V/ y% g/ L x0 {/ b
模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。
: \2 [4 B3 m% c. |- l5 M& V❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的
7 j4 R" j* u- u6 n资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将& L, r( Q, L- o! I! D
其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。
8 Y: W+ w6 A' v6 x, F( N. ?* f❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以
* V3 t6 Z: F8 i1 Q! B横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。
1 H" c! {5 X$ ~ ~ M, d& h❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一
% s. r- W+ K/ V; F) M W个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。7 I3 l" i9 p6 r
到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。9 Y- P5 U) g' r7 v' R
图2-5 Hadoop版本 变迁图 [13]
) W* p. e( W+ u* JApache Hadoop的四大分支构成了三个系列的Hadoop版本。; d# U! H) E+ b' c" F
( 1) 0.20.X系列
7 W% w6 A; ?2 U5 N& s0 @0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与
Z1 s3 l8 I7 o6 ?' H, a' u' FSecurity。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的; e& ^ H3 i8 z. r U+ W2 F% [3 F
1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之
( q6 _$ ]' k, W, ntrunk上有的一些特性0.20.X系列版本却没有。4 ?2 O$ W: o9 a+ d
( 2) 0.21.0/0.22.x系列8 w0 P7 v& F8 [) Z3 N
这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对7 u) F% V1 L$ s/ p7 f$ \5 ]8 W
Common模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同 n, R( E& w; r1 p4 T+ S/ c. ?
时, 模块间可以独立开发。 具体各个模块的改进如下:1 O3 C8 J9 u& c5 F& s, D+ j0 r9 V
❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。9 x) m! b- x' _& b# m
❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔9 ]0 j# i7 w8 f+ u
除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。5 a0 K3 {" x+ X7 {9 b, a4 X* ^ p
❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。' Z1 e2 ?' b0 |0 D0 T H$ p
0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。
% V1 m( L* G! Y, l( 3) 0.23.X系列) Y2 g, o" y0 Y; v4 G, Z" `
0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资: M" b6 {- n. f8 G2 E
源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]
! b6 ^0 u( I3 j等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。
; j9 ~# d- a! J' ~6 H# C8 E; N( 4) 2.X系列/ W3 _( b8 s. O1 O, x. b5 V( l% `0 j
同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。
' p" B# @% ?$ N表2-1总结了Hadoop各个发布版的特性以及稳定性。; \# `- A6 ?: ~$ k5 `' N; ^
表2-1 Hadoop各个发布版特性以及稳定性5 n$ o0 L/ d, A! R- P9 a Z
㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。
2 L" H3 q( Z: X s0 |* j" {& d本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以! f5 D; D3 m( ^& D1 Z% i- y( z( r
Apache Hadoop 2.2.0及更高稳定版本为主。
' M* P9 B# p! G5 s& J[1] 下载地址为http://archive.cloudera.com/cdh/3/。. Y- } E6 C. v x6 G e
[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。& ]$ B$ l( |4 d4 f
[3] 官方网址: http://incubator.apache.org/mesos/。' M; y$ u9 g- Q6 R. H
[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。! y4 w& ~7 _4 u# x
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。
) k3 p R8 E- s9 @- x: T3 I- {[6] 参考http://hbase.apache.org/book/hadoop.html。$ V S' A- h* u" S; g+ Y
[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。
- k, F1 g0 z2 |% F9 ^" v[8] 参考https://issues.apache.org/jira/browse/HDFS-245。
( F4 G: K, c- i7 G" r$ R' E6 S[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。! {* }' ~4 r* W& @
[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。
8 c# l# C+ c. }[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。' u8 Q6 k' ~, U/ j* `
[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。
! h6 e+ j' q- x4 J/ S6 ~! H[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。# O; h9 P* k; B. ^5 S
[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。
7 j& [9 E/ M8 a; z[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。
$ W0 n' Y- k& z; ]8 l# W% w( |[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。 * g: \5 A- X: _) n- ?
8 F x" [$ X5 r$ m& B/ K) z' y3 w0 ~' T, U
|
|