环境:Hadoop全分布式集群hadoop3.0.3

HDFS简介

HDFS(HadoopDistributedFileSystem)即hadoop分布式文件存储系统。

  1. 原理
    将大文件、大批量文件,分布式存储在大量服务器上,以便采取分而治之的方式对海量数据进行分析。
  2. 重要概念
    • 文件切块:HDFS中的文件在物理上是分块存储的,block的大小可以通过配置参数自己设置。
    • 副本:datanode是HDFS集群的从节点,每个block可以在多个datanode上存储多个副本,相当于有多个备份,副本数量也可以通过设置参数修改。
    • 元数据:namenode是HDFS的主节点,负责维护元数据(整个HDFS文件系统的目录结构和文件分块信息)
  3. 应用场景
    为各类分布式运算框架提供数据存储服务,如mapreduce和spark等。

HDFS的shell操作

  1. 查看集群状态
    hdfs dfsadmin -report
  2. 查看目录结构
    hdfs dfs -ls /
    hdfs dfs -ls -R /
  3. 创建目录
    hdfs dfs -mkdir /test
    hdfs dfs -mkdir -p /test
  4. 上传文件
    hdfs dfs -put ./xxx.txt /test
  5. 下载文件
    hdfs dfs -get ./xxx.txt /test
  6. 移动文件(本地到集群)
    hdfs dfs -moveFromLocal a.txt /test
  7. 移动文件(集群到集群)
    hdfs dfs -mv /test/a/big.txt /test/
  8. 复制文件(本地到集群)
    hdfs dfs -copyFromLocal ./big.txt /test/a
  9. 复制文件(集群到本地)
    hdfs dfs -copyToLocal /test/a/big.txt /home/
  10. 复制文件(集群到集群)
    hdfs dfs -cp /test/big.txt /test/b/
  11. 删除文件
    hdfs dfs -rm /test/xxx.txt
  12. 查看文件内容
    hdfs dfs -cat
  13. 查看文件的末尾
    hdfs dfs -tail
  14. 追加本地文件b.txt的内容到集群的a.txt文件末尾
    hdfs dfs -appendToFile ./b.txt /test/a.txt
  15. 修改文件权限
    hdfs dfs -chmod 777 /test/xxx.txt
  16. 修改属主
    hdfs dfs -chown yarn /test/xxx.txt
  17. 修改属组
    hdfs dfs -chgrp yarn /test/xxx.txt
  18. 统计文件系统可用空间信息
    hdfs dfs -df /
  19. 统计文件夹的大小
    hdfs dfs -du /
  20. 统计指定目录下的文件节点数量
    hdfs dfs -count /test/
  21. 设置hdfs中文件的副本数量
    hdfs dfs -setrep 3 /test/big.txt
    注:这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量,如果datanode的数量够,立马复制到指定副本数量,不够的话,复制到datanode的数量上限,如果后面再添加datanode,会自动复制,直到达到指定副本数量。

HDFS的工作机制

  1. 概述
    • HDFS集群分为两大角色:NameNode、DataNode
    • NameNode负责管理整个文件系统的元数据
    • DataNode负责管理用户的文件数据块
    • 文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
    • 每一个文件块可以有多个副本,并存放在不同的datanode上
    • Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
    • HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
  2. HDFS写数据流程
    • client向namenode通信请求上传文件,namenode检查目标文件是否已经存在,父目录是否存在,然后返回是否可以上传。
    • client请求第一个block应该传输到哪些datanode服务器上。
    • namenode返回可用的datanode,首先第一台就近原则挑选一台,第二台优先选另一个机架上的,第三台及以后就在本机架上再随机挑选。
    • client请求datanode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,以此类推,将整个pipeline建立完成,逐级返回客户端。
    • client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C,以此类推,A每传一个packet会放入一个应答队列等待应答。
    • 当一个block传输完成之后,client再次请求namenode上传第二个block到那些datanode服务器上,循环以上步骤,直到文件的所有block上传完成。
  3. HDFS读数据流程
    • client向namenode通信查询元数据,namenode找到所有文件块所在的datanode并返回给client。
    • client挑选一台datanode(就近原则,随机挑选)服务器,请求建立sock流。
    • datanode开始传输数据(从磁盘读取数据放入流,以packet为单位来做校验)
    • 客户端以packet为单位接收,逐个获取文件的block,并在客户端本地进行数据追加合并从而获得整个文件。

namenode的工作机制

  • 负责响应client请求
  • 元数据的管理(增删改查)

元数据管理

  1. 元数据存储机制
    • 内存中有一份完整的元数据(内存meta data)
    • 磁盘有一个“准完整”的元数据镜像(fsimage)文件,在namenode的工作目录
    • 用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件——记录了所有对元数据有效的增删改查等操作过程)
      注:当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存metadata中
  2. 元数据的checkpoint
    • SecondaryNameNode通知NameNode准备执行checkpoint(定期通知)
    • NameNode立刻切换日志文件edits
    • SecondaryNameNode从NameNode下载日志文件edits和fsimage文件
    • SecondaryNameNode在自己的内存中合并日志文件edits和fsimage文件
    • SecondaryNameNode将合并后得到的fsimage.checkpoint文件序列化上传给NameNode
    • NameNode获取到fsimage.checkpoint文件并重命名为fsimage覆盖原文件。
      注:NameNode和SecondaryNamenode的工作目录存储结构完全相同,所以,当NameNode故障退出需要重新恢复时,可以从SecondaryNamenode的工作目录中将fsimage拷贝到NameNode的工作目录,只能恢复大部分NameNode的元数据。因此,为了避免以上情况的发生,可以将NameNode的工作目录配在多块磁盘上,可以修改hdfs-sit.xml文件的dfs.name.dir属性,设置值为多个路径,路径之间用”,”隔开。
  3. 元数据目录说明
    在第一次部署好Hadoop集群的时候,我们需要在NameNode(NN)节点上格式化磁盘:hdfs namenode -format
    格式化完成之后,将会生成namenode的目录结构,如图所示。namenode的目录地址是在hdfs-site.xml文件中配置dfs.name.dir属性,默认值为file://${hadoop.tmp.dir}/dfs/name
    namenode元数据目录
  • VERSION文件
    version文件是Java属性文件大致内容如下:

    1
    2
    3
    4
    5
    6
    7
    #Fri Aug 24 15:11:29 CST 2018
    namespaceID=253249611
    clusterID=CID-28bcbdbd-0718-4dc2-94a4-f4d2c505bef2
    cTime=1534863934165
    storageType=NAME_NODE
    blockpoolID=BP-395927104-192.168.113.150-1534863934165
    layoutVersion=-64

    -namespaceID是文件系统的唯一标识符,在文件系统首次格式化之后生成的。
    -storageType说明这个文件存储的是什么进程的数据结构信息(如果是DataNode,storageType=DATA_NODE)
    -cTime表示NameNode存储时间的创建时间,以后对NameNode升级之后,cTime将会记录更新时间戳
    -layoutVersion表示HDFS永久性数据结构的版本信息, 只要数据结构变更,版本号也要递减,此时的HDFS也需要升级,否则磁盘仍旧是使用旧版本的数据结构,这会导致新版本的NameNode无法使用
    -clusterID是系统生成或手动指定的集群ID,这个clusterID不能与环境中其他集群有冲突。如果没有提供clusterID,则会自动生成一个唯一的ClusterID
    -blockpoolID:是针对每一个Namespace所对应的blockpool的ID,这个ID包括了其对应的NameNode节点的ip地址。

  • fsimage文件(元数据镜像文件)
  • seen_txid文件
    记录了edits滚动的序号,每次重启namenode时,namenode就知道要将哪些edits进行加载edits
  • edits文件
    记录了所有对元数据有效的增删改查等操作过程

DataNode的工作机制

  1. DataNode工作职责
    • 存储管理用户的文件块数据
    • 定期向namenode汇报自身所持有的block信息(通过心跳信息上报,当集群中发生某些block副本失效时,集群要恢复block初始副本数量)
  2. Datanode掉线判断时限参数
    • datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。
    • HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:timeout = 2 heartbeat.recheck.interval + 10 dfs.heartbeat.interval。
  3. 如何在datanode中找到文件的切块
    参考路径:/home/hadoop/apps/dfs/data/current/BP-395927104-192.168.113.150-1534863934165/current/finalized/subdir0/subdir0/

最后更新: 2018年11月21日 15:55

原始链接: https://www.lousenjay.top/2018/08/24/HDFS入门详解(一)/