没有合适的资源?快使用搜索试试~ 我知道了~
HBase单点问题分析及分布式元数据管理方案
5星 · 超过95%的资源 需积分: 9 58 下载量 2 浏览量
2012-03-16
08:46:57
上传
评论
收藏 811KB DOCX 举报
温馨提示
试读
25页
HBase单点问题分析及分布式元数据管理方案,分析了Hadoop中HDFS的Namenode单点问题,并对此初步提出了相应解决方案
资源推荐
资源详情
资源评论
分布式 Namenode 解决单点问题
一、知识回顾
1、Namenode 和 Datanode
的体系架构采用主从结构,一个 集群由一个单一的 和多个
组成,是 的主服务器,主要负责管理文件系统的元数据。
负责存储文件的数据块。下面具体描述 和 的功能。
的功能主要有以下几点:
管理元数据和数据块
也可以称为元数据节点,它的主要功能就是管理文件的元数据信息。
中文件的元数据信息包括命名空间、文件到数据块的映射、数据块到数据节点的
映射三部分。还会对文件的数据块进行管理,包括创建新数据块、复制数
据
块、移除无效数据块以及回收孤立数据块等内容。
持久化元数据
为了加快元数据的访问,一般将文件的元数据存储在内存中,但为了元数
据的安全性,还会将元数据持久化到硬盘中。将元数据的修改操作记
录在事务日志中,事务日志一般存储在 节点的硬盘中。Namenode 将元数据信
息存储在 FsImage 文件中,持久化的元数据信息包括文件属性、文件到数据块的映射,而
数据块到数据节点的映射是在文件按系统启动时 Datanode 汇报给 Namenode 的,因此并
不需要将这些信息持久化。
处理请求
还负责处理客户端和 的请求。启动后会监听客户端和
的请求,对请求进行处理后返回结果。客户端的请求通常包括文件和目录的创建、
读写、重命名、删除,打开目录、移动目录等等。的请求一般包括数据块信息的
汇报、心跳响应、出错信息等等。
管理 Datanode
节点会定时向 节点发送心跳信息,通过心跳信息检测
失效或已恢复的 。
的功能主要包括以下几个方面:
数据块的读写
存储了文件的数据块,但它不记录数据块到文件的映射,这些信息是记录在
中的。因此,客户端不能直接与 打交道,它必须通过 获取
文件的数据块信息和位置后,才能与 联系进行文件的读写操作。
向 NameNode 报告状态。
每个 节点会定时向 发送心跳信息和数据块状态报告,
收集这些信息以了解集群的 节点的状态和数据块状态。如果 发现某个
节点失效,就会执行数据块的复制,将失效节点上的数据块通过其它副本复制到
一个正常的 Datanode 中,保证数据块的副本数达到指定的数量。
执行数据的流水线复制
在创建文件时,客户端从 节点获取到文件数据块的存储位置,包括数据块
副本的存放位置,客户端不会将数据块直接复制到每个副本存放的 节点中,而是
会进行数据块的流水线复制。客户端将数据块复制到第一个 节点上,第一个节点
将数据块复制到第二个节点中,第二个节点又向第三个节点复制,直到复制的数据块的数
量达到系统指定的数据块副本数量。在进行流水线复制当中,每个节点不是等到整个数据
块复制完成才向下一个节点复制,而是同时进行。
集群的单一的 节点的结构在某种程度上简化了系统的架构。只
有一个 ,这个 节点保存着文件系统所有的元数据信息,可以通过全
局的信息精确定位数据块的位置并进行复制决策。
2、元数据
在 节点内存中,保存有三种类型的元数据信息,它们是文件命名空间、文
件到数据块的映射、数据块到数据节点的映射。为了提高系统的可靠性,通常要将元数据
的修改操作保存在磁盘中,以便在 宕机时可以将元数据恢复。在 中,通
常是将文件命名空间和文件到数据块的映射的修改操作记录并保存在硬盘中,系统重启时
通过日志文件将这两种元数据加载到内存中。对于数据块到数据节点的映射关系,系统并
没有将它们进行持久化,这是由于数据块的存放位置不固定且经常发生发生变化,对其持
久化没有实际意义。
对系统的数据块进行管理,需要在 宕机时复制失效 中
的数据块,回收 集群中无效的数据块和孤立的数据块,在 之间迁移数
据块来使系统负载均衡。通常会周期性地去扫描系统的元数据信息来做出这些
操作,由于 内存中保存有所有的元数据信息,所以 扫描元数据是非
常快速的。元数据信息通常来说是非常小的,对一般的应用场景所需的存储容量来说,元
数据信息可以完全放在内存中。假设 有 的内存,那么它可以存放存储容量
为 的文件系统的元数据信息,当存储容量扩充时,可以增加 的内存。
并没有对数据块到 的映射关系进行持久化,而是在系统启动时从
获得,启动后通过 的心跳响应信息定期更新。在 集群中,对某个
发生失效的概率是很低的,但当集群中 节点的数量通常达到数千个,
发生节点失效的概率变得很大,节点失效已成为系统的常态 ,集群会频繁发生
的加入、离开、宕机或重启,因此,只有 自身才能确定其本地磁盘中的数据块位
置信息,因而不需要将该信息持久化到 中。而且,也不用去维护 与
的一致性问题。
中保存了元数据的修改的历史记录,因而它发挥着非常重要的作用。 不
但对元数据信息进行持久化,还对元数据的修改顺序的逻辑时间线进行记录,而逻辑时间
是对文件和数据块进行查找确认的唯一标示。因此,存储的安全性和可靠性十分重
要。为了防止系统丢失客户端对文件系统最近几次操作的记录,系统应该保证在客户端对
元数据的修改操作之前将操作信息记录到 中。为了保证数据的一致性,
在重启时会根据磁盘中的元数据信息和 快速地进行数据恢复。
服务器在启动时,会进行检查点操作。在 现在的版本的实现中,
只在启动时创建一个检查点,在以后的版本中,可能会进行周期性地
检查点创建。为了了解检查点操作的过程,下面我们先了解二级元数据节点
的概念。
Secondary Namenode 并不是 Namenode 的一个备份, 的作用是
和 !分不开的。将对文件系统的改动追加保存到本地文件系统上
的一个日志文件()。当一个 启动时,它首先从一个映像文件
()中读取 的状态,接着应用日志文件中的 操作。然后它将新的
状态写入()中,并使用一个空的 文件开始正常操作。因为 只有
在启动阶段才合并 和 ,所以久而久之日志文件可能会变得非常庞大,特别是
对大型的集群。日志文件太大的另一个副作用是下一次 NameNode 启动会花很长时间。
Secondary NameNode 定期合并 FsImage 和 Edits 日志,将 日志文件大小控制在一个限
度下。因为内存需求和 在一个数量级上,所以通常 和
运行在不同的机器上。合并过后的 会在 保存一份保证
失败的时候可以进行恢复一个检查点的过程如图 "所示。
首先, 通知 生成新的日志文件,以后的日志都写到新
的日志文件中。然后, 用 hp get 从 获得 文件及
旧的 。其次, 将 #文件加载到内存中,并执行日志文件
中的操作,然后生成新的 # 文件 #$。再次, 将
#$用 %&''传回 。最后,将旧的 文件及旧的
,换为新的 #$和新的 第一步生成的,然后更新 ( 文件,写
入此次检查点发生的时间。这样 NameNode 中的 FsImage 文件保存了最新的 checkPoint 的
元数据信息,日志文件也重新开始,不会变的很大了。
3、数据组织和数据交互
、 数据组织
中,数据存储的最小单位是一个数据块#$,HDFS 默认的数据块大小是
64M。一个文件通常被拆分成多个数据块,这些数据块全部按照一定的部署策略存放在数
据节点中。这种设计方式的好处是:首先,减少了客户端与 通信的
需求,对于同一块数据块的读写客户端只需要向 发送一个获取数据块位置信息
的初始请求即可,这极大程度的降低了 节点的负荷;其次,对大多数文件来说,
)*大小的块足够大,客户端基本上可以在一个给定的数据块上进行多次操作,这也大大
降低了网络通信的负荷,使其可以在一段时间内与 之间维持一个 +,连接;最后,
这样的设计方式是减少了元数据的大小,降低了 的存储负荷。
当 客户端进行一个创建文件的操作时,会将该操作请求发送给 ,但该
请求不会立即发送,而是被缓存在本地的一个临时文件中,应用程序的写操作会被透明地
重定位到这个临时文件中。当客户端对临时文件进行写操作的数据大小达到一个 数
据块大小时,客户端才会将创建文件的请求发送给 ,Namenode 将该文件插入
到文件命名空间,并为文件的第一个数据块选择一个 Datanode 进行存放,将 Datanode 的
标识返回给客户端。客户端与这个 建立连接并进行流式写操作,将文件的第一个
数据块存储在 中。当文件的第一个数据块写完成后,客户端会再次向
申请获得下一个数据块存放的 进行写入,直到文件数据全部写完。当文件关闭时,
在临时文件中剩余的没有写满的数据块也会传输到指定的 ,然后客户端通知
文件已经关闭。这时,才将文件创建操作提交并完成持久化存储。
上述方法是对通过对 上运行的目标应用认真考虑的结果。如果不采用客户端缓
存,网络速度和网络堵塞会对系统的吞吐量造成比较大的影响。
目前,考虑到运行在分布式文件系统上的涉及大数据集的操作的应用程序,这种读写
方法已经被广泛应用。对于涉及大数据集的操作的应用程序,需要采用流式读写的方式来
读写文件,如果在客户端不利用缓存而直接将数据写入远程文件中,这时的网络环境将会
对数据的吞吐量造成极大的影响。因此,在许多的分布式文件系统中,都是用客户端缓存
来改善文件系统的读写性能,同时为了获得更好的数据上传性能,也降低了 -.规范的
要求。
当某个客户端向 文件写数据的时候,一开始是写入本地临时文件,当写入的临
时文件达到一个完整的数据块的大小时,客户端就会从 获取一张 列表
来存放该数据块(包括数据块的副本),假设该文件的 '#(因子设置为 ,那么
列表也包含 个 。然后,客户端开始向第一个 传输数据,第
剩余24页未读,继续阅读
资源评论
- walkmannick2017-11-10看起来不错,但是打不开呀
- tigersjtu2012-09-21内容不错,细节讲得比较清楚。谢谢
- r_fei2012-04-05技术上写得很清楚,但缺少项目本身来龙去脉的交代,让人无法了解具体应用场合。
- dc_3qyou2015-03-13内容不错 学习还是很实用
- daogehao2014-02-10非常细的东西,可作为了解使用
风云龙儿
- 粉丝: 50
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功