SlideShare a Scribd company logo
1 of 17
Download to read offline
HDFS元数据的独立服务和
独立持久化存储
2009-8-22
罗李
Email: luoli523@gmail.com
Twitter: luoli523
主要内容
起因
现状
我们的想法
我们的实现
后续的发展
起因
• 数据的急剧膨胀
• 文件数的不断增多
• Block随之成倍的增长
• 内存的急剧上涨
• 内存数据结构
• 一致性保证造成的性能瓶颈
• Meta服务依靠namenode的启停
• 部分meta数据没有持久化(block->dn)
现状
• 集群
– 单个集群1900台机器 1T×12(2T×6)
• 数据量
– 22.28 PB/36.98 PB 60%
• 文件数
– 1亿左右
• Block数
– 1.3亿左右
• Meta存储
– 只持久化了namespace的信息到fsimage
现状
• 内存
– 60G / 80G ~75%
• 数据结构
– BlockMap靠内存中ref来维护block->dn的信息
• 响应
• 删除文件个数1100万,每天的删除操作为240万
• 创建文件操作900万~1200万
• 重命名文件数量为1050万
• 通过文件名获取block及其位置的操作getBlockLocations有近3亿
• 类似“ls”的操作有700万
新的架构
Stateless
Namenode
Stateless
Namenode … Stateless
Namenode
(Innodb on FusionIO)
State Manager
(Innodb on FusionIO)
State Manager
Zookeeper
Datanode Datanode Datanode Datanode
…
Datanode Block File
BlockChecker
Zookeeper
7
Namenode的改进
• 无状态NN: 针对HDFS中Namenode单点瓶颈的问题,TBFS通过无状态方式
实现Namenode的水平扩展。为了实现无状态Namenode,需要将以前保留
在Namenode内存中的关键数据结构部分或全部挪到第三方,并持久化保存。
数据结构名称 描述
dir 保存HDFS目录结构的数据结构FSDirectory(文件->块的对应关系)
blocksMap 保存块与文件、块与datanode和datanode与块的对应关系
datanodemap 保存datanode的storageID和对应DatanodeDescriptor的Map容器
heartbeats 保存拥有心跳的Datanode的DatanodeDescriptor的容器
corruptReplicas 保存损坏块的Map容器,key为Block,value为对应Datanode的DatanodeDescriptor集合
recentInvalidateSets 保存即将删除的块的Map容器,key为Datanode的StorageID,value是块的Block集合
excessReplicateMap 保存多余块的Map容器,key为Datanode的storageID,value是块的Block集合
neededReplications
保存少于replication数的块的数据结构,其内部维护了一个List<TreeSet<Block>>
类型的优先级队列
pendingReplications 保存处于replication pending状态的block,如果超时则放入TimeoutItems列表中
leaseManager 维护写操作和追加操作租约的数据结构
Stateless
Namenode
8
Namenode的改进(续1)
Stateless
Namenode
(Innodb on FusionIO)
State Manager
(Innodb on FusionIO)
State Manager
Datanode Block File
Zookeeper
blocksMap
dir
datanodeMap
heartbeats
将BlocksMap和FSDirectory在数
据库中实现持久化保存
datanodeMap和heartbeats的数据从数据
库中读取,Namenode中只是缓存
ZooKeeper
namenode
lease
pendin
g
under excess corrupt invalidate group
datanode blockchecker…
/
为LeaseManager保
存全局lease信息
维护replication
pending相关的
持久化数据
LeaseManger
维护under
replication
相关的持久
化数据
维护excess
replication
相关的持久
化数据
维护corrupt
块相关的持
久化数据
维护
invalidate
块相关的持
久化数据
维护TBFS
集群中
namenode
成员信息
• 基于树状结构来描述Map和Set,比
较直观,操作方便
• 提供了ephemeral和sequence
znode的机制,方便做成员管理和提
供分布式锁服务
• 提供了Watcher机制,提供对数据变
化的通知
Stateless
Namenode
9
Namenode的改进(续2)
• Namenode与非心跳Datanode进行通信。Datanode实现了
ExternalNamenodeProtocol协议,Namenode可以通过该协议与非心跳
Datanode进行通信,即Namenode主动调用该协议提供的方法。
Datanode A
Datanode B
Namenode 1
Namenode 2
sendHeartbeat
ExternalNamenode
Protocol
ExternalNamenode
Protocol
ExternalDatanode
CommandsHandle
r
ExternalDatanode
CommandsHandle
r
Datanode
Protocol
offerSerivce
sendHeartbeat
Datanode
Protocol
offerSerivce
Namenode 2是Datanode
A的External Namenode
与原有方式一致,External
Namenode向External
Datanode发送三种命令:
replication命令,invalidate
命令和recover命令
10
BlockChecker的引入
• BlockChecker解决Namenode无法判断出的数据不一致的情况,主要是检测
Block副本数是否满足期望,类似于社区版中离开安全模式(SafeMode.leave)时
processMisReplicatedBlocks机制。为了不影响Namenode的核心逻辑,它只和
数据库和Zookeeper交互。
• 运行方式:1. 每隔一段时间运行一次;2. 手动执行;3. Namenode下线时执行
• 典型场景:
– 某个block的副本数小于期望值,在数据库中增加一条伪记录,触发Namenode进行检查
– 某个block的副本数大于期望值,综合zookeeper中的记录,决定是否删除一条记录,触发
Namenode进行检查
(Innodb on FusionIO)
State Manager
(Innodb on FusionIO)
State Manager
Zookeeper
Datanode Block File
BlockChecker
Zookeeper
11
Datanode的改进
• 提供Namenode的连接/重连机制,从而提高整个系统的可用性。在以下几种
场景下,Datanode会连接/切换目标Namenode: 1. Datanode启动时;2. 当
前Namenode失效(异常)并超过一定时限和重试次数;3. 管理员调用切换
命令。同一时刻一个Datanode只汇报给一个Namenode。
• Namenode选择策略实现: AbsNameNodeSelector作为选择Namenode策略
的接口,ConfNameNodeSelector实现了该接口。
<<AbsNameNodeSelector>>
+ selectNextNameNodeAddress()
+ refreshNameNodeList()
DataNode
调用
Private AbsNameNodeSelector
namenodeSelector;
ConfNameNodeSelector
+ selectNextNameNodeAddress()
+ refreshNameNodeList()
实现
selectNextNameNodeAddress : 从Name Node列表中随机选
取一个Name Node返回给调用者,并记录下来。注意,每次调
用时会将上次使用的Name Node从列表中删除,这样就避免再
次选择失效的Name Node
refreshNameNodeList: 按照策略更新Name Node列表
12
Datanode的改进(续1)
• 目前已实现的Namenode选择策略ConfNameNodeSelector需要在配置文件中做如下配
置:
• Datanode在线辅助判断机制。Datanode上线后,在zookeeper中创建一个Ephemeral
Node,用以给Namenode判断该Datanode是否在线。该类型的Node会在Datanode下
线后(会话失效)自动删除。如果Namenode通过datanode表中的lastupdate判断已经下
线,但是zookeeper中还有对应的node,会将其列入怀疑对象。造成这种现象一般在
TBFS重启初期,Namenode信息更新不及时。怀疑对象一般会在下一次更新时自动排
除,否则就认为它已经下线。
<property>
<name>dfs.namenode.selector</name>
<value>org.apache.hadoop.hdfs.server.common.ConfNameNodeSelector</value>
<description>The policy of looking for and selecting name node</description>
</property>
<property>
<name>dfs.namenode.selector.timeout</name>
<value>180000</value>
<description>The timeout value for retrying connection to a namenode</description>
</property>
<property>
<name>dfs.namenode.rpcaddr.list</name>
<value>hdfs://dw30.kgb.sqa.cm4:51199,hdfs://dw39.kgb.sqa.cm4:51199</value>
<description>The list of name nodes' RPC addr list, separated with comma</description>
</property>
ConfNameNodeSelector的
类路径
一个Namenode失效后重连
的超时时间
Namenode的列表
开始
设置策
略
结束
Y
N
N
Y
连接成
功
Y
移除NN
N
获得
NN列
表
Y
N
取一个
新NN
DN启动时设定,目前包括两方面:1. 从
何处获得NN列表(包括配置文件或者
zookeeper);2. 如何选择NN(随机或
者根据某种权值)
在Data Node初始化时执行下面的逻辑,
会重构DataNode类的startDataNode方
法
流程一:DN启动
时连接NN。DN
需要根据选取策
略,从NN列表中
选取一个可用的
NN地址建立连接,
否则流程失败
在配置文件中,NN之间以逗号隔开;如
果从zookeeper中读取,需要讨论接口。
该列表用List<String> NNList表示
将该失败的NN从NNList中
移除
从NNList中根据选择策略选择一个
Name Node,如果NNList中已经没有可
用的,则返回失败
连接成功,可以进行通信
开始
结束
N
连接成
功
Y
移除NN
N
Y
取一个
新NN
流程二:当前已
连接的NN失效,
DN重新选择NN,
并进行连接
将该失败的NN从NNList中
移除
从现有的NNList中根据选择策略选择一
个Name Node,如果已经没有NN,则
试图根据既定策略重新获得列表
获得
NN列
表
Y
是否已
更新过
N
Y
如果侦测到当前NN失效,则开始下面的
操作
N
检查是否已经重新更新过,如果已经更
新过,说明所有NN都不可用
第一次更新,可以重新获得列表,如果
失败则结束流程
连接成功,可以进行通信
开始
结束
Y
获得新
NN列表
流程三:手动或
自动更新NN列表
根据策略获得新的NN列表,如果无
法获取,则返回失败
由管理员或者后台监控进程发起更新
NN列表操作
替换现有NN列
表 更新NNList操作
N
16
Client的改进
• 重连机制
• 和datanode同样的机制选择NN节点
谢谢
罗李
Email: luoli523@gmail.com
Twitter: luoli523

More Related Content

What's hot

2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
Jazz Yao-Tsung Wang
 
1.4 go在数据存储上面的应用—毛剑
1.4 go在数据存储上面的应用—毛剑1.4 go在数据存储上面的应用—毛剑
1.4 go在数据存储上面的应用—毛剑
Leo Zhou
 
Google big table 中文版
Google big table 中文版Google big table 中文版
Google big table 中文版
lovingprince58
 
Mr&ueh数据库方面
Mr&ueh数据库方面Mr&ueh数据库方面
Mr&ueh数据库方面
Tianwei Liu
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
Lucien Li
 
05 杨志丰
05 杨志丰05 杨志丰
05 杨志丰
锐 张
 

What's hot (20)

My fox 扩容与数据迁移
My fox 扩容与数据迁移My fox 扩容与数据迁移
My fox 扩容与数据迁移
 
MongoDB SHARE
MongoDB SHAREMongoDB SHARE
MongoDB SHARE
 
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
 
张铁安:Feed系统架构浅析
张铁安:Feed系统架构浅析张铁安:Feed系统架构浅析
张铁安:Feed系统架构浅析
 
1.4 go在数据存储上面的应用—毛剑
1.4 go在数据存储上面的应用—毛剑1.4 go在数据存储上面的应用—毛剑
1.4 go在数据存储上面的应用—毛剑
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
 
Google big table 中文版
Google big table 中文版Google big table 中文版
Google big table 中文版
 
Mr&ueh数据库方面
Mr&ueh数据库方面Mr&ueh数据库方面
Mr&ueh数据库方面
 
Mongo db 特性
Mongo db 特性Mongo db 特性
Mongo db 特性
 
Memcached浅析 韩建华
Memcached浅析 韩建华Memcached浅析 韩建华
Memcached浅析 韩建华
 
Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践
 
利用新硬件提升数据库性能
利用新硬件提升数据库性能利用新硬件提升数据库性能
利用新硬件提升数据库性能
 
Introduction to big data
Introduction to big dataIntroduction to big data
Introduction to big data
 
Enterprise Data Lake in Action
Enterprise Data Lake in ActionEnterprise Data Lake in Action
Enterprise Data Lake in Action
 
Level db
Level dbLevel db
Level db
 
Cassandra架构与应用
Cassandra架构与应用Cassandra架构与应用
Cassandra架构与应用
 
MongoDB gridfs
MongoDB gridfsMongoDB gridfs
MongoDB gridfs
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
Redis 介绍 -田琪
Redis 介绍 -田琪Redis 介绍 -田琪
Redis 介绍 -田琪
 
05 杨志丰
05 杨志丰05 杨志丰
05 杨志丰
 

Similar to Hdfs元数据的独立服务和独立持久化存储

开源+自主开发 - 淘宝软件基础设施构建实践
开源+自主开发  - 淘宝软件基础设施构建实践开源+自主开发  - 淘宝软件基础设施构建实践
开源+自主开发 - 淘宝软件基础设施构建实践
Wensong Zhang
 
H base 使用初体验
H base 使用初体验H base 使用初体验
H base 使用初体验
兴 施
 
淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务
drewz lin
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
drewz lin
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
Hesey
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构
drewz lin
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
Feng Yu
 

Similar to Hdfs元数据的独立服务和独立持久化存储 (20)

Tair
TairTair
Tair
 
浅析分布式存储架构—设计自己的存储- 58同城徐振华
浅析分布式存储架构—设计自己的存储- 58同城徐振华浅析分布式存储架构—设计自己的存储- 58同城徐振华
浅析分布式存储架构—设计自己的存储- 58同城徐振华
 
开源+自主开发 - 淘宝软件基础设施构建实践
开源+自主开发  - 淘宝软件基础设施构建实践开源+自主开发  - 淘宝软件基础设施构建实践
开源+自主开发 - 淘宝软件基础设施构建实践
 
李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
周敏奇:Cliaims—集群感知的内存计算系统
周敏奇:Cliaims—集群感知的内存计算系统周敏奇:Cliaims—集群感知的内存计算系统
周敏奇:Cliaims—集群感知的内存计算系统
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列
 
大规模数据库存储方案
大规模数据库存储方案大规模数据库存储方案
大规模数据库存储方案
 
H base 使用初体验
H base 使用初体验H base 使用初体验
H base 使用初体验
 
淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务
 
Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
 
内存数据库[1]
内存数据库[1]内存数据库[1]
内存数据库[1]
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
 
Mesos-based Data Infrastructure @ Douban
Mesos-based Data Infrastructure @ DoubanMesos-based Data Infrastructure @ Douban
Mesos-based Data Infrastructure @ Douban
 
百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化
 
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture][Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]
 
Hantuo openstack
Hantuo openstackHantuo openstack
Hantuo openstack
 

Hdfs元数据的独立服务和独立持久化存储