产生背景及定义

HDFS:分布式文件系统,用于存储文件,主要特点在于其分布式,即有很多服务器联合起来实现其功能,集群中的服务器各有各的角色

  • 随着数据量越来越大,一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是管理和维护极不方便,于是迫切需要一种系统来管理多台机器上的文件,这就是分布式管理系统,HDFS是其中一种
  • HDFS的使用适合一次写入,多次读出的场景,且不支持对文件的直接修改,仅支持在文件末尾追加
  • HDFS采用流式的数据访问方式:特点就是像流水一样,数据不是一次过来,而是一点一点“流”过来,处理数据也是一点一点处理。如果是数据全部过来之后才处理,那么延迟就会很大,而且会消耗很大的内存。

优缺点

  1. 高容错性

    • 数据自动保存多个副本,通过增加副本的方式,提高容错性
    • 若某一个副本丢失后,它可以自动分配到其它节点作为新的副本
  2. 处理大数据
    • 数据规模:能够处理的数据规模可以达到GB,TB,甚至PB级别的数据
    • 文件规模:能够处理百万规模以上的文件数量,数量相当之大
  3. 可构建在廉价的机器上,通过多副本机制,提高可靠性

组成架构

  1. namenode(nn):就是Master,是一个管理者,存放元数据

    • 管理HDFS的名称空间
    • 配置副本策略
    • 管理数据块的映射信息
    • 处理客户端的读写请求
  2. datanode(dn):就是slave,真正存储文件的地方
    • 存储实际的数据块
    • 执行数据块的读写操作
  3. secondarynamenode(2nn):并非namenode的热备,当namenode挂掉的时候,并不能马上替换namenode并提供服务
    • 作为namenode的辅助,分担其工作量,比如定期合并Fsimage和Edits(文章后边会讲到这两个东西),并推送给namenode
    • 在紧急情况下,可辅助恢复namenode,但是只能恢复部分,而不能全部恢复
  4. client:客户端
    • 文件的切分,在上传HDFS之前,client将文件切分为一个一个的Block,然后一个一个进行上传
    • 与namenode交互,获取文件的datanode信息
    • 与datanode交互,读取或写入数据
    • client提供一些命令来管理HDFS,比如namenode的格式化
    • client通过一些命令来访问HDFS,比如对HDFS的增删查改等

文件块大小

为什么要把文件抽象为Block块存储?

  1. block的拆分使得单个文件大小可以大于整个磁盘的容量,构成文件的Block可以分布在整个集群, 理论上,单个文件可以占据集群中所有机器的磁盘。
  2. Block的抽象也简化了存储系统,对于Block,无需关注其权限,所有者等内容(这些内容都在文件级别上进行控制)。
  3. Block作为容错和高可用机制中的副本单元,即以Block为单位进行复制。

HDFS中的文件在物理内存中分块存储(Block),块的大小在Hadoop2.x版本中默认为128M,在老版本中为64M,那么为什么为128M呢?

其实,HDFS的块的大小的设置主要取决于磁盘传输速率,如下:

  1. 如果在HDFS中,寻址时间为10ms,即查找到目标Block的时间为10ms
  2. 专家说操作的最佳状态为:寻址时间为传输时间的1%,因此传输时间为1s
  3. 而目前磁盘的传输速率普遍为100M/s

为什么块大小不能设置太小,也不能设置太大?

  1. HDFS的块设置太小,会增加寻址时间,使得程序可能一直在寻找块的开始位置
  2. 如果设置的太大,从磁盘传输数据的时间会明显大于定位这个块所需的寻址时间,导致程序处理这块数据时会非常慢

HDFS的数据流

HDFS写数据流程

  1. 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
  2. NameNode返回是否可以上传。
  3. 客户端请求第一个 Block上传到哪几个DataNode服务器上。
  4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3, 如果有多个节点,返回实际的副本数量,并根据距离及负载情况计算
  5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
  6. dn1、dn2、dn3逐级应答客户端。
  7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
  8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

网络拓扑---节点距离计算

在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据,那么这个最近距离是怎么计算的呢?

结论:两个节点到达最近的共同祖先的距离总和,即为节点距离。

如上图所示:

  • 同一节点上的进程节点距离为0
  • 同一机架上不同节点的距离为两个节点到共同机架r1的距离总和,为2
  • 同一数据中心不同机架的节点距离为两个节点到共同祖先集群d1的距离之和,为4
  • 不同数据中心的节点距离为两个节点到达共同祖先数据中心的距离之和,为6

机架感知(副本存储的节点选择)

副本的数量我们可以从配置文件中设置,那么HDFS是怎么选择副本存储的节点的呢?

如上图所示,为了提高容错性,有如下设置,加入现在有3个副本:

  • 第一个副本在Client所在的节点上,如果客户端在集群外,则随机选一个
  • 第二个副本和第一个副本位于相同机架,随机节点
  • 第三个副本位于不同机架,随机节点

这样做的目的就是为了提高容错性。

HDFS读数据流程

  1. 客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
  2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  3. DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

浅谈HDFS(一)的更多相关文章

  1. 浅谈HDFS(二)之NameNode与SecondaryNameNode

    NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...

  2. 浅谈HDFS(三)之DataNote

    DataNode工作机制 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode启动后向Nam ...

  3. 浅谈mapreduce程序部署

    尽管我们在虚拟机client上能非常快通过shell命令,进行运行一些已经封装好实例程序,可是在应用中还是是自己敲代码,然后部署到server中去,以下,我通过程序进行浅谈一个程序的部署过程. 在启动 ...

  4. 【转】浅谈分布式服务协调技术 Zookeeper

    非常好介绍Zookeeper的文章, Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS, ...

  5. [转]浅谈Hive vs. HBase 区别在哪里

    浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...

  6. 浅谈一下流式处理平台Flink

    浅谈一下流式处理平台(Flink) 大数据框架听过很多,比如 Hadoop,HDFS...不过自己的项目都没有上过 为什么突然提到 Flink,因为最近一个项目需要用到,所以学习最好的方式就是项目驱动 ...

  7. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  8. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  9. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

随机推荐

  1. LoRa硬件调试-前导码

    前言 已知LoRa数据包在负载之前会有一段前导码,接收端是先检测前导码,收到前导码之后才认为有数据发送过来. 那么不同的前导码的长度会有什么影响呢? 前导码长短的优劣势 - 前导码实际上是占符号的,也 ...

  2. python 之os模块用法大全

    Python的标准库中的os模块包含普遍的操作系统功能.这个模块的作用主要是提供与平台无关的功能.也就是说os模块能够处理平台间的差异问题,使得编写好的程序无需做任何改动就能在另外的平台上运行 这边给 ...

  3. Hibernate中Criteria的完整用法2

    Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...

  4. 梳理commons-lang工具包

    目录 概述 builder包 NumberUtils 转换 String 类型为原始类型 截取小数位数 创建包装类型 最大值 | 最小值 关于数字的检查 mutable包 relect包 Constr ...

  5. Linux 用户和组 权限管理 常用命令与参数

    ========================================================================== 1.基本概念: 所有者 : 一般为文件的创建者,谁 ...

  6. CSS文本超出用省略号代替的方法

    { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

  7. 13张PPT带你了解主动式消息队列处理集群

    前言 偷偷和你们说,我搞了一份内部资料,该内部资料共有13张PPT,据作者透露,该PPT至少花了整整1周时间才编写完成,其内容简洁明了,内容深度足够,易于初学者理解,也给深度开发人员分享了不一样的消息 ...

  8. Java IO体系之File类浅析

    Java IO体系之File类浅析 一.File类介绍 位于java.io下的Java File类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等.File对 ...

  9. 海量数据搜索---demo展示百度、谷歌搜索引擎的实现

    在我们平常的生活工作中,百度.谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说得好,“有问题找度娘”.那么百度是如何在海量数据中找到自己需要的数据呢?为什么它搜索的速度如此之快?我们都知道是因为百 ...

  10. 《快照读、当前读和MVCC》

    1.快照读 快照读是基于 MVCC 和 undo log 来实现的,适用于简单 select 语句,避免了幻读. 读已提交:一个事务内操作一条数据,可以查询到另一个已提交事务操作同一条数据的最新值.( ...