Block是文件块,HDFS中是以Block为单位进行文件的管理的,一个文件可能有多个块,每个块默认是3个副本,这些块分别存储在不同机器上。块与文件之前的映射关系会定时上报Namenode。HDFS中一个块的默认大小是64M,其大小由参数dfs.block.size控制。这里面先引申几个问题出来:

问题1:块大小要怎么设置为一个合理值,过大设置和过小设置有什么影响?

问题2:如果一个文件小于所设置的块大小,实际占用空间会怎样?

问题3:一个Namenode最多能管理多少个块,什么时候会达到瓶颈?

针对这些问题,后面会展开介绍,这里还是先关注下架构方面。针对块方面,有几个单位概念需要弄清楚: Block、Packet和Chunk。Block上面有描述,Packet和Chunk如下:

1 Packet: 其比块要小很多,可以理解为Linux操作系统最小盘块概念,一般为64KB,由参数dfs.write.packet.size控制,是client向Datanode写入数据的粒度,即client向Datanode写数据时不是一次以Block为单位写的,而是被分成若干Packet,放入pipeline顺序追加写入到Block中,示意图如下:

2 Chunk: 比Packet更小,是针对Packet数据校验粒度来设计的,一般是512B,由参数io.bytes.per.checksum控制,同时还带有一个4B的校验值,所以可以认为一个Chunk是516B

上面说到Chunk是针对数据校验的,那一个Packet有多少个chunk校验呢,如果Packet默认是64KB, 那计算公式为:chunk个数=64KB/516B=128。也就是对于一个Packet来说,数据值与校验值比例大概为128:1, 对于一个块来说,假设是64M,会对应512KB的校验文件。

Packet的示意图中还一个Header信息,实际存储的是Packet的元数据信息,包括Packet在block中的offset, 数据长度,校验编码等。

HDFS块设计原则

有人可能会问,集群存储有大文件也有小文件,那块大小该如何设计呢,这里应该要考虑2个准则:

1.减少内存占用:对于Namenode来说,单机内存毕竟有限,文件块越多,元数据信息越大,占用内存越多,如果文件数量级很大的话,单机将无法管理;

2.减少硬盘寻道时间: 数据块在硬盘为连续存储,对于普通SATA盘,随机寻址较慢, 如果块设置过小,一个文件的块总数会越多,意味着硬盘寻址时间会加长,自然吞吐量无法满足要求;如果块设置过大,一方面对于普通盘来说IO性能也比较差,加载时会很慢,另一方面,块过大,对于多副本来说,在副本出问题时,系统恢复时间越长。

所以设置合理的块大小也很重要,一般来说根据集群的需求来设定,比如对于使用到HBase的场景,一般数据量会比较大,块不宜设置太小,参考值一般为128MB或256MB,这样能尽量避免频繁块刷写和块元数据信息的膨胀;对于存储小文件的场景,如图片,块可设置成默认64MB大小,一个块中存储多个图片文件,后面会详细介绍。

参考文章:

https://www.cnblogs.com/ballwql/p/8944025.html

Hadoop上小文件如何存储?的更多相关文章

  1. 【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes

    使用hadoop上传文件 hdfs dfs -put  XXX 17/12/08 17:00:39 WARN hdfs.DFSClient: DataStreamer Exception org.ap ...

  2. hadoop上传文件失败解决办法

    hadoop上传文件到web端hdfs显示hadoop could only be replicated to 0 nodes instead of 1解决办法 错误状态:在hadoop-2.7.2目 ...

  3. Hadoop对小文件的解决方式

    小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.不论什么一个文件,文件夹和block,在HDFS中都会被表示为一个object存储在namenode的内存中, 每一 ...

  4. Hadoop合并小文件的几种方法

    1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支 ...

  5. Hadoop上传文件时报错: could only be replicated to 0 nodes instead of minReplication (=1)....

    问题 上传文件到Hadoop异常,报错信息如下: org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /home/inpu ...

  6. hadoop上传文件报错

    19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...

  7. Hadoop上传文件的报错

    baidu了很多,都说防火墙,datanode没有正常启动的问题,可是检查了都是正常,后来还是在老外的网站上找到了解决的方法 修改了/etc/security/limits.conf文件,上传成功 这 ...

  8. hadoop上传文件失败报错(put: Cannot create file/eclipse.desktop._COPYING_. Name node is in safe mode.)

    解决办法: 离开安全模式方法:执行以下命令即可 bin/hadoop  dfsadmin -safemode leave 若不处理安全模式的话,web服务无法启动,dfsadmin report结果异 ...

  9. 如何利用Hadoop存储小文件

    **************************************************************************************************** ...

随机推荐

  1. IT运维面试问题总结

    IT运维面试总结如下,后期更新于:https://www.yuque.com/docs/share/d3dd1e8e-6828-4da7-9e30-6a4f45c6fa8e. 欢迎基于学习.交流目的的 ...

  2. FPAG_Microblaze_PWM_定时器

    由于Xilinx底层库的定时器没有PWM例程,调试过程中费了不少劲.生产PWM需要两个定时器同时工作,一个控制频率,一个控制占空比,位数可通过硬件设置. #include "xtmrctr_ ...

  3. Python os.getcwdu() 方法

    概述 os.getcwdu() 方法用于返回一个当前工作目录的Unicode对象.高佣联盟 www.cgewang.com Unix, Windows 系统下可用. 语法 getcwdu()方法语法格 ...

  4. PHP convert_cyr_string() 函数

    实例 把字符串由一种字符集转换成另一种: <?php$str = "Hello world! æøå";echo $str . "<br>"; ...

  5. 6.29 省选模拟赛 坏题 AC自动机 dp 图论

    考场上随手构造了一组数据把自己卡掉了 然后一直都是掉线状态了. 最后发现这个东西不是subtask -1的情况不多 所以就没管无解直接莽 写题有点晚 故没调出来.. 考虑怎么做 容易想到建立AC自动机 ...

  6. SSRS - 请求因 HTTP 状态 401 失败: Unauthorized。

    原因: 1.SSRS报表服务器停止了,重启就可以了 2.用户没有权限 3.用户登录密码过期了,重设密码就可以了(如果用户是安装了client的话,直接让他远程登录改一下密码)

  7. MIME-TYPE 列表

    Suffixes applicable Media type and subtype(s) .3dm x-world/x-3dmf .3dmf x-world/x-3dmf .a applicatio ...

  8. SparkSQL & Spark on Hive & Hive on Spark

    刚开始接触Spark被Hive在Spark中的作用搞得云里雾里,这里简要介绍下,备忘. 参考:https://blog.csdn.net/zuochang_liu/article/details/82 ...

  9. MyBatis-Plus使用(4)-集成SpringBoot

    我这里使用的MyBatis-Plus是当前最新的3.2.0版本, 1. 引入需要的jar,基础jar包括: <dependencies> <dependency> <gr ...

  10. Qt编译出现cc1plus.exe: out of memory allocating 65536 bytes问题

    今天编译Qt程序,出现这个问题: cc1plus.exe: out of memory allocating 65536 bytes 这个还没有遇到过,上网查了下.问题原因是资源文件过大. qt的资源 ...