HDFS 文件读写存机制

HDFS 文件(读写存)机制

1.文件存储

HDFS上最基本的存储文件的基本单位是数据块(Block)。

HDFS块默认大小为128M(2.0),64M(1.0)。

思考:当文件大小1M,则不会实际占据128M内存,但是块大小还是128M。较多的小文件会占用更多的NAMENODE的内存(记录了文件的位置等信息)。 
如果hdfs占用Linux file system的磁盘空间按实际文件大小算,那么这个”块大小“有必要存在吗?
其实块大小还是必要的,一个显而易见的作用就是当文件通过append操作不断增长的过程中,可以通过来block size决定何时split文件

HDFS为了做到可靠性(reliability),将文件的每一个块复制多份,默认是3份可以配置。

副本放置策略(以块为单位放置,而不是文件为单位)

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node)。数据本地化原则。

第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。以防副本1的机架出故障,相当于异地灾备。

第三个副本和第二个在同一个机架,随机放在不同的node中。副本2,3同步数据效率高。

如果还有更多的副本就随机放在集群的node里。

img

通过副本技术可以有以下优点:

  1. 提高系统可靠性:系统不可避免的会产生故障和错误,拥有多个副本的文件系统不会导致无法访问的情况,从而提高了系统的可用性。另外,系统可以通过其他完好的副本对发生错误的副本进行修复,从而提高了系统的容错性。
  2. 负载均衡:副本可以对系统的负载量进行扩展。多个副本存放在不同的服务器上,可有效的分担工作量,从而将较大的工作量有效的分布在不同的站点上。
  3. 提高访问效率:将副本创建在访问频度较大的区域,即副本在访问节点的附近,相应减小了其通信开销,从而提高了整体的访问效率。

2.文件读取机制

在这里插入图片描述

注意:
  • DataNode传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  • 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
  • 如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试读该block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。
  • DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像。

3.文件写入机制

1.Packet,chunk

packet (64KB)= 一组chunk(512B)和checksum(4B)

在这里插入图片描述

2.写入机制

HDFS写文件流程(详细必看)
在这里插入图片描述

3.注意:
  • namenode收到客户端的请求后,首先会检测元数据的目录树;检查权限并判断待上传的文件是否已存在,如果已存在,则拒绝client的上传。如果不存在,则响应客户端可以上传。注:WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。
  • 以packet为单位发送,并不是写好一个块或一整个文件后才向后分发(Client->DN1->DN2->…)。
  • 并不是每写完一个packet后就返回确认信息,写完一个block块后,返回ack。
  • 文件写完后,发送完成信号给NameNode。发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性
4.数据写入期间datanode发生故障
  • 如果在数据写入期间datanode发生故障,则执行以下操作(对写入的数据的客户端是透明的)。
  • 首先关闭管道,然后将确认队列(ack queue)中的数据包都添加回数据队列(data queue)的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包。
  • 为存储在正常的datanode上的数据块指定一个新的标识,并将该标识传递给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。
  • 从管线(pipeline)中删除故障数据节点并把使用剩下的正常的datanode构建一个新的管线(pipeline)。余下的数据块写入新的管线中。
  • namenode注意到块副本量不足时,会在另一个节点上创建一个新的复本,后续的数据块继续正常接受处理。
思考:为什么hdfs在写入文件时不直接dispatch write(同时写多个DataNode),而是使用递归思想的写入。
1.同时写多个DataNode需要占据client更多的资源,和网络带宽(尤其是副本复制数设置的比较多时)
2.由于副本放置策略,(Client->DN1->DN2->DN3),比(Client->DN1,Client->DN2,Client->DN3)跨越的网络交换机更少,降低数据传送的延迟。

参考:

《Hadoop 权威指南(第四版)》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值