HDFS介绍~超详细
- 先通过客户端调用FileSyStem对象的.open()方法打开HDFS中需要读取的文件
- FileSyStem通过远程协议调用NameNode,确定要访问的文件的数据块的位置;NameNode返回一个含有数据块的“元数据”信息(即文件的基本信息);然后,DataNode按照NameNode定义的距离值进行排序,如果客户端本身就是一个DataNode,那么会优先从本地的DataNode节点上进行数据读取返回一个InputStream给客户端,让其从FSDataInputStream中读取数据,FSDataInputStream接着包装一个DInputStream,用来用来管理DataNode和NameNode的I/O
- NameNode向客户端返回一个包含数据块信息的地址,客户端会根据创建一个FSDataInputStream,开始对数据进行读取
- FSDataInputStream根据开始时候存放的位置,连接到离它最近的DataNode,对其上数据进行从头读取操作。读取过程中客户端会反复调 用.read()方法,以I/O的(流式方式)从DataNode上访问读取数据
- 当读取到Block的最后一块时,FSDataInputStream会关闭掉当前DataNode的连接,然后查找能够读取的下一个Block所在的距离当前最近的DataNode
- 读取完之后调用.close()方法,关闭FSDataInputStream8
- 客户端调用FileSyStem的.create()方法来请求创建文件
- FileSyStem通过NameNode发送请求,创建一个新文件,但此时并不关联其它任何数据块。NameNode进行很多检查保证不存在要创建文件已经在与HDFS系统当中,同时检查是否有相应的权限来创建这个文件。如果这些检查都已完成,那么NameNode就会记录下来这个新建的文件的信息。FileSyStem就返回一个FSDataOutputStream给客户端让他来写数据。和读的情况一样,FSDataOutputStream将会包装一个DFSOutputStream用于和DataNode和NameNode进行通讯的。一旦文件创建失败,客户端会接收到一个IOException,表示文件创建失败,停止后续的所有任务
- 客户端开始写数据。FSDataOutputStream把要写入的数据分成块的形式,将其写入到队列中。其中的数据有DataStream读取(DataStream的职责:让NameNode分配新的块--通过找到合适的DataNode来存储备份的副本数据)这些DataNode组成一条流水线,假设是一个三级流水线,那么里面含有三个节点。此时DataStream把数据首先写入到离他最近的DataNode上(第一个节点);然后由第一个节点将数据块写入到第二个节点,第二个节点继续把数据块传送到第三个节点上
- FSDataOutputStream维护了一个内部关于write packet的队列,里面存放了等待DataNode确认无误的packets信息。这个队列称为等待队列。一个packet的信息被移出本队列并且当packet流水线中的所有节点确认无误
- 当完成数据写入操作后,客户端会调用.close()方法,在通知NameNode它些数据完成之前,这个方法将Flush(刷新)残留的packets,并且等待信息确认,NameNode已经知道了文件由哪些数据块,通过DataStream询问数据块的分配,所以它在返回成功之前必须要完成配置文件中配置的最小副本数的复制操作
- NameNode启动过程中进入
- 手动进入 hdfs dfsadmin -safemode enter
- 阀值计算公式:已经启动的DataNode节点数 / 总数、

HDFS介绍~超详细的更多相关文章
- 超详细,多图文介绍redis集群方式并搭建redis伪集群
超详细,多图文介绍redis集群方式并搭建redis伪集群 超多图文,对新手友好度极好.敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲.且看且珍 ...
- 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数
超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...
- 原来你是这样的BERT,i了i了! —— 超详细BERT介绍(一)BERT主模型的结构及其组件
原来你是这样的BERT,i了i了! -- 超详细BERT介绍(一)BERT主模型的结构及其组件 BERT(Bidirectional Encoder Representations from Tran ...
- MyCat安装与测试教程 超详细!
MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...
- (转)超详细单机版搭建hadoop环境图文解析
超详细单机版搭建hadoop环境图文解析 安装过程: 一.安装Linux操作系统 二.在Ubuntu下创建hadoop用户组和用户 三.在Ubuntu下安装 ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- GitHub超详细图文攻略
GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git 分类: 转载2014-03-25 21:10 10641人阅读 评论(2) 收藏 举报 GitHubbr ...
- 超详细的Xcode代码格式化教程,可自定义样式。
超详细的Xcode代码格式化教程,可自定义样式. 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题.在之前,我们可能会写完代码后,再 ...
- 超全超详细的HTTP状态码大全(推荐抓包工具HTTP Analyzer V6.5.3)
超全超详细的HTTP状态码大全 本部分余下的内容会详细地介绍 HTTP 1.1中的状态码.这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. ...
随机推荐
- struct模块(用于对象的压缩)
6.27自我总结 struct模块 1.struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节 ...
- Catalan公式
f(n)=f(1)*f(n-1)+f(2)*f(n-2)+f(3)*f(n-3)+......+f(n-1)*f(1) 例用:一个长度为n的无重复序列入栈的所有出栈方式
- 【小程序】小程序中设置 tabBar
小程序中 tabBar 的设置,tabBar 就是底部导航栏,在app.json中配置. list 为数组至少两项.tab栏的 position 为 top 时间,不显示图标. "tabBa ...
- 技术派-不用sqrt手工计算平方根
题目:任意长度数串,不使用sqrt函数,手工计算平方根? 要求只准用加/减/乘/除四则运算,不准使用power/sqrt等函数. 算法如下: 1.以小数点为中心往两边每2位分隔为一组: 2.然 ...
- Android的简述
程序截图 先来简单了解下程序运行的效果 程序入口点 类似于win32程序里的WinMain函数,Android自然也有它的程序入口点.它通过在AndroidManifest.xml文件中配置来指明, ...
- jQuery框架操作CSS
3.1 jQuery框架的CSS方法 jQuery框架提供了css方法,我们通过调用该方法传递对应的参数,可以方便的来批量设置标签的CSS样式. 使用JavaScript设置标签的样式相对来说比较麻烦 ...
- Eclipse 设置黑色主题
Eclipse 设置为黑色主题,不仅看起来炫酷,更重要的是对于长期盯着电脑的程序猿来说对眼睛更好些. 先看下效果: 下面以Eclipse Luna 为例,说说 Eclipse 设置为黑色主题的方法(P ...
- [ PyQt入门教程 ] PyQt5信号与槽
信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...
- ByteBuf
ByteBuf readerIndex ,读索引 writerIndex ,写索引 capacity ,当前容量 maxCapacity ,最大容量,当 writerIndex 写入超过 capaci ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...