一文搞懂HDFS分布式文件系统

1.1 HDFS的介绍及特点

  HDFS是一个分布式文件系统,用来实现大数据存储。是主从架构的,主节点为namenode,从节点为datanode。HDFS本质是将多台机器的文件系统进行逻辑上的合并。最终数据会写入每台机器的某一个目录中。在写的时候HDFS通过分块机制来实现分布式存储,默认按照128M来进行分块,并且每一个块文件在存储的时候会复制多份,默认保存3份。第一份写入任意一台机器,第二份写入与第一份同一个机架的机器,第三份写入另外一个机架的机器。HDFS适合的应用场景为一次写入,多次读取。文件会落地于磁盘,性能相对不高。

1.2 节点功能详解

1.2.1 主节点的功能

  1. 负责接收所有客户端的请求。
  2. 负责管理所有节点的心跳机制,通过心跳机制来检测从节点是否宕机。如果长时间没有接收到某个从节点的心跳访问,会自动隔离这个节点,被隔离的节点不会再分配到读写任务,并且该节点的数据会分配到其他节点上。
  3. 负责管理所有数据的安全[汇报机制]。所有从节点会定期向namenode汇报当前自己所存储的的所有块的情况。namenode会根据汇报的情况和自己所存储的元数据来进行对比,保证数据不会丢失。
  4. 主节点负责维护内存中的元数据,在内存中记录每个文件对应的块,以及每个块所在机器的位置。它会把内存存储在metadata中。

1.2.2 从节点的功能

  1. 在服务启动的时候向namenode进行注册。
  2. 负责与客户端进行交互,接收客户端的读写块到文件系统的请求。
  3. 负责与文件系统交互,实现将块基于文件的读写。
  4. 定期向主节点进行数据的汇报以及自己的心跳汇报。

1.3 普通分布式存储架构图

在这里插入图片描述

1.4 HA架构下存储架构图

在这里插入图片描述

1.5 HDFS的读写流程

1.5.1 写的流程

1.5.1.1 步骤
  1. 用户操作客户端提交写请求给namenode,namenode接收到写的请求然后检查写入源和写入位置是否存在,如果都存在,则返回客户端可以写入。
  2. 客户端对文件拆分,并请求namenode提交第一个块。主要是请求namenode可以将数据写入到哪些datanode中。
  3. namenode根据所有datanode的存活、活跃性以及每台datanode存储的空间,来选择该块存储的位置,返回对应的datanode的地址【默认三个副本的存储地址】
    • live nodes:正常的节点。
    • Decommissioning nodes:被隔离的节点。
    • dead nodes:没有心跳的节点。
  4. 客户端拿到该块的三个地址,通过机架感知【自动计算客户端到达每个地址的网络路由】,选举最近的地址,然后将块提交给最近的datanode。
  5. 客户端会与该datanode建立通信管道【pipeline】,将数据从本地读取到缓存中,然后划分每个package发送给第一个datanode。
  6. 该datanode收到客户端发送的package数据包后会与第二个地址构建通信管道,客户端的package会通过第一个地址的管道发送给第二个地址,第二个地址与第三个地址构建管道,将package发送给第三个地址。
  7. 第三个地址的ack返回给第二个地址,第二个地址将ack返回给第一个地址,第一个地址将整体的三份的ack返回给客户端。
  8. 以此往复发送每个package,直到整个块的数据全部发完。
  9. 重复以上,请求下一个块。
  10. 所有数据块写完,客户端提交给namenode结果,namenode记录元数据。
1.5.1.1 架构图

在这里插入图片描述

1.5.2 读流程

1.5.2.1 步骤
  1. 客户端提交读的请求给namenode。
  2. namenode查询元数据,返回该文件的所有块的地址给客户端。
  3. 客户端根据机架感知来获取每个块离自己最近的位置。
  4. 连接所有块的datanode获取每个块的数据。
  5. 客户端将所有数据进行合并然后返回给用户。
1.5.2.1 架构图

在这里插入图片描述

1.6 HDFS的元数据安全

  1. HDFS的namenode节点中存放着元数据的信息,元数据记录了每一个文件块的位置以及副本的位置。
  2. 在第一次启动进行格式化的时候程序会自动生成一个fsimage文件,生成在namenode那台机器上,namenode启动后会把这个文件中的数据加载到内存。
  3. 当有客户端发起写的请求时,在写入完成后客户端会把写入的位置等信息发送给namenode,namenode会写入到内存中。
  4. 在普通分布式集群中namenode会把更改记录写入到edits本地文件中。会有secondarynamenode进程将老的fsimage文件与edits文件进行合并生成新的fsimage文件。
  5. 在HA架构的分布式集群中Active状态的namenode会请求journalnode将自己的元数据写入到journalnode的edits文件中。StandBy状态的namenode会从journalnode中读取edits文件,并将edits文件更新到老的fsimage文件中。
  6. edits文件合并到fsimage文件有一个合并的时机,由两个参数控制:
    • dfs.namenode.checkpoint.period:距离上一次合并的时间间隔,默认为1小时。
    • dfs.namenode.checkpoint.txns:edits文件中的数据条数,默认为100万条。
  7. Linux操作系统的磁盘也可以构建数据安全,使用Raid ,磁盘冗余阵列
    • Raid0:插入两块硬盘,每个1TB,做了raid0,在操作系统中只能看到1块2TB,负载均衡。
    • Raid1:插入两块硬盘,每个1TB,做了raid1,在操作系统中只能看到1块1TB,高可用,空间减少1半。

1.7 HDFS的客户端管理操作

1.7.1 hdfs namenode -format

  用于第一次启动HDFS之前进行格式化生成fsimage文件并初始化集群id信息。

1.7.2 hdfs dfsadmin report

  汇报,可以打印集群当前的状态信息

1.7.3 hdfs dfsadmin -safemode <enter | leave | get | wait>

  安全模式状态操作,当HDFS启动时,会自动进入安全模式,等待所有的datanode进行汇报,与元数据进行比较,来保证数据是否丢失恢复。当发现数据丢失,当前所有存在的块/元数据中记录的块<=99.9%,会停留在安全模式,实现数据恢复,直到大于99.9%,会自动退出。

1.7.4 如何不停机增加机器

  1. 当需要添加一个新的节点时,需要手动刷新,重新读取slaves文件。
  2. 准备一台机器,环境与其他机器一致,删除数据目录中的数据。
  3. 修改所有机器的slaves文件,添加这台机器的地址。
  4. 在hdfs-site.xml文件加上dfs.hosts配置信息,值为任意一个文件的地址,这个文件中写入新加入这台机器的主机名。
  5. 执行刷新节点hdfs dfsadmin -refreshNodes,向namenode注册。
  6. 启动该机器的datanode。

1.7.5 如何不停机隔离机器

  1. 在要停机的机器的hdfs-site.xml文件中加上dfs.hosts.exclude配置信息,值为任意一个文件的地址,这个文件中写入要停机的这台机器的主机名。
  2. 执行刷新节点hdfs dfsadmin -refreshNodes。
  3. 被指定的机器的状态会变为decommissioning。

1.7.6 HA架构下的管理操作

# 把某个namenode节点转换为Active状态,--forceactive:强制转换。
hdfs haadmin -transitionToActive --[forceactive] <serviceId>
# 如果配置了自动切换的属性,不允许使用手动切换的命令。
# 把namenodev1节点转换为Active状态。
hdfs haadmin -transitionToActive --forceactive namenodev1

# 把Active的namenode状态转变为StandBy状态。
hdfs haadmin -transitionToStandby --[forceactive] <serviceId>
# 如果配置了自动切换的属性,不允许使用手动切换的命令
# 把namenodev2节点转换为StandBy状态。
hdfs haadmin -transitionToStandby namenodev2

# 自动模式下切换状态
hdfs haadmin --failover  --[forcefence]  --[forceactive]
#nn2:当前是active
#nn1:要将nn1转成active
hdfs haadmin -failover namenodev2 namenodev1

# 查看namenode的状态
hdfs haadmin -getServiceState  <serviceId>
hdfs haadmin -getServiceState namenodev1

1.7.7 hdfs fsck

  检查文件系统中是否由数据丢失或者损坏,可以进行修复。

hdfs fsck /

1.7.8 hdfs balancer

  1. IT行业中,有两种机制
    • 容灾机制:高可用HA,故障转移。
    • 负载均衡:让每个节点的任务相对均衡,避免热点。
  2. 用于实现datanode之间的负载均衡:移动存储,让存储更均衡。
  3. 负载均衡的容差:10%。
  4. sbin/start-balancer.sh:当发现出现数据分布不均衡的时候执行,在闲时执行,会占用大量的磁盘以及网络的I/O,会导致整体的hdfs读写性能降低。

1.8 HDFS的HA架构和Federation

1.8.1 HA架构

hadoop2.2+ :支持HA,但只支持两个。
hadoop3.x:支持多个。
HA架构中datanode会给两个namenode都注册。

1.8.2 Federation

  1. Hadoop2.x:增加的一个特性,HDFS特有的联盟机制。
  2. 本质:实现namenode负载均衡,两个namenode,一起工作。
  3. 应用场景:想将所有数据放在一个大的集群,但是需要按照业务拆分元数据。每个namenode专门负责一部分业务。
  4. 联盟机制不能与HA机制共存,如果非要共存,构建多个nameservice。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值