关于HDFS中数据块block的设计和原理

       HDFS,全称Hadoop Distributed FileSystem.是一个文件系统,用于存储文件,通过目录树/来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色(在一些非正式的文档或者旧文档中,也简称DFS)。

1.HDFS的设计特点:

              ①可以进行超大文件存储

              ②对商用硬件要求不高

              ③流式数据访问:适合一次写入,多次读出的场景,适合用来做数据分析,并不适合用来做网盘应用等文件系统。

              ④HDFS只支持单个写入者,而且文件的写入只能以“添加”方式在文件末尾写数据。

              ⑤因为namenode的原因,不适合大量小文件的存储。

              ⑥数据访问的延迟相对较高,不适合进行低延迟处理

              ⑦对商业硬件要求低,可以再廉价的机器上运行。

2. HDFS 文件块大小
      HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M.
      HDFS的块比磁盘的块大(磁盘的块一般为512字节),其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。但是很多情况下HDFS使用128MB的块设置。块的大小:10ms*100*100M/s = 100M,然而真正实际开发中要把block设置的远大于128MB,比如存储文件是1TB时,一般把Block大小设置成512MB.但是也不能任意设置的太大,比如200GB一个,因为在MapReduce的map任务中通常一次只处理一个块中数据(切片大小默认等于block大小),如果设置太大,因为任务数太少(少于集群中的节点数量),那么作业的运行速度就会慢很多,此外比如故障等原因也会拖慢速度。

     虽然HDFS以block块存储,对于大文件会被切分成很多以块大小的分块进行存储,但是如果文件小于HDFS的块大小,那么该文件的存储不会占用整个块的空间。比如一个10MB的文件,存储虽然在一个128MB的块上,但是该文件实际只用了10MB的空间,而不是128MB的空间。

    文件系统检查的工具fsck的使用:用来显示块信息,比如复本数,是否损坏等等。(具体使用参见我其他关于fsck的博客。

        语法格式:hdfs fsck / -files -block  

        举例:查看/根目录下的数据块情况     hdfs  fsck  /   

   

3.块缓存机制

     通常datanode从磁盘上读取块,但是对于频繁访问的数据块,datanode会将其缓存到dataNode节点的内存中,以堆外块缓存的形式(off-heap block cache )存在。默认情况下,一个块只缓存到一个datanode内存中(加入复本是3个,但是也只在一个datanode内存中缓存块)。这样的话,计算框架,比如MR或者Spark就可以在缓存块的节点上运行计算任务,可以大大提高读操作的性能,进而提高任务的效率。    

      用户也可以通过在缓存池(cache pool) 中增加一个cache directive 来告诉namenode需要缓存哪些文件,以及文件缓存多久,所谓缓存池就是一个用于管理缓存权限和资源使用的管理分组。   

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涤生大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值