HDFS全称Hadoop Distributed File System,看名字就知道是Hadoop生态的一个组件,它是一个分布式文件系统。
它的出现解决了独立机器存储大数据集的压力,它将数据集进行切分,存储在若干台计算机上。

HDFS 的特点与应用场景

适合存储大文件

HDFS 支持 GB 级别甚至 TB 级别的文件,它会把大文件切分成若干个块存储在不同的节点上,在进行大文件读写时采用并行的方式提高数据的吞吐量。

容错性高

HDFS有多副本机制,它会自动保存副本到不同的节点。即使有一台节点宕机了也不会丢失数据。

适用于流式的数据访问

HDFS 适用于批量数据的处理,不适合交互式处理。它设计的目标是通过流式的数据访问保证高吞吐量,不适合对低延迟用户响应的应用。

适用于读多写少场景

HDFS 中的文件支持一次写入、多次读取,写入操作是以追加的方式(append)添加在文件末尾,不支持对文件的任意位置进行修改。

HDFS的相关概念

数据块(Block)

和磁盘的数据块概念相似,磁盘中的块是数据读写的最小单位,而HDFS中文件被切分成多个块,作为独立的存储单元,但是比磁盘的块大得多,默认为128MB,且小于一个块大小的文件不会占据整个块的空间。
需要说明的一点是,数据块不能设置太小,否则在查找的过程中会造成寻址时间长,导致效率慢;另一方面,数据块太小会造成很多小文件,进而造成元数据也更多,占用内存就更多。

NameNode和DataNode

HDFS中由NameNode和DataNode组成Master-Slave模式(主从模式)运行,NameNode负责管理文件系统的命名空间和文件元数据,记录了每个文件中各个块所在的数据节点信息,而DataNode则是HDFS中的工作节点,负责存储数据和读写操作。简单理解就是NameNode是主管,DataNode是负责干活的工人。

Secondary NameNode

若NameNode故障,文件系统上的文件将会丢失,因此对NameNode实现容错很重要,Hadoop中提供了两种容错机制,一种是备份那些组成文件系统元数据持久状态的文件;另一种就是用Secondary NameNode.
需要注意的是,Secondary NameNode运行在独立的计算机上,它只是一个辅助而不是一个备用,它不能被用于NameNode。它用于定期合并编辑日志和命名空间镜像,防止编辑日志过大,在NameNode发生故障时启用。

块缓存

DataNode进行读写操作,一般是从磁盘读取,但对于读取频繁的文件,可以被缓存在DataNode的内存中,以提高读操作的性能。

HDFS 架构

Namenode管理元数据;Datanode存储Block;Block有多个副本存在不同的节点;节点可以放在不同的机架(Rack);客户端通过与Namenode与Datanode交互读取数据(具体的读写流程后面讲)

机架感知和副本机制

通常,大型Hadoop集群会分布在很多机架上。
一般为了提高效率,希望不同节点之间的通信尽量发生在同一个机架之内,而不是跨机架。
另外为了提高容错能力,尽可能把数据块的副本放到多个机架上。
机架感知并不是自动感知的,而是需要管理者告知集群实现的。
以一个三副本为例,HDFS机架感知和副本机制大概如图所示

读写流程

读操作

简要流程:
客户端向NameNode发起读数据请求;
NameNode响应请求并告诉客户端要读的文件的数据块位置;
客户端就近到对应DataNode取数,当数据读取到达末端,关闭与这个DataNode的连接,并查找下一个数据块,直到文件数据全部读完;
最后关闭输出流。
详细流程:
  1. 客户端通过调用 FileSystem 对象的 open() 方法来打开希望读取的文件,对于 HDFS 来说,这个对象是分布式文件系统的一个实例;
  2. DistributedFileSystem 通过RPC 调用 NameNode 以确定文件起始块的位置,由于存在多个副本,因此Namenode会返回同一个Block的多个文件的位置,然后根据集群拓扑结构排序,就近取;
  3. 前两步会返回一个 FSDataInputStream 对象,该对象会被封装成 DFSInputStream 对象,DFSInputStream 可以方便的管理 datanode 和 namenode 数据流,客户端对这个输入流调用 read() 方法;
  4. 存储着文件起始块的 DataNode 地址的 DFSInputStream 随即连接距离最近的 DataNode,通过对数据流反复调用 read() 方法,可以将数据从 DataNode 传输到客户端;
  5. 到达块的末端时,DFSInputStream 会关闭与该 DataNode 的连接,然后寻找下一个块的最佳 DataNode,这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流;
  6. 一旦客户端完成读取,就对 FSDataInputStream 调用 close() 方法关闭文件读取。

写操作

简单流程:
客户端发起写数据请求;
NameNode响应请求,然后做一些检查,比如查看文件是否存在,达标则创建文件;
客户端将文件切分成若干个块,然后上传,先把第一个块传到Datanode1,然后Datanode1再传给Datanode2,以此类推,传完为止;
成功后DataNode会返回一个确认队列给客户端,客户端进行效验,然后客户端上传下一个数据块到DataNode,直到所有数据块写入完成;
当所有数据块全部写入成功后,客户端会向NameNode发送一个反馈并关闭数据流。
详细流程:
  1. 客户端通过调用 DistributedFileSystem 的 create() 方法创建新文件;
  2. DistributedFileSystem 通过 RPC 调用 NameNode 去创建一个没有 Blocks 关联的新文件,创建前 NameNode 会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode 会为创建新文件记录一条记录,否则就会抛出 IO 异常;
  3. 前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode 和 Datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue);
  4. DataStreamer 会去处理接受 Data Queue,它先问询 NameNode 这个新的 Block 最适合存储在哪几个 DataNode 里,比如重复数是 3,那么就找到 3 个最适合的 DataNode,把他们排成一个 pipeline。DataStreamer 把 Packet 按队列输出到管道的第一个 Datanode 中,第一个 DataNode 又把 Packet 输出到第二个 DataNode 中,以此类推;
  5. DFSOutputStream 还有一个队列叫 Ack Quene,也是由 Packet 组成,等待 DataNode 的收到响应,当 Pipeline 中的所有 DataNode 都表示已经收到的时候,这时 Akc Quene 才会把对应的 Packet 包移除掉;
  6. 客户端完成写数据后调用 close() 方法关闭写入流;
  7. DataStreamer 把剩余的包都刷到 Pipeline 里然后等待 Ack 信息,收到最后一个 Ack 后,通知 NameNode 把文件标示为已完成。

总结

本文简单讲了 HDFS 的特点与应用场景、相关概念、架构、副本机制和机架感知以及读写流程。如果觉得有帮到你或者有所收获,麻烦动动小手点个赞或随手转发。
微信扫码关注不迷路,第一时间获取文章哦
   
 

大数据 | 分布式文件系统 HDFS的更多相关文章

  1. 大数据 --> 分布式文件系统HDFS的工作原理

    分布式文件系统HDFS的工作原理 Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数 ...

  2. 大数据 | 分布式文件系统HDFS 练习

    本次作业来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 利用Shell命令与HDFS进行交互 以”./bin/dfs ...

  3. 大数据技术原理与应用——分布式文件系统HDFS

    分布式文件系统概述 相对于传统的本地文件系统而言,分布式文件系统(Distribute File System)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统.分布式文件系统的设计一般采用 ...

  4. Hadoop分布式文件系统--HDFS结构分析

    转自:http://blog.csdn.net/androidlushangderen/article/details/47377543 HDFS系列:http://blog.csdn.net/And ...

  5. 【转载】Hadoop分布式文件系统HDFS的工作原理详述

    转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文 ...

  6. 大数据篇:HDFS

    HDFS HDFS是什么? Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File Syste ...

  7. 你想了解的分布式文件系统HDFS,看这一篇就够了

    1.分布式文件系统 计算机集群结构 分布式文件系统把文件分布存储到多个节点(计算机)上,成千上万的计算机节点构成计算机集群. 分布式文件系统使用的计算机集群,其配置都是由普通硬件构成的,与用多个处理器 ...

  8. Hadoop第三天---分布式文件系统HDFS(大数据存储实战)

    1.开机启动Hadoop,输入命令:  检查相关进程的启动情况: 2.对Hadoop集群做一个测试:   可以看到新建的test1.txt和test2.txt已经成功地拷贝到节点上(伪分布式只有一个节 ...

  9. 大数据技术 - 分布式文件系统 HDFS 的设计

    本章内容介绍下 Hadoop 自带的分布式文件系统,HDFS 即 Hadoop Distributed Filesystem.HDFS 能够存储超大文件,可以部署在廉价的服务器上,适合一次写入多次读取 ...

随机推荐

  1. SSM整合(ForestBlog为例)

    SSM整合(ForestBlog为例) 原版本github地址 :https://github.com/saysky/ForestBlog 文中版本地址:https://github.com/Yans ...

  2. Linux_WEB访问控制示例(使用IPADDR类型)

    前言: WEB服务使用访问控制,可以控制IP.主机名.以及某个网段的IP去访问我们的WEB服务,从而加减少流量的访问 一.使用IP控制访问 1.在/var/www/html下创建一个可访问的测试页面 ...

  3. 034.Python的__str__,__repr__,__bool__ ,__add__和__len__魔术方法

    Python的其他方法 1 __str__方法 触发时机: 使用print(对象)或者str(对象)的时候触发 功能: 查看对象信息 参数: 一个self接受当前对象 返回值: 必须返回字符串类型 基 ...

  4. gpcj-07.为什么是连锁零售类公司

    1.量化分析的真面目 本课的目的: ·理解零售类公司价值分析的逻辑·学会量化分析公司的思路和原理前言的前沿 和大部分投资者不同,我们的投资核心之一,就是从下而上的分析.宏观经济对我们公司分析影响极少. ...

  5. 解决element-ui el-input输入框内容无法修改的问题

    wqy的笔记:http://www.upwqy.com/details/271.html el-input  中  使用 :value 时  input输入的内容无法修改 <el-input : ...

  6. linux 安装配置NFS服务器

    一.Ubuntu安装配置NFS 1.安装NFS服务器 sudo apt-get install nfs-kernel-server 安装nfs-kernel-server时,apt会自动安装nfs-c ...

  7. Resnet-50网络结构详解

    解决的问题: 由于梯度消失,深层网络很难训练.因为梯度反向传播到前面的层,重复相乘可能使梯度无穷小.结果就是,随着网络的层数更深,其性能趋于饱和,甚至迅速下降. 核心思想: 引入一个恒等快捷键(也称之 ...

  8. CVPR2018论文看点:基于度量学习分类与少镜头目标检测

    CVPR2018论文看点:基于度量学习分类与少镜头目标检测 简介 本文链接地址:https://arxiv.org/pdf/1806.04728.pdf 距离度量学习(DML)已成功地应用于目标分类, ...

  9. 重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots

    重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots VISIBILITY AROUND HEAVY VEHICLES A blind spot is an ...

  10. fiddler选项卡-Statistc(统计)

    Statistc Statistc是fiddler用来对session列表里的Session相关情况的统计,利用这个选项,可以对请求进行性能以及其他数据分析 1.界面 2.参数详解 建议:打开fidd ...