hdfs工作原理
一、NameNode和DataNode
(1)NameNode
NameNode的作用是管理文件目录结构,是管理数据节点的。NameNode维护两套数据:一套是文件目录与数据块之间的关系,另一套是数据块与节点间的关系。前一套是静态的,是存放在磁盘上的,通过fsimage和edits文件来维护;后一套数据时动态的,不持久化到磁盘,每当集群启动的时候,会自动建立这些信息。
(2)DataNode
毫无疑问,DataNode是HDFS中真正存储数据的。这里要提到一点,就是Block(数据块)。假设文件大小是100GB,从字节位置0开始,每64MB字节划分为一个Block,以此类推,可以划分出很多的Block。每个Block就是64MB(也可以自定义设置Block大小)。
(3)典型部署
HDFS的一个典型部署是在一个专门的机器上运行NameNode,集群中的其他机器各运行一个DataNode。(当然,也可以在运行NameNode的机器上同时运行DataNode,或者一个机器上运行多个DataNode)一个集群中只有一个NameNode(但是单NameNode存在单点问题,在Hadoop 2.x版本之后解决了这个问题)的设计大大简化了系统架构
二、HDFS读写数据
当我们向hdfs 写数据的时候,客户端要做两件事.首先,将数据文件划分不同的数据块,划分的标准默认是64MB或128MB,这个是可以配置的.其次是向namenode请求一批(实际上就是默认的3个)datanode以存放数据块.当然namenode不是随便的选出三个datanode给client,它会选择三个最靠近client的三个datanode,那么这个距离是怎么计算的呢,是这样的,它会去计算两个节点与父节点带宽之和来计算两个节点的距离,在得到三个最近的datanode之后,namenode会先按与client的距离对datanode排下序,然后返回给客户端.
下面client要做的就是向namenode返回的3个datanode中传输数据了.当它在写第一个数据块时,它会先向离它最近的那个datanode写数据.那么client如何知道它向第一个datanode写入数据是否成功了呢?是这样的,client在向datanode传数据的同时,会计算下数据快的校验和,这个校验和也会传给datanode,datanode 在存储完数据后,会对数据块取下校验和与client的校验和进行比对,如果一致的话说明数据保存成功,然后它会向client进行ack,告诉client数据已经成功保存了,同时它也会告诉namenode数据块保存成功了.剩下的数据块保存到下两个datanode的过程和第一个过程是相似的,只是数据的传输不是都是client去传递的,而是datanode之间进行传递的,每个datanode成功保存完数据后都会向client进行ack并通知namenode保存数据完毕.当client接受到所有的datanode的ack后,client会告诉namenode数据块全部写入完毕.当namenode接受到client的消息后,namenode要做的就是维护两张表,一张表是每个数据块对应的datanode地址,另一张表是存储数据副本的时候经过了那些管线.
当client要从hdfs中读取数据的时候,首先客户端要知道数据存储在哪吧,怎么才能知道啊,谁知道啊?当然是namenode啊,namenode存储了所有的数据块元数据信息.client会给namenode请求数据的文件地址,namenode会返回给client关于数据块的相关信息即数据块存放在哪些datanode上了,每个datanode存放了哪些数据块,当然这些datanode也是按照与client距离排过序的.当client拿到这些信息后,它会先到离它最近的那个datanode上下载数据.
三、保障HDFS的可靠性措施
HDFS具备了较为完善的冗余备份和故障恢复机制,可以实现在集群中可靠地存储海量文件。
(1)冗余备份:HDFS将每个文件存储成一系列的数据块(Block),默认块大小为64MB(可以自定义配置)。为了容错,文件的所有数据块都可以有副本(默认为3个,可以自定义配置)。当DataNode启动的时候,它会遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系的列表,并把这个报告发送给NameNode,这就是报告块(BlockReport),报告块上包含了DataNode上所有块的列表。
(2)副本存放:HDFS集群一般运行在多个机架上,不同机架上机器的通信需要通过交换机。通常情况下,副本的存放策略很关键,机架内节点之间的带宽比跨机架节点之间的带宽要大,它能影响HDFS的可靠性和性能。HDFS采用一种称为机架感知(Rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,HDFS副本系数是默认为3,HDFS的存放策略是将一个副本存放在本地机架节点上,一个副本存放在同一个机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。
图6.副本存放的策略
(3)心跳检测:NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,NameNode可以根据这个报告验证映射和其他文件系统元数据。收到心跳包,说明该DataNode工作正常。如果DataNode不能发送心跳信息,NameNode会标记最近没有心跳的DataNode为宕机,并且不会给他们发送任何I/O请求。
(4)安全模式
(5)数据完整性检测
(6)空间回收
(7)元数据磁盘失效
(8)快照(HDFS目前还不支持)
四、故障的规避.
因为是分布式文件系统,网路中什么事情都有可能发生,如datanode挂掉,datanode不能返回客户端想要的数据,datanode在保存数据的时候数据损毁,或者最严重的namenode挂掉.
下面看看这个四个问题,hadoop是如何规避的呢。
首先是datanode挂掉,当hdfs启动后每个datanode节点会定期上报自己的健康状况,每个datanode会每三秒向namenode发送心跳,证明自己还或者,假如namenode是秒钟没有收到datanode发送的心跳,namenode会认为这个datanode已经挂掉了.
下一个问题datanode不能返回客户端想要的数据,当客户端datanode请求数据或写入数据的时候,datanode无相应怎么办呢,当客户端长时间没有接收到datanode的ack后,client也为认为这个datanode已经挂掉了,于是会跳过这个datanode,请求下个datanode.
第三个问题,datanode保存的数据发生损坏,这个该怎么办呢,datanode会定期上报自己所存的数据快健康状况,健康状况是通过校验和来判断的,当nomenode收到datanode发送的数据块健康状况的报告后它就知道那些数据块损毁,然后它就会去更新它维护的两张表,即数据块在哪些datanode上存着,每个datanode上存放了哪些数据块,如果namenode发现哪个数据块的副本没有达到标准,它会通知其它的datanode从已有数据块的datanode上copy相应的数据块.
第四个问题,namenode挂掉,这个问题是最严重的,目前的最好的解决办法就是加一个辅助namenode即secondNamenode,以备分数据块的元数据信息,尽可能的避免数据丢失.
hdfs工作原理的更多相关文章
- 一图看懂hadoop分布式文件存储系统HDFS工作原理
一图看懂hadoop分布式文件存储系统HDFS工作原理
- HADOOP1.X中HDFS工作原理
转载自:http://www.daniubiji.cn/archives/596 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据googl ...
- Hadoop中HDFS工作原理
转自:http://blog.csdn.net/sdlyjzh/article/details/28876385 Hadoop其实并不是一个产品,而是一些独立模块的组合.主要有分布式文件系统HDFS和 ...
- 漫画HDFS工作原理(转)
转自:http://blog.csdn.net/netcoder/article/details/7442779?locationNum=2 对漫画内容更好的解读,可参考: http://www.we ...
- 通过漫画轻松掌握HDFS工作原理
- 漫画描述HDFS工作原理
作者不详,内容浅显易懂,特拿来与大家分享.
- hadoop平台上HDFS和MAPREDUCE的功能、工作原理和工作过程
作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapReduce ...
- HDFS的工作原理(读和写操作)
工作原理: NameNode和DateNode,NameNode相当于一个管理者,它管理集群内的DataNode,当客户发送请求过来后,NameNode会 根据情况指定存储到哪些DataNode上,而 ...
- 大数据 --> 分布式文件系统HDFS的工作原理
分布式文件系统HDFS的工作原理 Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数 ...
随机推荐
- 8086CPU各寄存器的用途
8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器.(2)指令指针.(3)标志寄存器和(4)段寄存器等4类. 1.通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个) ...
- 异步JS:$.Deferred的使用
异步JS:$.Deferred的使用 原文链接:http://www.html5rocks.com/en/tutorials/async/deferred/ 当我们构建一个平稳的,响应式的HTML5应 ...
- NWR协议
NWR是一种在分布式存储系统中用于控制一致性级别的一种策略.在Amazon的Dynamo云存储系统中,就应用NWR来控制一致性. 让我们先来看看这三个字母的含义:N:在分布式存储系统中,有多少份备份数 ...
- 为什么主流网站无法捕获 XSS 漏洞?
二十多年来,跨站脚本(简称 XSS)漏洞一直是主流网站的心头之痛.为什么过了这么久,这些网站还是对此类漏洞束手无策呢? 对于最近 eBay 网站曝出的跨站脚本漏洞,你有什么想法?为什么会出现这样的漏网 ...
- Android的px、dip、sp的区别
Android的px.dip.sp的区别 我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼. 在Android中支持的描述大小区域的类型有以下几种: px(pix ...
- linux下PostgreSQL数据库的源码安装
实验环境>>>>>>>>>>>>>>>>>>操作系统:CentOS release 6.3 ...
- jackson set properties to default value (取消让jackson 赋予默认值)
you can define it with Integer rather than int or long. define it with a package type. jackson wont' ...
- Android核心分析之二十三Andoird GDI之基本原理及其总体框架
Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了.但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理. GDI主 ...
- iOS开发-UISlider改变图片透明度
拖动条是通过滑块的位置来标识数值,而且拖动条允许用户拖动滑块来改变值.因此,拖动条通常用于对系统的某种数值进行调节,如调节亮度,透明度,音量等. 一.属性介绍 @property(nonatomic) ...
- 编译FreePascal和Lazarus
一,准备目录假设我们准备将整个FreePascal环境安装到D盘的fpc目录下,那么我们需要创建以下几个目录:d:\fpc_svn\bind:\laz_svn二,准备环境1,安装SVN客户端Torto ...