|
2.2 Hadoop 基础知识9 @: T* M/ Z K8 H/ H" S
2.2.1 术语解释+ `6 P' }4 Y1 S% a, h
为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。
; c5 E+ ^3 b! _, D; f2 z) M% }) _( 1) Hadoop 1.0
8 g1 ^- q& F [5 wHadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多; Q& y+ N$ H3 S- h
个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、
% r1 R' L* y# F9 c0.22.x和 CDH3 [1] 。; p( C- C' t+ ~3 H- O! m% P9 k. t- h
( 2) Hadoop 2.03 L0 M1 o$ n5 J) _, x5 g( s
Hadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop
?% Z+ Z3 Y) `' k, n1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和5 U* [; H8 K3 x& n \, g
横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,5 Q! T$ K+ `. l* r$ c6 B
它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager; ~' i' B5 x/ F# |6 n, G/ W" q1 c- P
负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于 t1 j- s- d. M; I; M
YARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计
* p: Q% S; j8 _ e+ \0 `+ e t7 i算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。
3 N& D" P7 K7 J* a) R: L图2-4 Hadoop 1.0与Hadoop 2.0- U0 N: F5 ~: G: [6 B8 u
( 3) MapReduce 1.0或MRv1# ]4 Z/ m1 _* s8 X( L3 s' p& c
MapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽
( [6 S0 m* b8 R: d1 p; Z. Y& v象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本
' u N7 t' @. F地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和( P0 ~8 E- \% v$ R
ReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干
- V q% A, Q& G: A' p个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令
! ^1 D) V/ d/ n8 P并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。
9 S( k' ~6 b' D: q+ G$ E" P4 C7 [( 4) MRv2
( v- p3 b$ _% Q2 w+ ^MRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于7 v' m" T& J( ?& R8 i
资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源3 Y2 o% H8 r3 u& P0 m2 T4 `$ g* s
管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管
. ]1 r4 U0 |4 o; n- Y. B+ g/ m理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。5 E" ^1 A" i# K+ @/ R
( 5) YARN
" K9 c$ d. V# X) F8 g! ~+ JYARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不+ C$ |/ Z; m3 L. x7 z7 a' V: X
仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。
% c' m# C. a) \, gYARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下! C- d* ?8 z( o/ ]/ G4 M6 \
一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。- ]! y- P$ W* G2 \( P
( 6) HDFS Federation* X7 P. k- Q4 F8 G" q
Hadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS' e- `5 C: `# g" H+ D/ w0 Y
Federation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。
, ]# u, r# w+ J& M ?( P/ l: j2.2.2 Hadoop版本变迁
# V$ L4 p P( V1 A9 j6 t) M$ d& w当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,
) ~3 H" W/ Q9 E! v7 z5 k先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main! H, H) t( d' I% _" v
codeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版
/ Z$ \4 W* ^3 P; H( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成
3 C0 I6 _$ S6 Q. u+ M为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分
8 |9 R+ o: ^& X& {, J3 e支可能先于版本低的分支发布。+ j W8 y0 i% }1 I4 e" I
由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大' Z; V1 L& p5 P- {# S
特性:2 s% {& M* J) R- [2 y0 Q
❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初. }. a- W" |2 o8 d8 `6 k0 p, g7 e
的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有+ ?. s) h1 D4 M0 m5 @9 ?; i
些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。4 @0 y! G# p% B2 p: r
❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系9 F9 b% c% ?) z: n) ?
统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省6 G7 d& d3 t! Z4 e* z2 E
大量存储空间。: y. B! t3 y% t; S! O7 M
❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者) H7 Z3 U' M, x5 G8 x6 |: W, ]
目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。- m" g6 r2 C! m) }" R; r& s
❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便
; a- ^' y+ v) h! h1 A S可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀) _; H" {. P* Z% a
掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于
; F/ I* ^& d+ I% n Y# aKerberos和Deletion Token的安全认证和授权机制的工作。
/ O4 r% M/ r3 U% H6 x. M# _1 Y❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程" z' i+ a+ R, q6 N# I' P' s
模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。) ~, d9 j) \! f' x' p! W8 F
❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的1 w" }. i7 W( o1 U
资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将1 c! c4 b" U7 B9 C( x& _8 Z
其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。
* m) J- i& z! l❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以
1 W- o' ~- s( G: ~横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。
) {& E1 k4 }1 ]; ?& y O❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一# V$ I# v, J8 S3 N7 p& x7 x: e
个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。: j! f6 b2 ~( i- ?5 D1 o
到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。
5 z$ ]6 ?! V6 C图2-5 Hadoop版本 变迁图 [13]6 p, ?8 d' \7 v9 g
Apache Hadoop的四大分支构成了三个系列的Hadoop版本。! H5 _- m+ i/ v a7 o5 @ D4 i
( 1) 0.20.X系列
8 B7 z( W0 t1 {9 w$ w# \, b0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与; y1 @1 v' D8 B0 n3 e$ b, `+ \
Security。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的
% U( n3 z1 t3 W5 t1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之
z$ a. Y, [9 K' Z1 p5 B# ctrunk上有的一些特性0.20.X系列版本却没有。/ T R. X: P, w# R8 j7 G; j# k
( 2) 0.21.0/0.22.x系列$ z8 m4 u8 T7 a! q6 m# Z
这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对
2 ~( R. g' A2 g6 q- q7 ECommon模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同
' }5 V9 y5 y1 J" o! b) Y5 ?% @7 I& f/ @时, 模块间可以独立开发。 具体各个模块的改进如下:
7 e8 D* f( d$ s% V❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。2 s' }5 N$ z& e6 w; L! ?& o" w
❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔& n6 o' i7 p8 y; T2 |
除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。 c7 {5 T6 k1 Z) r4 c- G; R; `; N3 ^
❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。
3 X( ]& e9 D7 s8 s g; x3 r0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。. Y1 O8 q: T3 R; K; ^8 _2 }8 O2 z
( 3) 0.23.X系列
. ]2 \$ ?& E8 ~( ~" C: C9 N0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资
2 P' i; m( n! C2 @源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]; T( x w4 F: _0 G, l* j/ g! @
等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。3 l* m, g8 }/ ^
( 4) 2.X系列' M: T' O3 ~. g' ]% C& K
同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。+ L# N# }. I8 `* u6 m" p
表2-1总结了Hadoop各个发布版的特性以及稳定性。$ U: w S9 Y' j. j, r
表2-1 Hadoop各个发布版特性以及稳定性$ b2 n& g/ d; o9 m
㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。+ Z4 w$ t: k7 M: N9 g9 q
本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以
: c" D- {: y, }- k b2 eApache Hadoop 2.2.0及更高稳定版本为主。
/ g0 G y, r5 ~ U' _2 Z8 ^7 J[1] 下载地址为http://archive.cloudera.com/cdh/3/。
- [4 t' x0 q8 q9 r2 h8 _ n) G[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。6 d* g! ^- @0 S
[3] 官方网址: http://incubator.apache.org/mesos/。
3 z3 D) F* v4 l% t1 S3 L[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。1 A# V4 T8 U. J) q7 C, O# X4 c
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。3 ]$ }* k* G' B: K: W
[6] 参考http://hbase.apache.org/book/hadoop.html。9 |* \3 Z. T1 I1 O$ D
[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。: `; v# k1 t9 ?; c' N2 U& ?: T2 W
[8] 参考https://issues.apache.org/jira/browse/HDFS-245。
+ f% g/ E0 ~; ^' ?5 \( h* t[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。
- }2 ~. k* z" T' ~[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。
4 ~% Z6 U3 P; z* i# Y h[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。/ s2 V2 R$ N3 i/ N' W8 F
[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。
+ E0 M m, g9 X, o) @8 Z8 n! d' }6 @[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。 Z! `( A; I8 Q6 }9 m( ^) r2 p
[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。
, o5 c2 z: d- \# e1 ?3 j2 j[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。9 M7 H7 q: W& l# L4 q6 U% {% z0 j- i
[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。
1 w% N/ W# g' Q% k- i( K" }8 n# d) q6 x" o: z( g5 X
- v2 M, X9 A: C4 w |
|