HDFS要点
namenode存储的数据:
主控服务器主要有三类数据:文件系统的目录结构数据,各个文件的分块信息,数据块的位置信息(就数据块放置在哪些数据服务器上...)。在GFS和HDFS的架构中,只有文件的目录结构和分块信息才会被持久化到本地磁盘上,而数据块的位置信息则是通过动态汇总过来的,仅仅存活在内存数据结构中,机器挂了,就灰飞烟灭了。每一个数据服务器启动后,都会向主控服务器发送注册消息,将其上数据块的状况都告知于主控服务器。俗话说,简单就是美,根据DRY原则,保存的冗余信息越少,出现不一致的可能性越低,付出一点点时间的代价,换取了一大把逻辑上的简单性,绝对应该是一个包赚不赔的买卖。。。
Hdfs支持的写操作
在HDFS中仅仅支持追加写,这大大降低了复杂性.
数据读写操作
有的操作本质上还是涉及到了数据服务器,比如文件创建和删除操作。但是,之前提到,主控服务器只于数据服务器是一个等待拉取的地位,它们不会主动联系数据服务器,将指令传输给它们,而是放到相应的数据结构中,等待数据服务器来取。这样的设计,可以减少通信的次数,加快操作的执行速度。。。
在Hadoop中,读写操作是不走RPC机制的,而是另立门户,独立搭了一套通信框架。在数据服务器一端,DataNode类中有一个DataXceiverServer类的实例,它在一个单独的线程等待请求,一旦接到,就启动一个DataXceiver的线程,处理此次请求。一个请求一个线程,对于数据服务器来说,逻辑上很简单。
读操作
文件的读取实在是一个简单的过程。在客户端DFSClient中,有一个
DFSClient.DFSInputStream类。当需要读取一个文件的时候,会生成一个DFSInputStream的实例。它会先调用ClientProtocol定义getBlockLocations接口,提供给NameNode文件路径、读取位置、读取长度信息,从中取得一个LocatedBlocks类的对象,这个对象包含一组LocatedBlock,那里面有所规定位置中包含的所有数据块信息,以及数据块对应的所有数据服务器的位置信息。当读取开始后,DFSInputStream会先尝试从某个数据块对应的一组数据服务器中选出一个,进行连接。这个选取算法,在当下的实现中,非常简单,就是选出第一个未挂的数据服务器,并没有加入客户端与数据服务器相对位置的考量。读取的请求,发送到数据服务器后,自然会有DataXceiver来处理,数据被一个包一个包发送回客户端,等到整个数据块的数据都被读取完了,就会断开此链接,尝试连接下一个数据块对应的数据服务器,整个流程,依次如此反复,直到所有想读的都读取完了为止。。。
写入的时序控制
在HDFS中,并发写入的次序控制,是由主控服务器来把握的。当创建、续写一个文件的时候,该文件的节点类,由INodeFile升级成为INodeFileUnderConstruction,INodeFileUnderConstruction是INodeFile的子类,它起到一个锁的作用。如果当一个客户端想创建或续写的文件是INodeFileUnderConstruction,会引发异常,因为这说明这个此处有爷,请另寻高就,从而保持了并发写入的次序性。同时,INodeFileUnderConstruction有包含了此时正在操作它的客户端的信息以及最后一个数据块的数据服务器信息,当追加写的时候可以更快速的响应。。。
文件写入的流水线
文件写入,就是在这一组数据服务器上构造成数据流的双向流水线。DFSOutputStream,会与序列的第一个数据服务器建立Socket连接,发送请求头,然后等待回应。DataNode同样是建立DataXceiver来处理写消息,DataXceiver会依照包中传过来的其他服务器的信息,建立与下一个服务器的连接,并生成类似的头,发送给它,并等待回包。此流程依次延续,直到最后一级,它发送回包,反向着逐级传递,再次回到客户端。如果一切顺利,那么此时,流水线建立成功,开始正式发送数据。数据是分成一个个数据包发送的,所有写入的内容,被缓存在客户端,当写满64K,会被封装成DFSOutputStream.Packet类实例,放入DFSOutputStream的dataQueue队列。DFSOutputStream.DataStreamer会时刻监听这个队列,一旦不为空,则开始发送,将位于dataQueue队首的包移动到ackQueue队列的队尾,表示已发送但尚未接受回复的包队列。同时启动ResponseProcessor线程监听回包,直到收到相应回包,才将发送包从ackQueue中移除,表示成功。每一个数据服务器的DataXceiver收到了数据包,一边写入到本地文件中去,一边转发给下一级的数据服务器,等待回包,同前面建立流水线的流程。。。
客户端错误回复
作为客户端,大部分时候,牺牲了就牺牲了,没人哀悼,无人同情,只有在在辛勤写入的时候,不幸辞世(机器挂了,或者网络断了,诸如此类...),才会引起些恐慌。因为,此时此刻,在主控服务器上对应的文件,正作为INodeFileUnderConstruction活着,仅仅为占有它的那个客户端服务者,做为一个专一的文件,它不允许别的客户端染指。这样的话,一旦占有它的客户端服务者牺牲了,此客户端会依然占着茅坑不拉屎,让如花似玉INodeFileUnderConstruction孤孤单单守寡终身。这种事情当然无法容忍,因此,必须有办法解决这个问题,办法就是:租约。。。、、
- 首先是调用startCheckpoint做一些本地的初始化工作;
- 然后调用rollEditLog,将NameNode上此时操作的日志文件从edit切到edit.new上来,这个操作瞬间完成,上层写日志的函数完全感觉不到差别;
- 接着,调用downloadCheckpointFiles,将主控服务器上的镜像文件和日志文件都下载到此候补主控服务器上来;
- 并调用doMerge,打开镜像和日志,将日志生成新的镜像,保存覆盖;
- 下一步,调用putFSImage把新的镜像上传回NameNode;
- 再调用rollFsImage,将镜像换成新的,在日志从edit.new改名为edit;
- 最后,调用endCheckpoint做收尾工作。
数据的正确性保证(不太理解,后续再拜读)
HDFS要点的更多相关文章
- HDFS要点剖析
谈到大数据,不得不提的一个名词是"HDFS".它是一种分布式文件存储系统,其系统架构图如下图所示: 从图中可以了解到的几个关键概念 元数据(MetaData) 机架(Rock) 块 ...
- Hadoop HDFS分布式文件系统设计要点与架构
Hadoop HDFS分布式文件系统设计要点与架构 Hadoop简介:一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群 ...
- HDFS的架构和设计要点
HDFS的架构和设计要点 转 大数据之路 发布于 2012/10/11 23:00 字数 4487 阅读 495 收藏 1 点赞 0 评论 0 撸了今年阿里.头条和美团的面试,我有一个重要发现.... ...
- Hadoop HDFS分布式文件系统设计要点与架构(转摘)
Hadoop简介:一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Ha ...
- hadoop权威指南(第四版)要点翻译(4)——Chapter 3. The HDFS(1-4)
Filesystems that manage the storage across a network of machines are called distributed filesystems. ...
- hadoop权威指南(第四版)要点翻译(5)——Chapter 3. The HDFS(5)
5) The Java Interface a) Reading Data from a Hadoop URL. 使用hadoop URL来读取数据 b) Although we focus main ...
- HDFS 与 GFS 的设计差异
后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的 ...
- HDFS 异常处理与恢复
在前面的文章 <HDFS DataNode 设计实现解析>中我们对文件操作进行了描述,但并未展开讲述其中涉及的异常错误处理与恢复机制.本文将深入探讨 HDFS 文件操作涉及的错误处理与恢复 ...
- HDFS Client 设计实现解析
前面对 HDFS NameNode 和 DataNode 的架构设计实现要点做了介绍,本文对 HDFS 最后一个主要构成组件 Client 做进一步解析. 流式读取 HDFS Client 为客户端应 ...
随机推荐
- 如何解决ORA-12547错误!
最近在布置一个应用程序连接oracle后台数据库,数据库为oracle11g(11.2.0.2).应用程序属于root用户,所以需要以root用户通过系统认证的方式连接数据库.设置了root用户的环境 ...
- 页面请求速度慢,TTFB时间长的问题分析
线上环境发现用户请求某个页面时,出现请求速度慢页面卡顿白屏的现象,通过chrome开发工具调试查看Timing,花费在waiting(TTFB)上的时间过长,几秒十几秒不等 TTFB全称Time To ...
- 洛谷 P4841 城市规划
构造简单无向图的EGF: \[ G(x)=\sum_{i}^{\infty}2^{\binom{i}{2}}\cdot\frac{x^i}{i!} \] 构造简单无向连通图的EGF: \[ F(x)= ...
- 【[HEOI2014]大工程 】
可能是虚树板子题了 首先先把虚树建出来,但是这里和那道虚树的入门题不一样,这里所有的询问点都得在虚树里,所以不会存在那种直接不如栈的点 之后我们考虑一下这个三个要求的东西 第一个操作我们需要统计虚树上 ...
- python3 安装win32api
Python3 中先安装pip install pywin32 但是在调用时任然说找不到该模块,于是查找资料后得出需要使用python -m pip install pypiwin32.
- 4、Android-数据存储方案(文件存储/SharedPreferences)
简介: 任何一个应用程序都需要和数据进行交互 对于软件来说微博.QQ等都需要关系的是数据 没有数据的应用程序是一个没有灵魂的软件 而且还没有实际的用途 可以认为是单机 4.1.持久化技术的简介 数据持 ...
- linq中当生成asp.net实体模式时
linq中当生成asp.net实体模式时 注意: 选中 工具->库程序包管理器->管理解决方案的nuget程序包 选中下面的进行下载.
- Go 测试单个方法
1.目录 gotest.go package mytest import ( "errors" ) func Division(a, b float64) (float64, er ...
- 1<=portNo<=4竟然在keil4.71里面不报错
1.if( 1<=portNo<=4 ) { CardIn2_CS_L; //pull low CardIn1_CS_H; CardOut1_CS_H; CardOut2_CS_H ...
- Java中CSS&JS篇基础笔记
HTML就是由一组标签所组成的.HTML的字体标签: <font>标签: 属性:color,size,face HTML的排版标签: h标签:标题标签. p标签:段落标签. b标签:加粗标 ...