【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
随着数据量越来越大,在一个操作系统中存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,急切需要一种系统管理多态机器上的文件,这就是分布式文件管理系统。
HDFS的定义
- HDFS:是一个文件系统,用于存储文件,通过目录树来定义文件;其次,它是分布的,有很多服务器联合起来实现其功能,集群中服务器有各自的角色
- HDFS的使用场景:一次写入,多次读。
HDFS优缺点
优点:
- 高容错性(分而治之):数据自动保存多个副本,某个副本丢失以后可以自动恢复数据
- 处理大数据:
- 数据规模:可以处理GB、TB甚至PB级别的数据
- 文件规模:能够处理百万规模以上的文件数量
- 可构建在廉价的机器上
缺点:
- 不适合低延迟数据访问,如毫秒级的数据存储是做不到的。
- 无法高效存储大量小文件
- 存储文件会占用NameNode来存储元数据,可能占用资源会更多
- 小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标
- 不支持并发写入、文件随机修改
- 一个文件只能有一个线程操作
- 仅支持数据追加操作,不支持文件随机修改
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工作机制

- 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本 身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
- DataNode 启动后向 NameNode 注册,通过后,周期性(1 小时)的向 NameNode 上报所有的块信息。
- 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用。
- 集群运行中可以安全加入和退出一些机器。
NameNode和Secondary NameNode
- Fsimage:HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
- Edits:(只进行追加操作),存放HDFS文件系统的所有更新操作的路径。
每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保障内存中的元数据是最新的、同步的。

NameNode阶段:
- 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
- 客户端对元数据进行增删改请求。
- NameNode记录操作日志,更新滚动日志。
- NameNode在内存中对数据进行增删改操作。
SecondaryNameNode阶段:
- SecondaryNameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
- SecondaryNameNode请求执行CheckPoint。
- NameNode滚动正在写的Edits,将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode。
- SecondaryNameNode加载编辑日志和镜像文件到内存并合并。
- 生成新的镜像文件fsimage.chkpoint。拷贝fsimage.chkpoint到NameNode。
- NameNode将fsimage.chkpoint重新命名成fsimage。
Block块的大小
HDFS的文件在物理上是分块存储的,在Hadoop2.X中默认是128M,老版本中是64M。可以通过 dfs.blocksize 来设定
注意:
- HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置
- 块设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序处理这块数据时,会非常慢
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 (功能描述:等待安全模式状态)
来源:oschina
链接:https://my.oschina.net/u/4427158/blog/3150583