HDFS写操作遗留问题

一. 大量小文件如何存储在HDFS上:

HDFS上块的大小默认为64M,有的为128M。这里以64M为例

每写入一个文件,首先由客户端创建文件请求,创建完成后,第二步就是询问NameNode要写入的这个文件所分到的这些数据块(block)在哪些DataNode上。NameNode会在命名空间中新建一个文件,并检查这个文件是否已经存在,并且检查是否有权限创建。检查通过后,第三步开始写入数据。

当文件大小>64M时,比如100M,会被分为64M和36M的数据包(两个数据包极其它们各自的两个备份,总共会占6个block),只是36M数据包所占的block槽空间会被浪费一部分。
当文件<64M时,会分给它一个block,这样会造成空间浪费。如果这样的小文件很多,每个小文件都会单独分一个block。不仅会造成DataNode上的大量空间浪费,也会占用大量的命名空间,因为 NameNode的所有元数据都是存储在内存中,所以会给NameNode带来不小的内存压力。

解决方案一:利用Hadoop Archive(HAR)以将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-reduce进行操作,打包后的文件由索引和存储两大部分组成,索引部分记录了原有的目录结构和文件状态。

解决方案二:http://ju.outofmemory.cn/entry/72024

注意:HDFS中的block是物理分块,而MapReduce中的split是逻辑分区,但为了不出现跨节点传输数据,因此一般split的大小就是block的大小。

二. 关于数据写入离客户端最近的DataNode的问题

第二步询问数据包写入哪些DataNode的block上,NameNode会给3个DataNode的列表,从NameNode返回该列表到DFSClient之前,会在NameNode端首先根据该写入客户 端跟DataNode列表中每个datanode之间的“距离”由近到远进行一个排序。当根据“距离”排好序的DataNode节点列表返回给DFSClient以后,DFSClient便会创建BlockOutputStream,并将数据包写入管道( pipeline )中的第一个DataNode节点(即最近的节点)。

客户端可能和NameNode在同一节点上,也可能和DataNode在同一节点,也可能在集群之外。

  • 在DataNode的主机上发起访问,客户端就和DataNode在同一节点,如果该DataNode在NameNode给的DataNode列表中,那么离客户端最近的DataNode节点就是客户端所在的主机。

  • 在NameNode的主机上发起访问客户端就和NameNode在同一节点,此时就存在找离客户端(离NameNode主机)最近的DataNode写入。

  • 如果是远程访问集群,那么客户端就不在集群中的任意一个节点,就不和数据在同一节点上,当然也就要找离客户端最近的DataNode写入数据。

三. 关于在HDFS中写入数据的这张示意图紫红色箭头的解释

这里写图片描述

要解释这些紫红色的线条要借助下面这个HDFS写入数据操作图:

这里写图片描述

由红色框住的这一部分就是一个文件所分成的每个数据包(大小为64M)经过前面回答中所提过1,2,3步后,开始真正写入,会以流水线复制的方式在管道中传递,每个DataNode接收到数据包后都要向发送者发送确认包ACK,这些确认包会沿着管道逆流而上,直到客户端,这就是上图中DN(host2)指向客户端的那条紫红色的箭头。

其他的几条由DataNode指向NameNode的紫红色的箭头则是指:每个DataNode在接收完一个数据包后,都会发消息给NameNode告诉它数据包已经接收完毕成功写入block中, NameNode需要根据它接收到的消息更新它保存的文件系统元数据信息。

注意:在管道中传递数据,在写入第三个DataNode的block之前,先判断是否前两个DataNode是否是在同一个机架上:

  • 如果是在同一个机架,那么就尝试在另外一个机架上选择第 三个DataNode作为写入机器(DataNode 3)。
  • 如果DataNode 1和DataNode 2没有在同一个机架上,则在DataNode 2所 在的机架上选择一台DataNode作为DataNode 3。

附上完整的在HDFS写数据过程:

这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值