5. H ad o o p 一个分布式系统基础架构,由 Ap ac h e 基金会开
发。用户可以在不了解分布式底层细节的情况下,开发分
布式程序。充分利用集群的威力高速运算和存储 。
H ad o o p 是项目的总称,主要是由分布式存储
( H D FS )、分布式计算( Map Re d u c e )组成 。
H ad o o p 程序目前只能运行在 Lin u x 系统上, win d o w 上
运行需要安装其他插件,安装过程见《 h ad o o p 安装说
明 .d o c x 》 。
6. 可扩展:不论是存储的可扩展还是计算的可扩展都是 H ad o o p
的设计根本。
经济:框架可以运行在任何普通的 PC 上。
可靠:分布式文件系统的备份恢复机制以及 Map Re d u c e 的任
务监控保证了分布式处理的可靠性。(元数据磁盘错误,心跳
测试,副本数,快照(目前还没实现))
高效:分布式文件系统的高效数据交互实现以及 Map Re d u c e
结合 Lo c al D ata 处理的模式,为高效处理海量的信息作了基础
准备。
7.
8. 名称节点( N am e N o d e ):管理文件系统的命名
空间,记录文件系统树及这个树内所有的文件和索
在 Hadoop 的系统中,会有一台 Master ,主要负责
引目录,同时也记录每个文件的每个块,所在的数
NameNode 的工作以及 JobTracker 的工作。 JobTracker
据节点。
的主要职责就是启动、跟踪和调度各个 Slave 的任务执行。
还会有多台 Slave ,每一台 ):文件系统的工作者,
数据节点( D ataN o d e Slave 通常具有 DataNode 的功
能并负责 TaskTracker 的工作。 TaskTracker 根据应用要
存储并提供定位块的服务,并定时向名称节点发送
求来结合本地数据执行 Map 任务以及 Reduce 任务。
块的存储列表
Jo b Trac ke r :协调作业的运行。
Tas kTrac ke r :运行作业划分后的任务。
11. 低延迟数据访问
H D F S 是为了达到高数据吞吐量而优化的,这是以延迟
为代价的,对于低延迟访问,可以用 H b as e ( h ad o o p
的子项目)。
大量的小文件
多用户写入,任意修改
12. 储存基本单元
B lo c k( 块 ) : H D F S 基本储存单元,是个逻辑单元,和 o s 中的页
类似。
一个文件有可能包含多个块,一个块有可以包含多个文件,由文
件的大小和块大小的参数决定。
d fs .b lo c k.s ize 参数。 H d fs 中 B lo c k 的大小,默认 64MB ,
如果设置大,就会有可能导致 Map 运行慢,设置小,有可能导
致 Map 个数多,所有一定要设置适当。(目前主流机器建议设置为
1 28M )
13.
14. Hdfs 集群框架图
文件写入:
b. C lie n t 向 N am e N o d e 发起文件写入的请求。
d. N am e N o d e 根据文件大小和文件块配置情况,返回给 C lie n t 它所管理部
分 D ataN o d e 的信息。
f. C lie n t 将文件划分为多个 B lo c k, 根据 D ataN o d e 的地址信息 , 按顺序写
入到每一个 D ataNo d e 块中。
文件读取:
i. C lie n t 向 N am e N o d e 发起文件读取的请求。
k. N am e N o d e 返回文件存储的 D ataN o d e 的信息。
m. C lie n t 读取文件信息。
15. N am e N o d e 记录着每个文件的元数据。每个文件在那个
块中,每个数据节点包含哪些块。(不储存原始文件)
D ataN o d e 是文件的工作者,它们存储文件并提供定位块
的服务,并且定时向名称节点发送它们的存储块的列表
。
(储存原始文件)
3. 重要参数
d fs .re p lic atio n .m in 参数。最小为 1 ,表示每个块在
H D F S 中的副本个数。
16.
17.
18. B lo c k 的放置:默认不配置。一个 B lo c k 会有三份备份,一份放在
N am e N o d e 指定的 D ataN o d e ,另一份放在与指定 D ataN o d e 非同一 Rac k
上的 D ataN o d e ,最后一份放在与指定 D ataN o d e 同一 Rac k 上的 D ataN o d e
上。备份无非就是为了数据安全,考虑同一 Rac k 的失败情况以及不同 Rac k
之间数据拷贝性能问题就采用这种配置方式。
心跳检测 D ataN o d e 的健康状况,如果发现问题就采取数据备份的方式来保
证数据的安全性。
数据复制(场景为 D ataN o d e 失败、需要平衡 D ataN o d e 的存储利用率和需
要平衡 D ataN o d e 数据交互压力等情况):这里先说一下,使用 H D FS 的
b alan c e r 命令,可以配置一个 Th re s h o ld 来平衡每一个 D ataN o d e 磁盘利用
率。例如设置了 Th re s h o ld 为 1 0% ,那么执行 b alan c e r 命令的时候,首先
统计所有 D ataN o d e 的磁盘利用率的均值,然后判断如果某一个 D ataN o d e
的磁盘利用率超过这个均值 Th re s h o ld 以上,那么将会把这个 D ataN o d e 的
b lo c k 转移到磁盘利用率低的 D ataN o d e ,这对于新节点的加入来说十分有用
。
22. Writab le 接口
序列化 : 指的是将结构化对象转换为字节流以便网络进行传输
或者写入存储的过程。
反序列化 : 指的是将字节流转为一系列结构化对象的过程。
(j ava 定义的序列化和反序列化工具不够紧凑,高效)
在 h ad o o p 中,常规 JAVA 数据类型是不能表示 H d fs 的数据类
型的,
例如 h d fs 中的字符串不是 s trin g 类表示,而是 Te xt 类,
这些
数据类型都必须实现一个 writab le 接口 。
Writab le 是 H ad o o p 的核心 (Map Re d u c e 程序使用他来序列化
键 / 值对 ) :
vo id write (D ataO u tp u t o u t) th ro ws IO E xc e p tio n ;
vo id re ad F ie ld s (D ataIn p u t in ) th ro ws IO Exc e p tio n ;
分别实现对数据的序列化和反序列化。
23.
24. 1 . 对 Java 中的 in t 型进行封装那么就是 h ad o o p 中的 In tWritab le
类
在写程序时可以把 In tWritab le 可以看着是 in t 类型,它实现
了 Writab le C o m p arab le 接口。 Writab le C o m p arab le 又是
Writab le 、 j ava.lan g .c o m p arab le 接口的子接口。
2.Writab le 类对所有的 Java 基本类型进行封装:
如: b o o le an - > B o o le an Writab le ; B yte - >
B yte Writab le
3. 我们可以自定义 Writab le 接口,来编写更复杂的结构的类。
核心: h ad o o p 有自己一套的 I/O 机制。 I/O 类都必须实现
Writab le 接口。
25.
26. 2 : get new job ID
MapReduce 1 : run job
JobClient JobTracker 5:initialize job
程序 4:submit job
6:retrieve Jobtracker 节点
客户端 JVM 3:copy Input splits 7:returns task
Job
rescouce
TaskTracker
8:retrieve job
HDFS resources 9:launch
子 JVM
户端: 提交 Map Re d u c e 作业, Child
即一个 j b 。
o 10:run
b Trac ke r : 协调作业的运行。
MapTask 或者
s kTrac ke r :作业划分后的任务 ReduceTask
(一个 j b 对应多个 tas k,
o
Tasktracker 节点
一个 tas k 对应一个
或者多个 Map Re d u c e 线程)。
27.
28. 2.1 根据输入数据的大小和参数的设置把数据分成 s p lits ,
每个 s p lit 对于一个 m ap 线程。
2.2 S p lit 中的数据作为 Map 的输入, Map 的输出一定在 Map 端。
2.3 Map 的输出到 Re d u c e 的输入的过程 (s h u ffle 过程 ) :
第一阶段:在 m ap 端完成
内存 - > 排序 - > 写入磁盘 - > 复制
分区 - > 排序 - > 分区合并 - > 合并后分区 - > 复制
第二阶段:在 re d u c e 端完成
映射到 re d u c e 端分区 - > 合并 - > 排序
2.4 Re d u c e 的输入到 Re d u c e 的输出
最后排好序的 ke y/valu e 作为 Re d u c e 的输入,输出不一定
是在 re d u c e 端。
29. Map Re d u c e 是 H ad o o p 程序的体现。框架极其简单:首
先是对 Map Re d u c e 程序运行前的参数配置,然后编写
Map 类 ( 实现 Map 方法 ) ,最后是 Re d u c e 类 ( 实现
Re d u c e 方法 ) 。
Map Re d u c e 程序的每个细节都与设置的参数有很大的关
系,参数设置的好,程序的效率肯定得到提高。
Map 方法: Map (k1 ,v1 ) - > lis t(k2,v2) ,并行应用于每
一个输入的数据集,每一次调用都会产生一个 (k2,v2) 的
队列 。
Re d u c e 方法: Re d u c e (k2,lis t(v2)) - > lis t(k3,v3) 。收
集 m ap 端输出队列 lis t(k2,v2) 中有相同 ke y 的数据对,
把它们聚集在一起,输出时形成目的数据 lis t(k3,v3) 。