|
2.2 Hadoop 基础知识
- m; N$ D7 J" I7 [8 |2.2.1 术语解释
& ^- k- _9 l5 p2 s/ M4 } G i$ w为了便于本书讲解Hadoop YARN, 本小节对Hadoop涉及的术语进行比较全面的介绍。
! ?6 U6 Z0 Q+ P' X( 1) Hadoop 1.0* y) d2 a+ q5 ]* y6 d7 z: ]
Hadoop 1.0即第一代Hadoop, 由分布式存储系统HDFS和分布式计算框架MapReduce组成, 其中, HDFS由一个NameNode和多) Q: e( l7 B6 \/ f$ [# x, T
个DataNode组成, MapReduce由一个JobTracker和多个TaskTracker组成, 对应Hadoop版本为Apache Hadoop 0.20.x、 1.x、 0.21.X、4 S" `5 J7 m+ N3 }3 r
0.22.x和 CDH3 [1] 。8 I$ U6 _& \# H) y2 D% H( k5 t
( 2) Hadoop 2.0
5 P: v# c" Y/ G6 S) m! Q }# lHadoop 2.0即第二代Hadoop, 为克服Hadoop 1.0中HDFS和MapReduce存在的各种问题而提出的。 如图2-4所示, 针对Hadoop( O* y4 A8 _/ z: {5 s
1.0中的单NameNode制约HDFS的扩展性问题, 提出了HDFS Federation, 它让多个NameNode分管不同的目录进而实现访问隔离和
, J: Y) g( g! K$ P! @) I* b( k横向扩展, 同时它彻底解决了NameNode 单点故障问题; 针对Hadoop 1.0中的MapReduce在扩展性和多框架支持等方面的不足,5 m2 ~4 Q* Z& V6 i5 ] V& K# m
它将JobTracker中的资源管理和作业控制功能分开, 分别由组件ResourceManager和ApplicationMaster实现, 其中, ResourceManager" v7 O$ u3 S4 ~- S1 f$ r
负责所有应用程序的资源分配, 而ApplicationMaster仅负责管理一个应用程序, 进而诞生了全新的通用资源管理框架YARN。 基于
4 }. e& d. Z3 Q$ hYARN, 用户可以运行各种类型的应用程序( 不再像1.0那样仅局限于MapReduce一类应用) , 从离线计算的MapReduce到在线计
3 a- n( G& L0 C算( 流式处理) 的Storm等。 Hadoop 2.0对应Hadoop版本为Apache Hadoop 0.23.x、 2.x和 CDH4 [2] 。
" P& L$ ]" Q& F4 G0 I+ ?图2-4 Hadoop 1.0与Hadoop 2.0
, r. A2 y6 {7 U/ N( 3) MapReduce 1.0或MRv1& \7 L! R0 t% D- q: @
MapReduce 1.0计算框架主要由三部分组成, 分别是编程模型、 数据处理引擎和运行时环境。 它的基本编程模型是将问题抽
4 O0 ~% S1 M# y! _: g象成Map和Reduce两个阶段, 其中Map阶段将输入数据解析成key/value, 迭代调用map()函数处理后, 再以key/value的形式输出到本, \8 F- I2 S5 t
地目录, 而Reduce阶段则将key相同的value进行规约处理, 并将最终结果写到HDFS上; 它的数据处理引擎由MapTask和
; M# \% @) j! k, u* d% y& E9 w# JReduceTask组成, 分别负责Map阶段逻辑和Reduce阶段逻辑的处理; 它的运行时环境由( 一个) JobTracker和( 若干5 `) v( y" O9 p! ]3 x
个) TaskTracker两类服务组成, 其中, JobTracker负责资源管理和所有作业的控制, 而TaskTracker负责接收来自JobTracker的命令
) u( n! j5 d: Q6 k- T, \并执行它。 该框架在扩展性、 容错性和多框架支持等方面存在不足, 这也促使了MRv2的产生。5 y+ I& f2 y1 P
( 4) MRv26 J1 b# a2 I+ b" c
MRv2具有与MRv1相同的编程模型和数据处理引擎, 唯一不同的是运行时环境。 MRv2是在MRv1基础上经加工之后, 运行于
+ `, R' c' {7 F; g! I8 w: P资源管理框架YARN之上的计算框架MapReduce。 它的运行时环境不再由JobTracker和TaskTracker等服务组成, 而是变为通用资源* q6 U, l- ?2 |7 f3 k% B
管理系统YARN和作业控制进程ApplicationMaster, 其中, YARN负责资源管理和调度, 而ApplicationMaster仅负责一个作业的管& z0 ?2 e. E ]: v0 T
理。 简言之, MRv1仅是一个独立的离线计算框架, 而MRv2则是运行于YARN之上的MapReduce。
C _- R: ^8 |( 5) YARN
7 z# m. J6 I4 v& [YARN是Hadoop 2.0中的资源管理系统, 它是一个通用的资源管理模块, 可为各类应用程序进行资源管理和调度。 YARN不! L: w& c* A( J( ]' P" J
仅限于MapReduce一种框架使用, 也可以供其他框架使用, 比如Tez( 将在第9章介绍) 、 Spark、 Storm( 将在第10章介绍) 等。
* M P. |7 l8 X, r/ TYARN类似于几年前的资源管理系 统Mesos [3] ( 将在12章介绍) 和更早 的Torque [4] ( 将在6章介绍) 。 由于YARN的通用性, 下
( v4 t- _1 p1 N8 z6 B一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN 。' H" j8 a) P0 s4 _# b% G9 r
( 6) HDFS Federation
6 |6 x# P4 C: L( @3 B, tHadoop 2.0中对HDFS进行了改进, 使NameNode可以横向扩展成多个, 每个NameNode分管一部分目录, 进而产生了HDFS
1 y1 p. }; a5 ]$ HFederation, 该机制的引入不仅增强了HDFS的扩展性, 也使HDFS具备了隔离性。, f0 j7 V! v9 m% v$ w4 k
2.2.2 Hadoop版本变迁
* J V1 ^7 Q5 l% N5 W& ~: l! W当前Apache Hadoop版本非常多, 本小节将帮助读者梳理各个版本的特性以及它们之间的联系。 在讲解Hadoop各版本之前,* E3 Z7 ^2 B! n4 M# Y
先要了解Apache软件发布方式。 对于任何一个Apache开源项目, 所有的基础特性均被添加到一个称为"trunk"的主代码线( main
( X0 v( t" g2 F' ^( n Ecodeline) , 当需要开发某个重要的特性时, 会专门从主代码线中延伸出一个分支( branch) , 这被称为一个候选发布版1 u* n- E( F$ B0 q Q8 Q
( candidate release) , 该分支将专注于开发该特性而不再添加其他新的特性, 待bug修复之后, 经过相关人士投票便会对外公开成. c8 n2 E2 v+ K0 c. Y" B
为发布版( release version) , 并将该特性合并到主代码线中。 需要注意的是, 多个分支可能会同时进行研发, 这样, 版本高的分" z& Y, X0 S' {3 q6 R0 L N
支可能先于版本低的分支发布。! b9 S4 z$ T& g" c4 b
由于Apache以特性为准延伸新的分支, 故在介绍Apache Hadoop版本之前, 先介绍几个独立产生Apache Hadoop新版本的重大# Y) d0 P9 E/ d) J0 |6 T5 i1 R9 g* _
特性:
8 O6 H+ L# v4 z9 p- [❑ Append [5] : HDFS Append主要完成追加文件内容的功能, 也就是允许用户以Append方式修改HDFS上的文件。 HDFS最初
1 u- v! u! j; d1 Q% j的一个设计目标是支持MapReduce编程模型, 而该模型只需要写一次文件, 之后仅进行读操作而不会对其修改, 即"write-onceread-many", 这就不需要支持文件追加功能。 但随着HDFS变得流行, 一些具有写需求的应用想以HDFS作为存储系统, 比如, 有 ]. h6 _7 S& N
些应用程序需要往HDFS上某个文件中追加日志信息, HBase需使用HDFS具有Append功能 以防止数据丢失 [6] 等。
- }- ^6 h/ T( ~, V% f/ c5 l❑ HDFS RAID [7] : Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统DistributedRaidFileSystem( DRFS) , 该系+ \ a; f8 r3 t3 A+ C) ~( k- i; _
统采用了Erasure Codes增强对数据的保护, 有了这样的保护, 可以采用更低的副本数来保持同样的可用性保障, 进而为用户节省
% a$ y* l" w" Q大量存储空间。0 V: Z: k+ E7 S6 H
❑ Symlink [8] : 让HDFS支持符号链接。 符号链接是一种特殊的文件, 它以绝对或者相对路径的形式指向另外一个文件或者6 o# Z8 X0 D7 O1 k4 z1 n I
目录( 目标文件) , 当程序向符号链接中写数据时, 相当于直接向目标文件中写数据。1 R5 Y' h; M, {1 f- _! z
❑ Security [9] : Hadoop的HDFS和MapReduce均缺乏相应的安全机制, 比如在HDFS中, 用户只要知道某个block的blockID, 便4 a% a% V7 W- f1 |* q! a
可以绕过NameNode直接从DataNode上读取该block, 用户可以向任意DataNode上写block; 在MapReduce中, 用户可以修改或者杀; P* N7 Z1 B# y, A: h
掉任意其他用户的作业等。 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队, 从事为Hadoop增加基于0 A+ D) v9 w. b+ J+ C+ K2 o
Kerberos和Deletion Token的安全认证和授权机制的工作。$ F7 J- R- }1 J" s6 J3 H
❑MRv1: 正如前面所述, 第一代MapReduce计算框架由三部分组成: 编程模型、 数据处理引擎和运行时环境。 其中, 编程
% l% b* C' t4 c. S模型由新旧API两部分组成; 数据处理引擎由MapTask和ReduceTask组成; 运行时环境由JobTracker和TaskTracker两类服务组成。" m4 R6 J! r( E5 J& T$ y
❑ MRv2/YARN [10] : MRv2是针对MRv1在扩展性和多框架支持等方面的不足而提出来的, 它将MRv1中的JobTracker包含的
0 D& K) f" N! j+ Z0 B ]资源管理和作业控制两部分功能拆分开来, 分别将由不同的进程实现。 考虑到资源管理模块可以共享给其他框架使用, MRv2将+ ?0 q5 f7 G% b/ D/ J& V3 m ]9 `) V( K
其做成了一个通用的YARN系统, YARN系统的引入使得计算框架进入了平台化时代。
% c* ]8 ^% S _& M: K& J9 o❑ NameNode Federation [11] : 针对Hadoop 1.0中NameNode内存约束限制其扩展性问题提出的改进方案, 它使NameNode可以
! A+ G0 _% x `2 {横向扩展成多个, 其中, 每个NameNode分管一部分目录, 这不仅使HDFS扩展性得到增强, 也使HDFS具备了隔离性。$ M7 E; X+ }' |
❑ NameNode HA [12] : 大家都知道, HDFS NameNode存在NameNode内存约束限制扩展性和单点故障两个问题, 其中, 第一
# U; z# W% ^4 F个问题通过NameNode Federation方案解决, 而第二个问题则通过NameNode热备方案( NameNode HA) 实现。& n4 s! r$ b- z. F
到2013年8月为止, Apache Hadoop已经出现四个大的分支, 如图2-5所示。 X, u( H U: v: q8 L3 X' h
图2-5 Hadoop版本 变迁图 [13]2 g, x5 K. J& \2 U$ ^
Apache Hadoop的四大分支构成了三个系列的Hadoop版本。! K3 T: P3 T' b8 J+ j
( 1) 0.20.X系列+ ^8 l3 a1 w* {" a
0.20.2版本发布后, 几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。 值得一提的主要有两个特性: Append与8 T5 B8 L) E' S) F) ?! C. j4 A' v/ L
Security。 其中, 含Security特性的分支以0.20.203版本发布, 而后续的0.20.205版本综合了这两个特性。 需要注意的是, 之后的% V5 X4 j7 x( ?- a# U
1.0.0版本仅是0.20.205版本的重命名。 0.20.X系列版本是最令用户感到疑惑的, 因而它们具有的一些特性, trunk上没有, 反之
6 B5 E8 P$ M! x/ D$ l0 k- Rtrunk上有的一些特性0.20.X系列版本却没有。
2 B ?" h5 X$ J( 2) 0.21.0/0.22.x系列8 Q8 W2 i. K. E' u! D
这一系列版本将整个Hadoop项目被分割成三个独立的模块, 分别是Common、 HDFS和MapReduce。 HDFS和MapReduce都对* P" f/ s- \" k" v y- g8 \
Common模块有依赖, 但是MapReduce对HDFS并没有依赖, 这样, MapReduce可以更容易运行在其他的分布式文件系统之上, 同
( R4 J! A( ?# G) n' ^* C8 [0 q时, 模块间可以独立开发。 具体各个模块的改进如下:
+ W' B0 M q( B3 t❑Common模块: 最大的新特性是在测试方面添加了Large-Scale Automated Test Framework [14] 和fault injection framework [15] 。9 `0 |/ ?: X* ^( Y$ f& l
❑HDFS模块: 主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode改进( secondary namenode被剔
5 E" P S5 Z6 a8 A6 V, E. _除, 取而代之的是checkpoint node同时添加一个backup node的角色, 作为NameNode的冷备) 、 允许用户自定义block放置算法等。
* ]2 M' v; |) b s3 S❑MapReduce模块: 在作业API方面, 开始启动新MapReduce API, 但仍然兼容老的API。
8 T; x4 V+ d6 t1 l( u9 b0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。6 n) q; l/ {; i' V# V% n' F
( 3) 0.23.X系列
3 a2 L6 U) J% ]" Y0.23.X是为了克服Hadoop在扩展性和框架通用性方面的不足而提出来的, 它包括基础库Common、 分布式文件系统HDFS、 资, T! M0 ~* B, q1 d) d0 W5 c1 T
源管理框架YARN和运行在YARN上的MapReduce四部分, 其中, 新增的可对接入的各种计算框架( 如MapReduce、 Spark [16]
/ E) F r$ r6 W4 ~. m# f等) 进行统一管理, 该发行版自带MapReduce库, 而该库集成了迄今为止所有的MapReduce新特性。: L+ m. B+ t v" u+ {4 s# p. v( K
( 4) 2.X系列( h; U/ z7 x6 j7 f3 p x o9 b6 ~$ ^
同0.23.x系统一样, 2.X系列属于下一代Hadoop, 与0.23.X相比, 2.X增加了NameNode HA和Wire-compatibility等新特性。
, u2 W" d4 u9 l$ N( t/ H1 p& `3 N表2-1总结了Hadoop各个发布版的特性以及稳定性。
- W2 w, d) ]4 r% Z) m* g表2-1 Hadoop各个发布版特性以及稳定性% a1 Z. c2 g2 S! y4 n6 Q& l1 k: X
㈣0.22.0版本中只有HDFS Security, 没有MapReduce Security。
3 n. y1 p5 G0 N; ` M& u( k1 k本书介绍的Hadoop YARN设计思想适用于所有Apache Hadoop 2.x版本, 但涉及具体的体现( 指源代码级别的实现) 时, 则以
$ S( P. } ~, {9 I2 ^* |0 OApache Hadoop 2.2.0及更高稳定版本为主。0 Z- N( u0 o& n6 Y/ G( ~
[1] 下载地址为http://archive.cloudera.com/cdh/3/。
/ y! h9 F/ f$ X" _' t9 m[2] 下载地址为http://archive.cloudera.com/cdh4/cdh/4/。- I# x! t9 _7 N9 E" V. q5 }- P
[3] 官方网址: http://incubator.apache.org/mesos/。7 p8 M, `6 S `8 ?( O
[4] 官方网址: http://www.adaptivecomputing.com/products/open-source/torque/。' z1 Y, p- g& @& U1 T0 C" H. K
[5] 0.20-append: https://issues.apache.org/jira/browse/HDFS-200。 0.21.0-append: https://issues.apache.org/jira/browse/HDFS-265。
5 z6 a% C( \8 N5 T9 L. f[6] 参考http://hbase.apache.org/book/hadoop.html。
% m/ Z9 l% Z( |% f4 i& x[7] 参考http://wiki.apache.org/hadoop/HDFS-RAID 与https://issues.apache.org/jira/browse/HDFS-503。
& u( V* v A1 ]2 K[8] 参考https://issues.apache.org/jira/browse/HDFS-245。& |# [& x2 H/ w( Y/ S
[9] 参考https://issues.apache.org/jira/browse/HADOOP-4487。5 \7 z" z$ I8 v
[10] 参考https://issues.apache.org/jira/browse/MAPREDUCE-279。! n0 x1 f' z# d% c9 o3 g
[11] 参考https://issues.apache.org/jira/browse/HDFS-1052。
) x) W2 c; |- n2 C6 w[12] 参考https://issues.apache.org/jira/browse/HDFS-1623。
3 \$ k5 l- @ h! P* b[13] 图片修改自http://www.cloudera.com/blog/2012/01/an-update-on-apache-hadoop-1-0/。9 c% `9 t. D( O9 \2 q% g
[14] 参考https://issues.apache.org/jira/browse/HADOOP-6332。, W& L W. D' v1 ~8 T
[15] 参考https://issues.apache.org/jira/browse/MAPREDUCE-1084。
0 \" C/ n2 z b* t+ L0 i- a[16] Spark是一种内存计算框架, 支持迭代式计算, 主页是http://www.spark-project.org/。
# g. H8 [; h+ y% m* J( t0 Z* Z! ]) G
6 G8 J p' X, B |
|