Hadoop学习之路(四)HDFS 读写流程详解

1.HDFS 写操作
1.1图解HDFS读过程
hdfs写操作流程图.png

image.png
1.2 数据写入过程详解

1、使用HDFS提供的客户端Client,向远程的NameNode发起RPC请求;
2、NameNode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
3、当客户端开始写入文件的时候,客户端会将文件切分为多个packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些packets,并向NameNode申请blocks,获取用来存储replicas的合适datanode列表,列表的大小根据NameNode中的replication的设置而定;
4、开始以pipeline(管道)的形式将packet写入到所有的replicas中。客户端把packet以流的方式写入到第一个DataNode,该DataNode把该packet存储之后,在将其传递给再次pipeline中的下一个DataNode,直到最后一个DataNode,这种写数据的方式呈流水线的形式。
5、最后一个DataNode成功存储之后会返回一个ack packet(确认队列),在pipeline里传递至客户端,在客户端的开发库内部维护者“ack queue”,成功收到DataNode返回的"ack packet"后会从“DataNode”移除相应的packet;
6、如果传输过程中,有某个DataNode出现了故障,那么当前的pipeline会被关闭,出现故障的DataNode会从当前的pipeline中移除,剩余的block会继续剩下的DataNode中继续以pipeline的形式传输,同时,NameNode会分配一个新的DataNode,保持replicas设定的数量;
7、客户端完成数据的写入后,会对数据流调用close()方法,关闭数据流;
8、只要写入了dfs.replication.min(最小写入成功的副本数)的副本数(默认为1)。写操作就会成功,并且这个快可以在集群种异步复制,直到达到其目标副本数(dfs.replication的默认值为3),因为NameNode已经知道文件由哪些块组成,所以它在返回成功之前只需要等待数据块进行最小量的复制。

1.3详细说明

1、客户端发起请求:hdfs dfs -put a.avi /movie

客户端如何知道请求发送给哪个节点的哪个进程?
客户端会提供一些工具来解析所指定的HDFS集群中的主节点是谁,以及端口号等信息,主要是通过URI来确定 URl:hdfs://master1:9000
当前请求包含了一个非常重要的信息:上传数据的总大小

2、NameNode会响应客户端的这个请求:

NameNode的职责:
1、管理元数据(抽象目录树结构)

  • 用户上传的那个文件在对赢的目录中如果存在,那么HDFS集群应该作何处理? 不会处理。
  • 用户上传的那个文件要存储的目录不存在? 如果不存在不进行创建
    2、响应操作
    真正的操作:进行一系列的校验
  • 校验客户端的请求是否合理
  • 校验客户端是否有权限进行上传操作

3、如果NameNode返回给客户端的结果是通过,那就是允许上传

namenode会给客户端返回对应的所有数据块的多副本的存放节点列表,如:
file1_blk hadoop02,hadoop03,hadoop04
file2_blk hadoop03,hadoop04,hadoop05

4、客户端在获取到了namenode返回回来的所有数据块的多个副本存放地址的数据之后,就可以按照顺序逐一进行数据块的上传操作

5、对要上传的数据块进行逻辑切分
6、开始上传第一个数据块
7、客户端会做一系列的准备操作

  • 依次发送请求去对应的DataNode
    pipeline:client -node1 -node2 -node3
    按照一个个的数据包的形式进行发送
    每次传输完一个数据包,每个副本节点都会进行校验,依次原路返回给客户端
  • 在客户端会启动一个服务:
    用户等待将要从pipeline数据管道上进行传输的数据包的校验信息
    客户端就能知道当前从client写到node1,2,3三个节点上的数据是否都写入正确和成

8、client会正式的吧这个块中的所有packet都写到对应的副本节点

1、block是最大的一个单位,它是最终存储于DataNode上的数据粒度,由dfs.block.size参数决定,2.x版本默认是128M;注:这个参数由客户端配置决定;
如:System.out.println(conf.get(dfs.blocksize));结果是134217728
2、packet是中等的一个单位,它是数据有DFSClient流向DataNode的粒度,以dfs.write.packet.size参数为参考值,默认的是64k;注:这个参数是参考值,是指真正进行数据传输时,会以它为基准进行调整,调整的原因是一个packet有特定的结构,调整的目标是这个packet的大小刚好包括结构中的所有成员,同时也保证写到DataNode后当前的block的大小不操作设定值;
如:System.out.println(conf.get(dfs.write.packet.size));结果是65536
3、chunk是最小的一个单位,它是DFSClient到DataNode数据传输中进行数据校验的粒度,由io.bytes.per.checksum参数决定,默认是512B;注:事实上一个chunk还包含4B的校验值,因此chunk写入packet时是516B;数据与校验值的比值为128:1,所以对于一个128M的block会有一个1M的校验文件与之对应;
如:System.out.println(conf.get(io.bytes.per.cheksum));结果是512

9、Client进行校验,如果校验通过,表示该数据块写入成功
10、 重复7 8 9 三个操作,来继续上传其他的数据块
11、客户端在收到所有的数据块都写入成功后,会给NameNode发送一个反馈,告诉NameNode当前客户端上传的数据已经成功。

2.HDFS 读操作
2.1 图解HDFS读操作
hdfs写操作流程图.png

image.png
2.2 数据读取过程详解

1、客户端调动FileSystem实例的open方法,获取这个文件对应的输入流InputStream。
2、通过RPC远程调用NameNode,获得NameNode中此文件对应的数据块保存位置,包括这个文件的副本的保存位置(主要是各DataNode的地址);
3、获取输入流之后,客户端调用read方法读取数据,选择最近的DataNode建立连接并读取数据;
4、如果客户端和其中一个DataNode位于同一机器(比如MapReduce 过程的mapper和reducer),那么就会直接从本地读取文件;
5、到达数据块末端,关闭与这个DataNode的连接,然后重新查找下一个数据块;
6、不断执行2-5步操作指导数据全部读完;
7、客户端调用close,关闭输入流DFSInputStream。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容