Hadoop分布式文件系统——HDFS

旧巷老猫 提交于 2019-12-30 10:28:49

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

    随着数据量越来越大,在一个操作系统中存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,急切需要一种系统管理多态机器上的文件,这就是分布式文件管理系统。

HDFS的定义

  • HDFS:是一个文件系统,用于存储文件,通过目录树来定义文件;其次,它是分布的,有很多服务器联合起来实现其功能,集群中服务器有各自的角色
  • HDFS的使用场景:一次写入,多次读。

HDFS优缺点

优点:

  1. 高容错性(分而治之)数据自动保存多个副本,某个副本丢失以后可以自动恢复数据
  2. 处理大数据:
    1. 数据规模:可以处理GB、TB甚至PB级别的数据
    2. 文件规模:能够处理百万规模以上的文件数量
  3. 可构建在廉价的机器上

缺点:

  1. 不适合低延迟数据访问,如毫秒级的数据存储是做不到的。
  2. 无法高效存储大量小文件
    1. 存储文件会占用NameNode来存储元数据,可能占用资源会更多
    2. 小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标
  3. 不支持并发写入、文件随机修改
    1. 一个文件只能有一个线程操作
    2. 仅支持数据追加操作,不支持文件随机修改

HDFS的组成

  • NameNode(nn):就是Master,是HDFS的主要管理者
    • 管理HDFS的命名空间
    • 配置副本策略
    • 管理数据块(Block)映射信息
    • 处理客户端请求
  • DataNode(dn):就是Slave,NameNode下达命令,DataNode执行实际操作
    • 实际存储数据文件
    • 执行数据块读写操作
  • Client:客户端
    • 文件切分。文件上传HDFS时,Client会将文件切分成一个个Block,然后再上传
    • 与NameNode交互,获取文件位置信息
    • 与DataNode交互,读取或写入数据
  • Secondary NameNode:HA的一个解决方案,并非NameNode的热备份。当NameNode挂掉时,并不能替换NameNode并提供服务
    • 辅助NameNode,分担其工作量,如为防止编辑日志文件过大,并且能保证其信息与namenode信息保持一致。定期合并Fsimage和Edits,并推送给NameNode。
    • 紧急情况下可以恢复NameNode

DataNode工作机制

  1. 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本 身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
  2. DataNode 启动后向 NameNode 注册,通过后,周期性(1 小时)的向 NameNode 报所有的块信息。
  3. 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用。
  4. 集群运行中可以安全加入和退出一些机器。

NameNode和Secondary NameNode

  • Fsimage:HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
  • Edits:(只进行追加操作),存放HDFS文件系统的所有更新操作的路径。

每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保障内存中的元数据是最新的、同步的。

NameNode阶段:

  1. 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  2. 客户端对元数据进行增删改请求。
  3. NameNode记录操作日志,更新滚动日志。
  4. NameNode在内存中对数据进行增删改操作。

SecondaryNameNode阶段:

  1. SecondaryNameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
  2. SecondaryNameNode请求执行CheckPoint。
  3. NameNode滚动正在写的Edits,将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode。
  4. SecondaryNameNode加载编辑日志和镜像文件到内存并合并。
  5. 生成新的镜像文件fsimage.chkpoint。拷贝fsimage.chkpoint到NameNode。
  6. NameNode将fsimage.chkpoint重新命名成fsimage。

Block块的大小

HDFS的文件在物理上是分块存储的,在Hadoop2.X中默认是128M,老版本中是64M。可以通过 dfs.blocksize 来设定

注意:

  1. HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置
  2. 块设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序处理这块数据时,会非常慢

HDFS上传/下载数据流程

下载

  • 客户端向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
  • 挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。
  • datanode开始传输数据给客户端(从磁盘里面读取数据放入流,以packet为单位来做校验)。
  • 客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

 

集群安全模式

NameNode启动时,首先将Fsimage载入内存,并执行Edits中的各项操作。一旦在内存在成功建立文件系统元数据的镜像,则创建一个新的Fsimage文件和一个空的Edits。此时,NameNode开始监视DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。

系统中的数据块位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。

基本语法:

集群处于安全模式,不会执行写操作。集群启动完成后自动退出安全模式。

bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) 
bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) 
bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) 
bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!