ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【HDFS】HADOOP DISTRIBUTED FILE SYSTEM

【HDFS】HADOOP DISTRIBUTED FILE SYSTEM

原创 Linux操作系统 作者:leonarding 时间:2012-06-27 21:44:56 0 删除 编辑

1.HDFS第一次亲密接触
答:那是在2012年的第一场雪,公司项目会议上中国联通总部运维部提出二期项目要使用“Hadoop HDFS 分布式集群储”,听到这个词的时候感觉有点云里雾罩,那是我第一次听到Hadoop HDFS,有了这个开头我慢慢的开始关注和学习HDFS,初次只是知道是一个“分布式存储文件系统”可以把数据分布在若干节点,均衡负载并行处理数据,提高数据处理效率,分布的存储在不同节点上思想,很创新,这是我以前没有从来没有遇到过的,后来了解到现在的各大电商,各大互联网公司都在逐步涉猎分布式系统,例如 新浪 已经开始着手研发mysql+hadoop   腾讯  也在开发自己的hadoop分布式系统。这对我们来说既是机遇也是挑战。

展示一下腾讯HDFS底层存储与上层应用

 

下面我把在网上看到的一篇《HADOOP DISTRIBUTED FILE SYSTEM》漫画版 理论与实践,其中的精髓部分跟大家一起分享一下,这里也写出了我的心得体会,下

面的文章会比较浅显易懂、生动幽默非常适合初学者和刚刚接触HDFS的朋友。

 

2.HADOOP DISTRIBUTED FILE SYSTEM  漫画版解读

 

HDFSHADOOP  DISTRIBUTED  FILE  SYSTEM

THE  CAST

CLIENT 人们都坐在客户端前,向客户端输入/输出数据

NAMENODE 服务端只有一个,负责协调HDFS存储系统,例如 数据分配情况,备份策略,故障诊断等

DATANODE 用于存储数据的集合,结构为 一个cluster包含诺干个racks ,一个racks 包含诺干个 datanodedatanode也就相当于我们磁盘,而racks相当于磁盘阵列

 

HDFS 系统write操作

一个人对client说:请帮我写入200M数据好吗?

Client speak:我很荣幸,但你没有忘记什么嘛?

一个人说:a 划分块大小128M(用于存放数据)  b 复制一个块到三个地方

Client speak:一个合格的client要知道2件事

1)块大小:一个大文件存储在若干个块中,每个块通常64M or 128 M

2)多路复用:一个块要保存到多个地方,通常为3

 

u Client  ask  Namenode

第一步  client划分一个大文件的块大小,用于存储文件内容

第二步  clientNamenode说请帮助我分配一个128M的块(datanode上)并多路复用到3个地方

 

u namenode分配datanode

第一步  Namenode需要找到3datanode

第二步  Namenode整理一下3datanode地址,发送给client

 

u Client 开始写数据

第一步   Client发送数据只到第一个datanode节点,当第一个datanode节点接收到数据的同时会同步到第二个datanode节点,第二个也会同步到第三个节点,以此类推直到最后一个节点为止

第二步   一旦所有的数据都写入磁盘后,所有的datanode就向Namenode发送完成信号

第三步   Namenode就会显示块已保存,并且已经复用

第四步   Client会用同样的步骤完成后续数据写入

 

u 当写完所有块后

第一步   当写完所有块后,Client就会关闭文件,并告之Namenode停止传输

第二步   Namenode此时就会知道所有的数据信息都保存在磁盘中

 

u Recap重述

Client          用于划分保存文件的块

Namenode  用于提供保存块的datanode节点信息,包括所有的多路复用节点

Datanode   用于保存数据

 

HDFS  集群read操作

一个人对client说:请帮我读取相关文件

Client speakRoger 好的知道了!

 

u 交互Namenode

Client -> Namenode :请给我关于这个文件的信息(传输filenameNamenode

Namenode –> Client :回复存储这个文件所有的块信息给Client,按datanodeClient的距离进行排序,实际上就是知道块存储在哪个datanode上,先从最近的节点读取数据

  Block1 at DN x1 y1 z1

    Block2 at DN x2 y2 z2

    Block3 at DN x3 y3 z3

Client a. 知道有多少个块(关于这个文件)需要下载

       b. 还知道每个块保存在哪些datanode

因此Client会依次下载这些块到本地

 

u 数据下载流程

Client :先从最近的datanode节点下载数据,它要跟datanode作一个交互,申请获取相关块信息,datanode返回块数据

 

可能你会问到,如果datanode硬件损坏啦,没有相关数据啦,数据本身造破坏不能恢复啦,这些不幸的事情时我们有没有好的办法呢,呵呵木要担心下面我们就会讲到故障容错的理念

 

HDFS 故障容错第一部分故障类型与检测

1.三种典型故障

1node failure 节点故障(namenode 服务器   datanode 数据节点)节点硬件故障

2communication failure 通信故障

不能发送和接收数据,有可能datanode脱离了网络,找不到大家了

3data corruption 数据损坏,两种可能

当数据传输到网络中时损坏

当在磁盘存储时数据损坏

 

2.检测节点故障

1)如果Namenode服务器不可用了,那么整个分布式集群也就不可用了,namenode 是单点故障

2)相对于Namenode服务器我们更专注于检测datanode数据节点

3)那么我们如何检测呢?方法如下

Datanode 每三秒发送心跳给namedata,说明我们还存活着。如果在10分钟之内namenode还没有获取到心跳消息,就认为datanode不可用了。但有可能datanode还活着,只是网络故障造成的,但namenode还是认为datanode不可用。

 

3.检测网络故障

1Client每当向datanode写数据时,datanode都会给一个确认ACK信号,表示接收无误

2Client没有收到ACK信号,就假设datanode 网络故障

 

4.检测数据损坏故障

1Clientdatanode传输信息时,信息包括2部分,checksum校验和、真实数据

2Datanode即存储数据也存储校验和

检测损坏硬盘,由datanode定期发送块报告给namenode,这个块报告列出了所有的块信息。

注释:Datanode先检查checksum校验和是ok的,才发送块报告,因为块报告不包括坏块信息

举例:Datanode发送块报告时不包括坏块信息(假如发送4个块),Namenode在和原来“校验和”对比后认为原来应该有5个块,那么说明有一个块损坏了

 

5.重述 心跳信息和块报告

1Datanode 3秒钟向Namenode发送心跳信息,表示我还活着

2datanode在发送块报告的时候会自动跳过坏块信息,只发送好块信息

3namenode在接收到块报告后与原来的校验和进行对比,总块数-好块数=坏块数

 

HDFS 故障容错第二部分处理读写故障

1.处理写错误

1)我们写入块的最小数据单位是包(通常64K),记住多路复用流水线

注意:此外datanode要给client端发送接收到包的ACK确认信息,以便确认datanode完全接收到了数据包。

2)如果client端从一些datanode节点上不能获得ACK确认信息,就认为这些datanode已不可用,因此client需要调整多路复用流水线,以跳过这个损坏的datanode节点,但不会影响其他的正常的datanode

3)在调整多路复用之后namenode将会查看损坏的datanode

 

2.处理读错误

1)当client端询问一个块位置时,namenode将返回client端所有的datanode节点地址。

2)如果client发现一个datanode不可用了,将会从其他的datanode处获取数据

 

HDFS 故障容错第三部分处理数据节点故障

1.首先,Namenode 保存了2个重要的表

1)块信息表,包含块保存在哪些datanode节点上

2)节点信息表,包含datanode节点保存哪些块

2.再次,Namenode不间断更新这2个表

1)如果namenodedatanode上发现一个坏块,就会更新块信息表,在表里标识坏块在哪个datanode

2)如果namenode发现datanode节点不可用了,就会更新2个表(块信息表,节点信息表),在2个表中同时标识不可用datanode节点信息

 

3.块复制

1Namenode定期扫描表,看看哪些数据块,没有成功备份,例如 每次写操作都要同步到其他2个节点上备份,强一致性,定期扫描就是检查有没有备份成功

 

4.块同步

1)对于所有备份块,Namenode询问其中一个datanode节点上备份是不是从其他二个datanode中同步来的。

2)像这样,NamenodeDatanode说你能从另一个datanode拷贝块吗?

Datanode对另一个Datanode 说我需要从你这里拷贝块,另一个说OK没问题给你!

提出一个问题:

写入的块至少有一个节点接收了就算成功嘛?

HDFS系统支持强一致性,也就是集群中所有节点状态同步一致才行!

 

HDFS 备份布局策略

Namenode说,记得我答应告诉你,我是怎么选择datanode位置存储备份块的

1.磁盘阵列与datanode关系

一个集群被划分成n个磁盘阵列,每个磁盘阵列又包含多个datanode

2.第一个备份位置选择

第一个备份位置简单,如果要写入的是一个集群节点,它就被选为第一个备份位置,另外随机选择其他datanode节点为第二个或第三个备份位置

3. 第二个或第三个备份位置选择附加条件

在第一个磁盘阵列中保存第一个备份,在另一个磁盘阵列中选择2个不同datanode保存接下来2个备份位置

4.以后备份位置

随机选择datanode,但必须满足2个条件

(1) 每个datanode里最多只有一个备份

(2) 每个磁盘阵列里最多有2个备份

提问:有时候不能满足如上2个条件怎么办呢

如果你知道一个更好的算法,HDFS允许你使用你自己分布式存储算法

 

组件简介

Namenode

我还可以做许多其他的事,同样做的很好,大家可以在互联网和书中找到关于namenode的信息

Client

我可以做安装和运行HDFS的工作

Datanode

我可以存储很多数据,我还能映射数据备份

 

小结:HDFS是一个新领域,刚刚接触,它可以用廉价的PC server搭建起大规模的分布式存储系统,这是一个非常实用大数据的分析与应用的架构,在处理海量数据环境下有得天独厚的优势,希望大家可以和我一起来学习Hadoop  HDFS

 

Leonarding

2012.6.27

天津&summer

分享技术~收获快乐

Blog:http://space.itpub.net/26686207

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26686207/viewspace-733979/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
刘盛,网名leonarding,the first ACEA in china, Oracle OCM10g&11g RHCE, ACOUG Core Member Blogger, DATAGURU Oracle数据库版主, ITPUB HADOOP版版主, DB2中国专家组成员, 专注于&Oracle&Hadoop&Nosql&SAS, 提倡“分享技术~成就梦想”, 新浪微博:@itpub_leonarding QQ:40354446

注册时间:2012-02-10

  • 博文量
    246
  • 访问量
    3229267