分布式文件系统HDFS(2020-12-01)

Hadoop 分布式文件系统-HDFS

1. HDFS 组成架构

在这里插入图片描述
架构主要由四个部分组成,分别为 HDFS ClientNameNodeDataNode
Secondary NameNode

1.Client:就是客户端,自己编写的代码+Hadoop API。其主要功能:
(1)进行文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行存储。
(2)当我们要查询一个文件时,与 NameNode 交互,获取文件的位置信息。
(3)与 DataNode 交互,读取或者写入数据。
(4)Client 提供一些命令来管理 HDFS,比如启动或者关闭 HDFS。
(5)Client 可以通过一些命令来访问 HDFS。

2.NameNode:就是 Master,也叫 HDFS 的元数据节点。集群中只能有一个活动的 NameNode 对外提供服务。
(1)管理 HDFS 的名称空间(文件目录树);
(2)管理数据块(Block)映射信息及副本信息;一个文件对应的块的名字以及块被
存储在哪里,以及每一个文件备份多少都是由 NameNode 来管理;
(3)处理客户端读写请求。

3.DataNode:就是 Slave。实际存储数据块的节点,NameNode 下达命令,DataNode
执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作。

4.Secondary NameNode: 当 NameNode 挂掉的时候,它并不能马上替换 NameNode
并提供服务。它的功能如下:
(1)合并NameNode的edit到fsimage中;
(2)辅助NameNode将内存中的元数据信息持久化

2. HDFS 优缺点

(1)优点

  • 高容错性(多副本、副本自动恢复)
    yarn->datanode
    yarn->appmaster- >container
    zookeeper (ha) ->namenode
  • 适合大数据处理(PB级数据规模)
  • 流式数据访问(一次写入,多次读取,文件一旦写入不能修改,只能追加,数据一致性)
  • 可构建在廉价的机器上(多副本机制提高可靠性)

(2)缺点

  • 不适合低延时数据访问场景,I0操作频繁
  • 不适合小文件存取场景(NN内存有限、寻址时间过高)
  • 不适合并发写入、文件随机修改场景(没有事务,没有锁机制)

3. 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(64KB)为单位,dn1 收到一个 packet 就会传给 dn2,dn2;
传给 dn3;dn1 每传一个 packet 会放入一个应答队列等待应答dn3,dn2,dn1逐级应答,并将结果反馈给client;
8.当一个 block 传输完成之后,关闭FSDOS,client发送complete给 NameNode。
9、客户端再次请求 NameNode 上传第二个 block
的服务器。(重复执行 3-8 步)。

4. HDFS 读数据流程

在这里插入图片描述
1.首先调用 FileSystem.open()方法,获取到 DistributedFileSystem 实例
2.DistributedFileSystem 向 Namenode 发起 RPC(远程过程调用)请求获得文件的开始部分或全部 block 列表,对于每个返回的块,都包含块所在的DataNode 地址。这些 DataNode 会按照 Hadoop 定义的集群拓扑结构得出客户端的距离,然后再进行排序。如果客户端本身就是一个 DataNode,那么他将从本地读取文件。
3.DistributedFileSystem 会向客户端 client 返回一个支持文件定位的输入流对象 FSDataInputStream,用于客户端读取数据。FSDataInputStream 包含一个 DFSInputStream 对象,这个对象用来管理 DataNode和 NameNode 之间的 I/O
4.客户端调用 read()方法,DFSInputStream 就会找出离客户端最近的datanode 并连接 datanode
5.DFSInputStream 对象中包含文件开始部分的数据块所在的 DataNode 地址,首先它会连接包含文件第一个块最近 DataNode。随后,在数据流中重复调用 read()函数,直到这个块全部读完为止。如果第一个 block 块的数据读完,就会关闭指向第一个 block 块的 datanode 连接,接着读取下一个 block 块
6.如果第一批 block 都读完了,DFSInputStream 就会去 NameNode 拿下一批blocks 的 location,然后继续读,如果所有的 block 块都读完,这时就会关闭掉所有的流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值