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. 马哥Linux--elasticsearch

    ELK stack: Lucene: 文档:document 包含了一个或多个域的容器 field:value 域: 有很多选项 索引选项,存储选项,域向量使用选项 索引选项用于通过倒排索引来控制文本 ...

  2. Https实践

    https实践 常用端口 ssh 22 telnet 23 ftp 21 rsync 873 http 80 mysql 3306 redis 6379 https 443 dns 53 php 90 ...

  3. mysql基础之查询缓存、存储引擎

    一.查询缓存 "查询缓存",就是将查询的结果缓存下载,如果查询语句完全相同,则直接返回缓存中的结果. 如果应用程序在某个场景中,需要经常执行大量的相同的查询,而且查询出的数据不会经 ...

  4. GO学习-(11) Go语言基础之map

    Go语言基础之map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能 ...

  5. Nginx限制访问速率和最大并发连接数模块--limit

    Nginx限制访问速率和最大并发连接数模块--limit Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/ ...

  6. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  7. CUDA 11功能清单

    CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...

  8. 使用Tensorize评估硬件内部特性

    使用Tensorize评估硬件内部特性 这是有关如何在TVM中执行张量的入门文档. 通过使用调度原语tensorize,人们可以用相应的内部函数代替计算单元,从而轻松利用handcrafted mic ...

  9. 在 CUDA C/C++ kernel中使用内存

    在 CUDA C/C++ kernel中使用内存 如何在主机和设备之间高效地移动数据.本文将讨论如何有效地从内核中访问设备存储器,特别是 全局内存 . 在 CUDA 设备上有几种内存,每种内存的作用域 ...

  10. halcon——缺陷检测常用方法总结(频域空间域结合)

    摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...