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