HDFS设计前提与目标
硬件容错
流式数据访问
超大规模数据集
简单一致性模型
- 一次写入多次读取
移动计算比移动数据便宜
HDFS架构
主从架构(master/slave)
两个重要进程:namenode和datanode
HDFS数据存储
冗余备份(备份因子可配置,默认为3)
每个文件按字节切为128m的block(hadoop1为64m)
冗余数据保存
- 加快数据传输速度
- 容易检查数据错误
- 保证数据可靠性
Namenode (就像宿舍管理员)
在hdfs中,namenode负责管理分布式文件系统的命名空间
执行文件系统命名空间操作,如打开,关闭和重命名文件和目录
控制客户端对文件的访问
它还决定blocks到datanode的映射,记录了每隔文件中各个块所在的数据节点的位置信息
Namenode保存元数据(metadata)
- 元数据是描述数据的数据,主要是描述数据属性的信息
- 包括:文件信息,文件块的信息和位置,文件的访问权限,集群中文件的数量,集群中datanode的数量
Namenode还保存了两个核心的数据结构,即fsimage(镜像文件)和editlog(操作文件)
Fsimage用于维护文件系统树以及文件树种所有文件和文件夹的元数据
操作日志文件editlog中记录了所有针对文件的创建,删除,重命名等操作
Datanode
文件系统中真正存储数据的地方
- 一个block在datanode以文件形式存储在磁盘上,包括两个文件:一个数据本身,一个是元数据(包括数据块的长度,块数据的校验和时间戳)
- 客户端或者namenode可向datanode请求写入或读出block(数据块),存储路径由dfs.datanode.data.dir指定
按照客户端请求,执行在文件系统上的读写操作
根据namenode的指令执行block的创建,删除和备份
向namenode定期发送自己所存储的块的列表
Namenode启动过程和安全模式
Namenode启动过程
- 启动hdfs,首先进入安全模式
- 此时,NN运行处于safemode,即hdfs对于client来说时只读的
- 执行check-point检查点
- 首先将fsimage载入到内存
- 然后逐一执行edits文件中各项操作
- 一旦在内存中成功建立hdfs最新的元数据映像,就会将最新的元数据flush到本地磁盘,生成一个新的fsimage文件
- 获得block块信息,建立block和DN的映射
- Check-point完成后,NN开始监听RPC和HTTP请求
- Namenode从所有datanode接手心跳信号和块状态报告,块状态报告包括了某个namenode上所有的数据块列表
- 退出安全模式
- NN只有获取到整个文件系统中有99.9%(可以配置的)的块满足最小副本(加上一个额外的30s等待时间),才会自动退出安全模式
- NN对外提供写服务
Namenode本身只存储镜像文件和操作日志,不存储datanode和block的映射关系,它只会通过datanode心跳传递过来的这些映射关系,将这些关系建立起来,保存在内存当中。
Secondary namenode
Namenode运行期间editlog不断变大的问题
SecondaryNamenode(SNN)是HDFS架构中一个组成部分,它用来保存namenode中对hdfs元数据信息的备份,并减少namenode重启的时间
Secondary namenode节点处理镜像文件和事务日志
单点故障问题
HA(高可用)
- Hadoop集群中,namenode节点存储hdfs上所有文件和目录的元数据信息
- 如果namenode挂了,也意味着整个hadoop集群无法使用
高可靠:block块在hadoop存储的冗余备份
Hdsf写文件剖析
Block块副本选址策略
- 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满,cpu不太忙的节点
- 第二个副本:放置在与第一个副本不同的机架节点上
- 第三个副本:与第二个副本同一机架的另一个节点上
- 更多副本:随机节点
写过程的故障检测与恢复
- HDFS的恢复过程有助于实现容错;它不仅涉及到块,还涉及到管道;在HDFS中,有三种recovery
- Lease recovery(租约)
- Block recovery(块)
- Pipeline recovery(流水线)
租约恢复:租约是hdfs用来保证对文件的独占写访问的一种方法,它保证在一段时间内只对一个客户有效,若客户仍需处理该文件,则必须定期更新租约
块恢复:确保租用文件的最后一个块的所有副本有相同的长度;block恢复只有在租约恢复时被触发,且租约恢复只会触发一个文件的最后一个block进行block恢复。
Hdfs读剖析
文件完整性
- 网络传输和磁盘错误等因素,会造成数据错误
- 在文件被创建时,客户端对每个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件中(crc32校验)
- 当客户端读取文件时,会利用该信息文件对每个读取的数据块进行校验(出错:请求另一个DN,报告给NN)
备份每个分块文件;分块冗余,本地校验
文件删除剖析
HDFS特点
廉价的商用机器
高容错性保障机制
- 冗余副本策略
- 机架策略
- 心跳机制
- 安全模式
- 校验
- 回收站
- 元数据保护
HDFS适用场景
高容错性
- 数据自动保存多个副本
- 副本丢失后,自动恢复
适合批处理 - 移动计算而非数据
- 数据位置暴露给计算框架
适合大数据处理 - GB,TB,甚至PB级数据
- 百万规模以上的文件数量
- 10k+节点规模
流式文件访问 - 一次性写入,多次读取
- 保证数据一致性
可构建在廉价机器上 - 通过多副本提高可靠性
- 提供了容错和恢复机制
HDFS不适用场景
低延迟数据访问
- 比如毫秒级
- 低延迟与高吞吐量
小文件存取 - 占用namenode大量内存
- 寻道时间超过读取时间
并发写入,文件随机修改 - 一个文件只能由一个写者
- 一次写入,多次读取
- 仅支持append
HDFS操作
访问hdfs有多种方式
- Shell命令行
- JavaAPI编程
Hdfs是模拟linux文件系统,因此很多hdfs命令和linux命令很像
Hdfs常用命令
Ex:
Hdfs dfs –help
Hdfs dfs –ls
Hdfs dfs –mkdir /aaa
Hdfs dfs –put word.txt /aaa/ 将word.txt文件上传到/aaa/文件夹后
Hdfs dfs –get /aaa/word.txt abc.txt 将文件下载道abc.txt
Hdfs dfs –cat /aaa/word.txt 浏览word.txt文件内容
Jps: 查看hdfs集群是否启动