HDFS基础

基础储存结构

  • NameNode(Master);维护文件系统内所有文件和目录的相关信息,用于DataNode的管理。
  • DataNode(Slave):储存数据块,默认以128M为文件块大小。

HDFS的特点

优点

  • 多副本备份与自动恢复机制,保证容错性。
  • 默认文件块128M,只能追加读写等特性保证了数据的高吞吐速率。
    缺点
  • 高延迟,不适合毫秒级查询。
  • 文件块大小默认128M,大量的小文件读写容易在NameNode上产生储存瓶颈。

HDFS架构

请注意NameNode不会向DataNode主动发送请求,通信严格遵守C/S架构。

Client

客户端,用于管理HDFS。

  • 使用HDFS Shell管理HDFS,例如上传文件,创建目录等等。
  • 与NameNode交互,获取文件快储存的位置。
  • 与DataNode交互,读取或者写入数据。

NameNode

名称节点,管理文件系统的相关信息。

  • 响应Client请求。
  • 接收来自DataNode的心跳包,处理DataNode的数据管理与自动恢复。
  • 管理文件块(Block)与名称空间(Namespace)。

    Block管理
    NameNode记录文件块所在的DataNode信息,动态更新。元数据保存如下映射:

    1
    2
    “文件名 ——> 数据块”
    “数据块 ——> DataNode列表”

    Namespace管理
    HDFS内部维护FsImage与Editlog两个文件。其中FsImage储存文件系统的Namespace,Editlog记录元数据的变化保存为日志,只有在重启的时候Editlog才会被整合进入FsImage。然而现实情况下NameNode很少重启,因此需要借助SecondaryNameNode来保持文件系统元数据的最新。

SecondaryNameNode

检查点结点,用于辅助NameNode。

  • 将Editlog合并到FsImage,缩短集群启动时间保证HDFS完整性。
  • 特定情况下辅助恢复NameNode
    SecondaryNameNode

DataNode

数据结点,储存数据。

  • 储存集群的数据块内容(ID与内容的映射关系)
  • 处理数据块的读写操作,包括来自Client,DataNode的请求。

HDFS Shell

使用hadoop fs -help可查看HDFS的帮助信息。cp与mv命令必须在HDFS中使用,不可跨文件系统。

  • hadoop fs -ls -h -R / #打印指定路径下的目录结构,-h参数格式化打印,-R参数递归打印子目录。
  • hadoop fs -mkdir -p /hadoop/data #创建目录,-p参数为递归创建。
  • hadoop fs -put -f -p README.md /hadoop/data/README.md #将本地文件传入HDFS,-f参数为覆盖目标文件,-p参数保留原始修改时间与权限。
  • hadoop fs -get -p /hadoop/data/README.md . #将HDFS信息传入本地,-p参数保留原始修改时间与权限。
  • hadoop fs -cp -f -p /hadoop/data/README.md /hadoop/README.md #在HDFS文件系统中复制文件。
  • hadoop fs -mv /hadoop/data/README.md /hadoop/README.md #在HDFS文件系统中移动文件。
  • hadoop fs -rm -r -f /hadoop/README.md #删除文件/目录,-r参数为递归删除目录,-f参数为忽略文件不存在。
  • hadoop fs -rmdir /hadoop/data #删除目录
  • hadoop fs -cat /hadoop/data/README.md #查看文本内容。
  • hadoop fs -tail /hadoop/data/README.md #查看文本最后1KB的内容。
  • hadoop fs -appendToFile 1.txt /hadoop/data/README.md #向README.md后追加1.txt。
  • hadoop fs -getmerge -nl /hadoop/data/*.txt /root/merge.txt #合并下载多个文件,-nl参数在文件末尾增加换行符。
  • hadoop fs -chmod -R 766 /hadoop2.7.7 #改变文件/目录权限,-R参数递归更改。
  • hadoop fs -count -h /tmp #统计目录下的文件情况。
  • hadoop fs -df -h / #统计文件系统的容量。