产生背景及定义

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. JavaScript数组方法大全(第二篇)

    数组方法大全(第二篇) 注意:如有错误欢迎指出,如有雷同纯属巧合,本博客参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 forEach()方法 遍历数组,里面可以传递一个方法 v ...

  2. 十分钟搞懂Lombok使用与原理

    1 简介 Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它.Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的 ...

  3. Android开发之输入框EditText介绍

    这篇文章主要为大家详细介绍了Android布局之输入框EditText设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 现在先简单介绍一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现 ...

  4. NDK Cmake

    CMake与NDK搭配使用时,可以配置的部分变量: 1. `ANDROID_PLATFORM`:指定Android的目标版本,对应`$NDK/platforms/`目录下的版本.通常情况下是`defa ...

  5. Docker搭建Zookeeper&Kafka集群

    最近在学习Kafka,准备测试集群状态的时候感觉无论是开三台虚拟机或者在一台虚拟机开辟三个不同的端口号都太麻烦了(嗯..主要是懒). 环境准备 一台可以上网且有CentOS7虚拟机的电脑 为什么使用虚 ...

  6. Python3 完美解决unittest框架下不生成测试报告

    前提: 1.运行测试用例一切正常,只是没有测试报告显示 2.使用命令行pyhon 脚本名字.py 却可以生成测试报告 3.pycharm 在运行测试用例的时候 默认是以unittest 框架来运行的, ...

  7. HDU 6394 Tree 分块 || lct

    Tree 题意: 给你一颗树, 每一个节点都有一个权值, 如果一个石头落在某个节点上, 他就会往上跳这个的点的权值步. 现在有2种操作, 1 把一个石头放在 x 的位置 询问有跳几次才跳出这棵树, 2 ...

  8. codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)

    题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...

  9. hdu 1078 FatMouse and Cheese(简单记忆化搜索)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:给出n*n的格子,每个各自里面有些食物,问一只老鼠每次走最多k步所能吃到的最多的食物 一道 ...

  10. yzoj1657货仓选址 题解

    题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的 ...