什么网站做任务可以赚钱,茶叶企业建设网站,青海省交通建设厅网站,许昌建设局网站文章目录 #xff08;55#xff09;HDFS 写数据流程#xff08;56#xff09; 节点距离计算#xff08;57#xff09;机架感知#xff08;副本存储节点选择#xff09;#xff08;58#xff09;HDFS 读数据流程参考文献 #xff08;55#xff09;HDFS 写数据流程
… 文章目录 55HDFS 写数据流程56 节点距离计算57机架感知副本存储节点选择58HDFS 读数据流程参考文献 55HDFS 写数据流程
数据文件ss.avi是如何从客户端写到HDFS的
完整流程见下图接下来我们会按顺序详细捋一下 0首先客户端里需要有一个HDFS Client这个HDFS客户端在创建的时候需要限制是Distributed FileSystem。因为HDFS Client有很多种类型默认是Local的。
1其次向NameNode发送请求请求将文件ss.avi发送到NameNode的指定目录下这里假定是/user/atguigu/。
2NameNode接收请求并针对本次请求进行检查
检查该客户端是否有权限在指定目录下写文件检查指定的目录树是否存在
然后NameNode检查完之后发回响应通知Client可以上传文件。
3再然后Client接收到响应请求上传第一个Block0M~128M要求NameNode返回存储用的DataNode位置。即请求NameNode告知我应该往哪儿存
4接着NameNode接收到请求开始寻找合适的DataNode并将其返回。默认情况下HDFS是保留3个副本因此会返回3个DataNode。
这里需要注意NameNode挑选DataNode的时候是有一个基本策略的在3.x中优先级从高到低是
本地节点其它机架的一个节点其它机架跟第二个相同的另一个节点
而在2.x版本中是按照
本地节点本地机架的另一个节点其它机架的一个节点
这个之后会详细说明。
同时DataNode的挑选也遵守负载均衡某个节点存放的数据也不能过多。
5再其次Client接收到NameNode返回的DataNode名单之后就会创建FSDataOutputStream向名单里的DataNode写数据。
那Client具体是怎么往DataNode里写的呢
Client只跟DataNode1建立Block传输通道然后DataNode1跟DataNode2建立传输通道DataNode2跟DataNode3建立传输通道整个过程是一个串联的。
传输通道中每次发送的数据量是一个Packet64K一个Packet包含若干个chunk512Bchunksum4B的校验位的组合当一个Packet的大小达到了64K之后chunk组合的数量够了就可以发送了。
Client发送一个Packet之后还会维护一个ACK缓冲队列在里面备份刚才发送的Packet。
每次发送了一个packet之后各个DataNode要按顺序返回应答。待到Client接收到最后的应答之后就认为这个packet传输完成了就会从ACK缓冲队列中删掉这个packet的备份。如果传输失败则从ack队列中缓冲读取继续发送。
为了加快传输速度DataNode内部是边读边传边写一边从管道里读一个Packet一边往磁盘里写一个Packet一边把内存中的Packet直接传给下面的DataNode。
6当一个block传输完成后客户端会再次请求NameNode上传第二个block即从第3步开始重复执行直到最后数据传输完成。
56 节点距离计算
在选择副本存储节点的时候主要考虑节点的距离越近越好 负载均衡单个节点总负载不能太高
如何计算两个服务器之间的节点距离呢
所谓的节点距离就是两个节点到达最近的公共祖先的距离之和。
计算距离的时候有些基本准则跟树有些类似整个架构的子孙关系是
互联网 - 集群类似机房- 机架 - 节点服务器
简单的说就是节点的直接祖先是机架机架的直接祖先是集群。
每个节点服务器到自己机架的距离是1到自己所在集群的距离是2到整个互联网的距离是3。 所以结合图可见节点间的距离其实是固定的
同一节点的距离是0同一机架上的两个节点距离是2共同祖先是机架即节点1 - 共同机架 - 节点2同一集群不同机架上的两个节点距离是4共同祖先是集群即节点1 - 机架1 - 共同集群 - 机架2 - 节点2不同集群上的两个节点距离是6共同祖先是互联网链路就不演示了
57机架感知副本存储节点选择
即副本存储节点的选择策略
3.x的基本策略
本地节点其他机架上的一个节点随机第二个副本所在机架上的另一个节点随机
所谓的本地节点是指client的位置而言的即client所在的节点视为是本地节点。
如果Client是在集群外那就随便选一个节点作为本地节点。
这里其实有一个权衡为了更加安全所以第二个副本选择为另一个机架防止前两个副本都在一个机架上机架坏了副本就没了。
但是如果是基于这种考虑那第三个副本应该放在第3个机架上更安全啊为什么要放在第2个机架上呢
主要是考虑到效率问题同机架内节点做数据传输更快而且两个机架都出问题的情况比较少所以就没必要那么谨慎的备份3个机架了。
58HDFS 读数据流程
我们有一个NameNode和3个DataNode现在想从DataNode下载一个ss.avi文件完整流程见下图 0首先客户端Client会生成一个Distributed FileSystem对象来由它代表自己对外做交互。
1然后Client会向NameNode发送文件的下载请求比如说告诉它我想下/user/atguigu/ss.avi这个文件
2NameNode接收到客户端的请求然后就开始检查自己目录里有没有这个文件、这个文件是不是这个客户端有权限下载的。如果这些检查都通过了那么NameNode会把目标文件的元信息发送回Client。
3Client接收到反馈开始生成一个FSDataInputStream对象来由它代表自己对外建立数据传输。
注意NameNode在反馈的时候会把目前文件的所有副本地址都返回给Client那 Client应该选择哪个或者哪些副本去读取呢 这里是有两个基本原则的
一般是选择节点距离最近的那个副本节点。负载均衡。每个节点可接受的线程数是有上限的如果最近的节点当前的任务已经超过负载的话那就可以换到别的副本去读加快速度。
然后NameNode会向指定的副本节点发送读请求。
注意Client在读的时候是串行读第一块读完了之后再读第二块不是咔咔咔开多个线程好几块一起读。
为什么不并行读呢大概是因为并行读没法保证拼接的顺序吧。
4客户端以Packet为单位接收先在本地缓存最后再写入目标文件。
参考文献
Hadoop2.x与Hadoop3.x副本选择机制【尚硅谷大数据Hadoop教程hadoop3.x搭建到集群调优百万播放】