HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端)、Namenode(名称节点)、Datanode(数据节点)和SecondaryNameNode。HDFS作为hadoop的分布式储存框架,最重要的莫过于数据流的读写过程了,下面就HDFS得数据流的读写流程做个详细的剖析。

HDFS的写流程

首先写操作的shell命令:

hdfs dfs -put ./file02 /file02   
hdfs  dfs -copyFromLocal  ./file02 /file02
FSDataOutputStream fsout = fs.create(path);fsout.write(byte[])
fs.copyFromLocal(path1,path2)

具体流程详解:

如下图所示是整个写流程及原理(上传)

1.客户端向namenode发出请求上传数据;

2.namenode在接到请求之后,开始查找元数据(查找是否存在这个目录以及查询上传者是否有这个权限),查询后向客户端响应是否可以上传数据。

3.客户端接到响应之后,再开始请求上传第一块数据(数据分块是由客户端操作的),例如图中的0-128m为第一块数据。

4.namenode接到请求后,向客户端返回datanode节点信息(副本放在哪个节点上,例如放在DN1,DN2,DN3这三台机器上)。一般规则有近远远,近远近

5.客户端根据返回的副本信息向datanode请求建立传输通道,以级联的方式进行请求

6.datanode向客户端响应,若都应答成功,则传输通道建立成功。

7.开始传输数据,以packet方式传输,以chunk为单位进行校验,默认1m。

8.第一块上传成功,第二块开始从3-7步骤继续传输

9.待传输完成之后,客户端向namenode报告数据传输远程,由namenode更新元数据

在hdfs的写流程有几个核心问题:

1.传输blk1的过程中,dn3如果死了,集群会怎么处理?

不做任何处理,错误会想nn报告

2.接1,如果dn3又启动了,集群会如何处理?

dn3启动时,会向nn发送块报告,然后nn指示dn3删除blk1(因为传输数据不完整)

3.客户端建立通道时,发现dn3连接不上,会怎么办?

nn会重新分配三个节点

4.传输过程中,packet出错,会如何处理?

会重新上传,但是重传次数只有4次,超过限制则提示传输失败

5.如果bk1上传成功,blk2坏了,或者blk2上传时,dn1挂了,如何处理?

nn会将整个文件标记为无效,下次dn向nn发送块报告时,nn会通知这些块所在的节点删除

HDFS的读操作

首先读操作的shell命令(下载)

hdfs dfs -get /file02 ./file02
hdfs dfs -copyToLocal /file02 ./file02
FSDataInputStream fsis = fs.open(path);
fsis.read(byte[] a)
fs.copyToLocal(path1,path2)

具体流程详解

由图可知HDFS的读流程要比写流程简单很多,主要步骤:

1.客户端请求下载数据

2.nn检测数据是否存在,给客户端响应

3.客户端请求下载第一块数据

4.nn返回目标文件的元数据

5.客户端请求dn建立传输通道

6.dn响应

7.开始传输数据

注意点:

在读操作中在客户端和dn建立传输通道时不是采用级联方式,而是首先寻找离自己最近的副本(dn1)下载,如果数据不完整或者没有找到,就再向dn2建立传输通道,然后传输数据,依次往下,直到下载到目标文件为止。

hdfs的重要知识点,建议收藏哦

超详细的HDFS读写流程详解(最容易理解的方式)的更多相关文章

  1. 一看你就懂,超详细java中的ClassLoader详解

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassL ...

  2. 【转】一看你就懂,超详细java中的ClassLoader详解

    http://blog.csdn.net/briblue/article/details/54973413 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框 ...

  3. 一看你就懂,超详细java中的ClassLoader详解(转)

    转载地址     http://blog.csdn.net/briblue/article/details/54973413   目录(?)[-] Class文件的认识 你还记得java环境变量吗 J ...

  4. (转)超详细java中的ClassLoader详解

    转:https://blog.csdn.net/briblue/article/details/54973413 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于 ...

  5. JuiceFS 数据读写流程详解

    对于文件系统而言,其读写的效率对整体的系统性能有决定性的影响,本文我们将通过介绍 JuiceFS 的读写请求处理流程,让大家对 JuiceFS 的特性有更进一步的了解. 写入流程 JuiceFS 对大 ...

  6. Hadoop(四)HDFS集群详解

    前言 前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群.接下来这篇我详细的分享一下HDFS. HDFS前言: 设计思想:(分而治之)将大文件.大 ...

  7. adoop(四)HDFS集群详解

    阅读目录(Content) 一.HDFS概述 1.1.HDFS概述 1.2.HDFS的概念和特性 1.3.HDFS的局限性 1.4.HDFS保证可靠性的措施 二.HDFS基本概念 2.1.HDFS主从 ...

  8. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  9. git概念及工作流程详解

    git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...

随机推荐

  1. mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等

    mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...

  2. ExecutorCompletionService理解记忆

    java.util.concurrent 类 ExecutorCompletionService<V> java.lang.Object   继承者 java.util.concurren ...

  3. Skype for Business

    Skype for Business提供在线会议.即时消息.视频会议等功能 一.界面介绍 1.登陆主界面,选择当前在线状态 2.添加联系人 在搜索框中输入想要寻找用户的姓名.电子邮件地址或电话号码-& ...

  4. MySQL表与表的关系

    表与表的关系 一对多关系 ID name gender dep_name dep_desc 1 Chen male 教学部 教书育人 2 Old flying skin male 外交部 漂泊游荡 3 ...

  5. 数据中台技术汇(二)| DataSimba系列之数据采集平台

    继上期数据中台技术汇栏目发布DataSimba——企业级一站式大数据智能服务平台,本期介绍DataSimba的数据采集平台. DataSimba采集平台属于DataSimba的数据计算及服务平台的一部 ...

  6. 如何修改tomcat名称

    修改tomcat名称为  Tomcat-jx-1

  7. hdu5452

    http://acm.hdu.edu.cn/showproblem.php?pid=5452 题意:给个图T(图G的最小生成树),然后再给定图G的剩余边,问你从图T中当且割一条边的情况再割图G中不属于 ...

  8. 用C#实现一个百度万年历

    目录 背景 实现步骤 关键点 结束语 背景 命理学是对人生命运规律的探索,以人的各式各样的数字(出生年月日.姓名笔划等)来推测人的性格与命运并占卜推测未来会发生的事情.古今中外都有相关方面的理论,中国 ...

  9. Django中查询相关操作

    查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...

  10. 【Linux_Shell 脚本编程学习笔记二、打印菜单】

    综合实例: 打印选择菜单,一键安装Web服务 [root@zuoyan   script]# sh menu.sh 1.[install  lamp] 2. [install lnmp] 3. [ex ...