HDFS

作者: 珺王不早朝 | 来源:发表于2021-04-23 16:53 被阅读0次

1. 概念


HDFS 全称 Hadoop Distribute File System,是⼀个 高可靠、高吞吐的 分布式文件系统
HDFS 作为 Apache Hadoop 三大组件之一,功能面向海量数据存储,其核心是 基于 块机制副本机制数据存储策略

  • 核心思想:分治
  • 存入原理:数据切割 --> 制作副本 --> 分散储存
  • 读取原理:获取位置 --> 分别下载 --> 数据拼接

HDFS 适合 “一次写入,多次读出” 的场合,支持文件的追加写入,不支持文件的随意修改
因此,HDFS 适合为 大数据分析 提供 底层存储服务,而不是适合用来做“网盘”(修改数据不方便、延迟大,网络开销大,成本过高)
若要实现海量数据的快速访问和随机读写,应考虑使用 HBase

1.1 block 块机制

从物理层面讲,数据在 HDFS 上是分块(block)存储的,块的大小可以通过参数进行配置
在 Hadoop 2.x 版本中,默认的 block 大小是 128MB;

1.2 副本机制

HDFS 为所有文件的所有 block 都存储了副本,以实现高可靠性和高容错
除 block 的大小之外,block 的副本个数(也称副本系数)也可以通过参数配置
副本系数可以在创建文件前指定,也支持后续修改
HDFS 默认的 block 副本系数为 3 个

1.3 Master / Slave 架构

HDFS 是典型的 Master / Slave 主从节点结构
一般是由一个NameNode作为集群主节点,多个DataNode作为集群从节点

1.4 NameSpace 命名空间

HDFS 支持传统目录式的层次型文件组织结构,用户和程序可以对目录和文件进行 创建、删除、移动、重命名 等操作
NameNode 负责维护文件系统的命名空间,记录任何对文件系统命名空间(或属性)的修改
HDFS 提供抽象目录树以供访问,访问形式为 hdfs:// NameNode 所在节点的主机名(hostname) : 端口(port) / 目标目录
例如:hdfs://linux111:9000/path//target

2. 结构


NN,2NN,DN 即是角色名称、进程名称,同时也代指电脑节点名称

  • NameNode(NN)
    身份:HDFS 集群的管理者,Master 节点
    职责:
      1. 处理客户端读写请求
      2. 存储与维护 HDFS 元数据
       1)维护 命名空间:记录 目录结构、文件属性(生成时间、block 数、权限)
       2)维护 副本策略:记录 各个文件 block 的副本数
       3)维护 映射关系:记录 文件的块信息(尤其是 block 与 DataNode 的映射信息)
  • SecondaryNameNode(2NN)
    身份:HDFS 集群的观察者,NameNode 的辅助者
    职责:
      1. 监控 HDFS 状态
      2. 周期性存储元数据快照

  • DataNode(DN)
    身份:HDFS 集群的工作者,副本的存储者,数据的操作者,Slave 节点
    职责:
      1. 存储 block -- 多个副本由不同的 DataNode 存储
      2. 读写 block
      3. 校验 package
      4. 汇报块信息 -- 定时向 NameNode 汇报自己存储的 block 信息

  • Client
    身份:客户端
    职责:
      1. 设置时:发送指令 -- 通过指令对 HDFS 进行设置与管理
      2. 上传时:切割文件 -- 上传文件时将其切割成若干个 block
      3. 下载时:拼接文件 -- 将分散下载的各个 block 拼接完整
       1)寻址:与 NameNode 交互,获取文件位置信息
       2)下载:与 DataNode 交互,读取 block

3. 命令


3.1 Shell 命令行指令

格式:bin/hadoop fs 或者 bin/hdfs dfs + 具体命令(一般推荐使用后者)
在 Shell 命令行中输入 hdfs dfs 可以查看所有的 HDFS 指令

HDFS 常用的命令行指令有:

  1. -help:输出此命令的参数
    [root@linux121 hadoop-2.9.2]# hdfs dfs -help rm

  2. -mkdir:在 HDFS 上创建目录
    [root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir -p /dir/subdir

  3. -rmdir:删除空目录
    [root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir /test
    [root@linux121 hadoop-2.9.2]# hdfs dfs -rmdir /test

  4. -ls:显示目录信息
    [root@linux121 hadoop-2.9.2]# hdfs dfs -ls /

  5. -cp:在 HDFS 上拷贝文件
    [root@linux121 hadoop-2.9.2]# hdfs dfs -cp /dir/subdir/hadoop.txt /hdfs.txt

  6. -mv:在 HDFS 上移动文件
    [root@linux121 hadoop-2.9.2]# hdfs dfs -mv /dir/subdir/hadoop.txt /dir

  7. -cat:显示文件内容
    [root@linux121 hadoop-2.9.2]# hdfs dfs -cat /dir/subdir/hadoop.txt

  8. -appendToFile:追加⼀个文件到已经存在的文件末尾
    [root@linux121 hadoop-2.9.2]# hdfs dfs -appendToFile hdfs.txt /dir/subdir/hadoop.txt

  9. -tail:显示文件末尾内容
    [root@linux121 hadoop-2.9.2]# hdfs dfs -tail /user/root/test/yarn.txt

  10. -rm:删除文件或文件夹
    [root@linux121 hadoop-2.9.2]# hdfs dfs -rm /user/root/test/yarn.txt

  11. -chgrp 、-chmod、-chown:修改文件权限(与Linux文件系统用法一致)
    [root@linux121 hadoop-2.9.2]# hdfs dfs -chmod 666 /dir/subdir/hadoop.txt
    [root@linux121 hadoop-2.9.2]# hdfs dfs -chown root:root /dir/subdir/hadoop.txt

  12. -du:统计文件夹的大小信息
    [root@linux121 hadoop-2.9.2]# hdfs dfs -du -s -h /user/root/test

  13. -moveFromLocal:从本地剪切粘贴到 HDFS
    [root@linux121 hadoop-2.9.2]# hdfs dfs -moveFromLocal ./local/localfile.txt /dir/subdir/

  14. -moveToLocal:从 HDFS 剪切粘贴到本地
    [root@linux121 hadoop-2.9.2]# hdfs dfs -moveToLocal /dir/subdir/hdfs.txt ./local/

  15. -copyFromLocal:从本地文件系统拷贝文件到 HDFS
    [root@linux121 hadoop-2.9.2]# hdfs dfs -copyFromLocal ./local/localfile2.txt /dir/subdir/

  16. -copyToLocal:从 HDFS 拷贝文件到本地
    [root@linux121 hadoop-2.9.2]# hdfs dfs -copyToLocal /dir/subdir/hdfs2.txt ./local/

  17. -put:等同于 copyFromLocal
    [root@linux121 hadoop-2.9.2]# hdfs dfs -put ./local/localfile3.txt /dir/subdir/

  18. -get:等同于 copyToLocal
    [root@linux121 hadoop-2.9.2]# hdfs dfs -get /dir/subdir/hdfs3.txt ./local/

  19. -setrep:设置 HDFS 文件的副本系数
    [root@linux121 hadoop-2.9.2]# hdfs dfs -setrep 10 /dir/subdir/hadoop.txt
    这里需要注意的是:副本系数 > DataNode 节点数是无意义的,因为多个副本在同一个 DataNode 节点上是无意义的

3.2 Java API

=== 待续 ===

4. 读写原理


4.1 HDFS 读数据流程

假设:客户端 Client-121 想要下载 HDFS 上的文件 hdfs.txt
该文件大小为 300M,有3个 block(300M ÷ 128M = 2),分别为 blk_1、blk_2、blk_3
每个 block 有3个 replication: rep_1、rep_2、rep_3,分别存在 DN-121、DN-122、DN-123 上

数据读取流程

  1. Client-121 通过 DistributedFileSystem 向 NameNode 请求下载 hdfs.txt 的 blk_1

  2. NN 查询元数据中的 block-DN 映射关系,找到所有存放了 blk_1 副本的 DataNode(这里为3个)

  3. NN 根据就近原则,挑出与 Client-121 距离最近的 DN-121,将其地址返回给 Client-121
    注意:就近原则是为了尽可能减小数据传输成本,如果 DN-121 宕机了,NN 会随机从 DN-122 和 DN-123 中挑选一个返回给 Client

  4. Client-121 通过 FSDataInputStream 向 DN-121 发送请求,申请读取 rep_1

  5. DN-121 从磁盘读取数据输入流,传输数据给 Client-121
    DataNode 的核心功能:维护 磁盘与客户端 之间以 Package 为单位的数据传输流
    维护方法:传输校验,每传输完一个 Package 进行一次,从而监控传输状态
    Package 的默认大小为 64KB

  6. Client-121 以 Package 为单位接收数据,先写入本地缓存,再写入本地目标文件

4.2 HDFS 写数据流程
  1. 客户端将向 NN 请求写入整个文件
  2. NN 判断:父目录是否存在 ?(文件是否已经存在 ?不可写:可写) :不可写
  3. 拿到 NN 的可写响应后,客户端将文件切割成 block,再次向 NN 请求写入单个 blk_1,询问 blk_1 写入哪几个 DN
  4. 拿到 DN 地址队列后,Client 通过 FSOutputStream 向队首的 DN-1 发送请求,申请写入 blk_1
  5. DN-1 出队后继续调用队首的 DN-2,DN-2 继续调用 DN-3 ... 直至整个通道打通(队列为空)
  6. DN-1、DN-2、DN-3 逐级向客户端返回响应,表明自己处于就绪状态
  7. Client 确定所有 DN 都就绪之后,以 Pakage 为单位向 DN-1 传输 blk_1
  8. DN-1 接收到 Package 后将其传给下一个 DN,DN-1上维护一个确认队列,每传出一个 Pakage 就将其入队
  9. 当一个 Package 在所有 DN 上都传输完毕后,DN-1 上的确认队列将该 Package 出队
  10. Client 监控 DN-1 的确认队列,当队列为空时说明 blk_1 传输完毕
  11. 重复第 3-10 步,继续上传 blk_2

相关文章

网友评论

      本文标题:HDFS

      本文链接:https://www.haomeiwen.com/subject/tdzzlltx.html