Hadoop之分布式文件系统 —— HDFS

一、HDFS简介

HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。


二、HDFS设计原理

2.1、HDFS架构

在这里插入图片描述
HDFS采用master/slave架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成。


2.2、HDFS组成角色及功能

在这里插入图片描述

角色 功能
Client(客户端) 1.上传数据的时候对数据进行分块,下载数据的时候对数据进行合并
2.与NameNode进行通信,在进行数据上传的时候获取数据上传时的数据节点,在数据下载的时候获取存储数据的节点
3.与DataNode进行通信进行数据的上传和下载
4.管理和访问整个HDFS
NameNode(元数据节点) 1.管理HDFS中命名空间 (NameSpace) 的元数据
2.处理client的读写请求
3.负责管理文件block的映射信息
DataNode(数据节点) 1.数据存储节点,用于保存和检索block
2.执行数据读写操作
Secondary NameNode(从元数据节点) 1.辅助NN,分担其工作量
2.合并NameNode的edit logs到fsimage文件中,再将fsimage拷贝给NameNode
3.在紧急情况下,可辅助恢复NN

2.3、HDFS副本机制

在这里插入图片描述

  • 副本机制存放的是什么?

Block:数据块
是HDFS最基本的存储单元
默认大小:在 Hadoop2.x版本中是128M Hadoop1.x版本中是64M

hdfs-site.xml里有dfs.blocksize,规定了每个块是128M

<name>dfs.blocksize</name>
<value>134217728</value>

hdfs-site.xml里有dfs.replication,规定每个块的副本数量

<name>dfs.replication</name>
<value>3</value>  

副本数默认为3

  • 副本存放机制

如上图
一个块在本地机架(rack)节点
一个块在同一个机架不同节点
一个块在不同机架的节点

  • 为什么需要副本机制?

在使用集群时,我们需要的是大量相对廉价的计算机,那么宕机就是一种必然事件,我们需要让数据避免丢失,就只有采取冗余数据存储,而具体的实现就是副本机制


三、HDFS优缺点

优点:

特点 体现
高容错性 1.数据自动保存多个副本
2.某一个副本丢失以后,它可以自动恢复
适合大数据处理 数据规模:能够处理数据规模达到 GB、TB、甚至PB级别的数据
文件规模:能够处理百万规模以上的文件数量,数量相当之大
节点规模:能够处理10K节点的规模
流式数据访问 1.一次写入,多次读取,不能修改,只能追加
2.它能保证数据的一致性
可构建在廉价机器上 1.它通过多副本机制,提高可靠性
2.它提供了容错和恢复机制。比如某一个副本丢失,可以通过其它副本来恢复

缺点:

特点 体现
不适合低延时数据访问 适合高吞吐率的场景,就是在某一时间内写入大量的数据。不支持低延时,比如毫秒级以内读取数据
不适合小文件存取场景 1.大量小文件会占用 NameNode大量的内存来存储文件、目录和块信息
2.小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标
不适合并发写入、文件随机修改场景 1.一个文件不允许多个线程同时写
2.仅支持数据追加,不支持文件的随机修改

四、HDFS读写过程

4.1、HDFS写文件

在这里插入图片描述

  1. client 通过 Distributed FileSystem 向 NN (NameNode) 发出写入请求
  2. NN 进行资源验证,验证源文件是否存在,目标路径是否存在,client 是否有写权限,若源文件不存在/目标路径存在/client没有写权限,会让客户端抛出异常,成功则会为文件创建一个记录
  3. client 将文件切块,并请求 NN 获得第一个 block 存储的 DN (DataNode) 列表(副本数默认为3)
  4. NN 返回 DN 列表:dn1、dn2、dn3
  5. client 通过FSData OutputStream 请求 dn1 上传数据,dn1 收到请求后会继续请求dn2,然后dn2请求dn3,建立通信管道,然后dn3响应dn2、dn2响应dn1、dn1响应client,此时通信管道建立完毕
  6. client 开始上传第一个 block 到 dn1,每次以 packet(64kb) 为单位上传,dn1 每传一个 packet 都会建立一个应答队列等待应答,然后依次传给dn2、dn3。dn3、dn2、dn1逐级应答,并将结果返回client,然后开始下一个 packet 的传输,直至第一个 block 上传完毕
  7. 关闭FSData OutputStream
  8. client 发送 complete 给 NN
  9. 重读3-8步骤,直到文件上传完毕

4.2、HDFS读文件

在这里插入图片描述

  1. client 通过调用FileSystem.open()方法创建 DFS (Distributed FileSystem)
  2. DFS通过 RPC(远程过程调用) 请求NN获得部分或全部 block 有序列表

• 列表会根据 block 与 client 距离进行升序排序
• 每个 block 都包含 DN 的地址,如果 client 就是DN,则本地读取

  1. NN会返回一个支持文件定位的输入流对象 FSDIS(FSDataInputStream)
  2. client 通过调用 FSDIS 的 read() 方法,会找出离客户端最近的DataNode并与之建立连接
  3. client通过IO流读取 DataNode 中的数据,当第一个block读取完毕,会关闭与 DN 的连接,并继续连接下一个距离最近的 DN,直到这一批的 block 读取完毕
  4. 重复2-5步骤,直到所有 block 读取完毕
  5. 关闭所有流

五、HDFS Shell命令

基本格式

hdfs dfs -cmd

查看可用命令

hdfs dfs

创建存放数据文件的目录

hdfs dfs -mkdir -p /hdfs/shell
hdfs dfs -ls /hdfs/shell

上传数据到HDFS并查看

hdfs dfs -put /home/test.txt /hdfs/shell
hdfs dfs -text /hdfs/shell/test.txt

下载文件到本地

hdfs dfs -get /hdfs/shell/test.txt /home/

统计目录下文件大小

hdfs dfs -du /hdfs/shell

删除、移动数据文件和目录

hdfs dfs -rm /hdfs/shell/test.txt
hdfs dfs -rmr /hdfs
hdfs dfs -rm -r /hdfs
hdfs dfs -cp /hdfs/shell/test.txt /hdfs/
hdfs dfs -mv /hdfs/shell/test.txt /hdfs/

修改文件权限
改变文件所有者

hdfs dfs -chmod
hdfs dfs -chown

六、NameNode 和 SecondaryNameNode

NN 和 SNN 工作机制

第一阶段 NameNode
(1)第一次启动 NameNode 格式化后,创建 fsimage 和 edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存
(2)客户端对元数据进行增删改的请求
(3)NameNode 记录操作日志,更新滚动日志
(4)NameNode 在内存中对数据进行增删改查

第二阶段 Secondary NameNode
在这里插入图片描述
(1)Secondary NameNode 询问 NameNode 是否需要 checkpoint。直接带回
NameNode 是否检查结果
(2)Secondary NameNode 请求执行 checkpoint
(3)NameNode 滚动正在写的 edits 日志
(4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode
(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并
(6)生成新的镜像文件 fsimage.chkpoint
(7)拷贝 fsimage.chkpoint 到 NameNode
(8)NameNode 将 fsimage.chkpoint 重新命名成 fsimage

猜你喜欢

转载自blog.csdn.net/weixin_48482704/article/details/110726547
今日推荐