HDFS块详解

传统型分布式文件系统的缺点

现在想象一下这种情况:有四个文件 0.5TB的file1,1.2TB的file2,50GB的file3,100GB的file4;有7个服务器,每个服务器上有10个1TB的硬盘。

在存储方式上,我们可以将这四个文件存储在同一个服务器上(当然大于1TB的文件需要切分),我们需要使用一个文件来记录这种存储的映射关系吧。用户是可以通过这种映射关系来找到节点硬盘相应的文件的。那么缺点也就暴露了出来:

第一、负载不均衡。

因为文件大小不一致,势必会导致有的节点磁盘的利用率高,有的节点磁盘利用率低。

第二、网络瓶颈问题。

一个过大的文件存储在一个节点磁盘上,当有并行处理时,每个线程都需要从这个节点磁盘上读取这个文件的内容,那么就会出现网络瓶颈,不利于分布式的数据处理。

HDFS的块

HDFS与其他普通文件系统一样,同样引入了块(Block)的概念,并且块的大小是固定的。但是不像普通文件系统那样小,而是根据实际需求可以自定义的。块是HDFS系统当中的最小存储单位,在hadoop2.0中默认大小为128MB(hadoop1.x中的块大小为64M)。在HDFS上的文件会被拆分成多个块,每个块作为独立的单元进行存储。多个块存放在不同的DataNode上,整个过程中 HDFS系统会保证一个块存储在一个数据节点上 。但值得注意的是,如果某文件大小或者文件的最后一个块没有到达128M,则不会占据整个块空间

我们来看看HDFS的设计思想:以下图为例,来进行解释。

HDFS的块大小

HDFS上的块大小为什么会远远大于传统文件?

  1. 目的是为了最小化寻址开销时间。
    在I/O开销中,机械硬盘的寻址时间是最耗时的部分,一旦找到第一条记录,剩下的顺序读取效率是非常高的,因此以块为单位读写数据,可以尽量减少总的磁盘寻道时间。
    HDFS寻址开销不仅包括磁盘寻道开销,还包括数据块的定位开销,当客户端需要访问一个文件时,首先从名称节点获取组成这个文件的数据块的位置列表,然后根据位置列表获取实际存储各个数据块的数据节点的位置,最后,数据节点根据数据块信息在本地Linux文件系统中找到对应的文件,并把数据返回给客户端,设计成一个比较大的块,可以减少每个块儿中数据的总的寻址开销,相对降低了单位数据的寻址开销
    磁盘的寻址时间为大约在5~15ms之间,平均值为10ms,而最小化寻址开销时间普遍认为占1秒的百分之一是最优的,那么块大小的选择就参考1秒钟的传输速度,比如2010年硬盘的传输速率是100M/s,那么就选择块大小为128M。
  2. 为了节省内存的使用率
    一个块的元数据大约150个字节。1亿个块,不论大小,都会占用20G左右的内存。因此块越大,集群相对存储的数据就越多。所以暴漏了HDFS的一个缺点,不适合存储小文件。

为什么HDFS不适合存储小文件?

  1. 从存储能力出发(固定内存)
    因为HDFS的文件是以块为单位存储的,且如果文件大小不到128M的时候,是不会占用整个块的空间的。但是,这个块依然会在内存中占用150个字节的元数据。因此,同样的内存占用的情况下,大量的小文件会导致集群的存储能力不足。
    例如: 同样是128G的内存,最多可存储9.2亿个块。如果都是小文件,例如1M,则集群存储的数据大小为9.2亿*1M = 877TB的数据。但是如果存储的都是128M的文件,则集群存储的数据大小为109.6PB的数据。存储能力大不相同。

  2. 从内存占用出发(固定存储能力)
    同样假设存储1M和128M的文件对比,同样存储1PB的数据,如果是1M的小文件存储,占用的内存空间为1PB/1Mb150Byte = 150G的内存。如果存储的是128M的文件存储,占用的内存空间为1PB/128M150Byte = 1.17G的内存占用。可以看到,同样存储1PB的数据,小文件的存储比起大文件占用更多的内存。

块的相关参数设置

当然块大小在默认配置文件hdfs-default.xml中有相关配置,我们可以在hdfs-site.xml中进行重置
<property><name>dfs.blocksize</name><value>134217728</value><description>默认块大小,以字节为单位。可以使用以下后缀(不区分大小写):k,m,g,t,p,e以重新指定大小(例如128k, 512m, 1g等)</description>
</property><property><name>dfs.namenode.fs-limits.min-block-size</name><value>1048576</value><description>以字节为单位的最小块大小,由Namenode在创建时强制执行时间。这可以防止意外创建带有小块的文件降低性能。</description>
</property><property><name>dfs.namenode.fs-limits.max-blocks-per-file</name><value>1048576</value><description>每个文件的最大块数,由写入时的Namenode执行。这可以防止创建降低性能的超大文件</description>
</property>

块的存储位置

hdfs-site.xml中我们配置过下面这个属性,这个属性的值就是块在linux系统上的存储位置

<!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
<property><name>dfs.datanode.data.dir</name><value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>

HDFS的优点

  1. 高容错性(硬件故障是常态):数据自动保存多个副本,副本丢失后,会自动恢复
  2. 适合大数据集:GB、TB、甚至PB级数据、千万规模以上的文件数量,1000以上节点规模。
  3. 数据访问: 一次性写入,多次读取;保证数据一致性,安全性
  4. 构建成本低:可以构建在廉价机器上。
  5. 多种软硬件平台中的可移植性
  6. 高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
  7. 高可靠性:Hadoop的存储和处理数据的能力值得人们信赖.

HDFS的缺点

  1. 不适合做低延迟数据访问:
    HDFS的设计目标有一点是:处理大型数据集,高吞吐率。这一点势必要以高延迟为代价的。因此HDFS不适合处理用户要求的毫秒级的低延迟应用请求
  2. 不适合小文件存取:
    一个是大量小文件需要消耗大量的寻址时间,违反了HDFS的尽可能减少寻址时间比例的设计目标。第二个是内存有限,一个block元数据大内存消耗大约为150个字节,存储一亿个block和存储一亿个小文件都会消耗20G内存。因此相对来说,大文件更省内存。
  3. 不适合并发写入,文件随机修改:
    HDFS上的文件只能拥有一个写者,仅仅支持append操作。不支持多用户对同一个文件的写操作,以及在文件任意位置进行修改

全方位揭秘!大数据从0到1的完美落地之HDFS块详解相关推荐

  1. 全方位揭秘!大数据从0到1的完美落地之HDFS读写流程

    数据流 读流程的详解 读操作: hdfs dfs -get /file02 ./file02 hdfs dfs -copyToLocal /file02 ./file02 FSDataInputStr ...

  2. 全方位揭秘!大数据从0到1的完美落地之HDFS的工作机制

    HDFS的工作机制 开机启动Namenode过程 非第一次启动集群的启动流程 我们应该知道,在启动namenode之前,内存里是没有任何有关于元数据的信息的.那么启动集群的过程是怎样的呢?下面来叙述一 ...

  3. 全方位揭秘!大数据从0到1的完美落地之HDFS的体系结构

    HDFS的体系结构 体系结构解析 HDFS采用的是master/slaves这种主从的结构模型来管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).D ...

  4. 全方位揭秘!大数据从0到1的完美落地之大数据简介

    大数据简介 什么是大数据 ​ 最近几年,IT行业最火的名词中,少不了"大数据"."人工智能"."云计算"."物联网".& ...

  5. 全方位揭秘!大数据从0到1的完美落地之MapReduce实战案例(1)

    案例一: MR实战之小文件合并(自定义inputFormat) 项目准备 需求 无论hdfs还是MapReduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决 ...

  6. 全方位揭秘!大数据从0到1的完美落地之Shuffle和调优

    MapReduce高级 shuffle阶段 概述 MapReduce会确保每个reducer的输入都是按键排序的.从map方法输出数据开始.到作为输入数据传给reduce方法的过程称为shuffle. ...

  7. 全方位揭秘!大数据从0到1的完美落地之Hive自定义函数

    自定义函数 自定义函数介绍 hive的内置函数满足不了所有的业务需求.hive提供很多的模块可以自定义功能,比如:自定义函数.serde.输入输出格式等.而自定义函数可以分为以下三类: 1)UDF:u ...

  8. 全方位揭秘!大数据从0到1的完美落地之Mysql介绍

    导读 在大数据中,我们需要处理的数据来自不同的渠道,其中有一个很重要的渠道就是关系型数据库中存储的数据.在企业中,会把业务数据存储在关系型数据库中,一般以 MySQL 居多.另外,我们在后续的学习中需 ...

  9. 全方位揭秘!大数据从0到1的完美落地之Hive介绍

    Hive定义 Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张数据表,并可以使用类似SQL的方式来对数据文件进行读写以及管理.这套Hive SQL 简称HQL.Hive的 ...

最新文章

  1. notepad++及Scintilla
  2. 位图索引(bitmap index)冲突引起的TX锁争用
  3. python之datetime模块
  4. 设计一个串口服务器设备.《需求分析报告》,《项目开发,分布式多串口交换服务器的设计与实现...
  5. Jzoj5425 数论
  6. AnsiString用法(转)
  7. linux从哪里入侵电脑,linux入侵的基本命令网站安全 -电脑资料
  8. 开票接口系统能够解决的十大问题
  9. 流媒体服务器之 ZLMediaKit介绍
  10. 一个3D引擎Demo 源码
  11. COMSOL6.0软件安装说明+视频教程
  12. (原创)[短小精悍系列]RGB(RGI/RGV)颜色明度(亮度)计算公式 (又称灰度公式,彩色照片转黑白照片时能派上用场)
  13. 关于冒险岛,8090的不二游戏
  14. 实验一 Java编程基础
  15. Coder, 知道 《编码》吗?
  16. android-studio安装过程详解
  17. matlab中ct值直方图,【CT值与灰度值的总结】
  18. android speex AEC 回音消除
  19. 洽洽:百亿路上无“鲜”事
  20. S5PV210的定时器

热门文章

  1. 2019年大学热门专业有哪些?
  2. 大白菜装原版win7怎么装|大白菜win7原版安装教程
  3. C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表
  4. contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
  5. PHP带头大哥关于学习的观点
  6. 双城记:京城走进海关、电力讲解决方案,泉城展开“X+Y”渠道招募
  7. 用Python解“求符合给定条件的整数集”题
  8. 7-3 求符合给定条件的整数集 (15 分)
  9. 基于PythonGUI实现的学生选课管理系统
  10. 【Python】实训7:航空公司客户价值分析(K-means聚类)