HDFS简介
HDFS is a filesystem designed for storing very large files with streaming data access patterns, running on clusters of commondity hardware.
背景
简述一下背景,随着智能设备普及、网络基础升级,全民在生产信息、消费信息、交换信息,信息浩如烟海,却蕴藏着无限的机会。想要挖出金子,先得有座金矿,这里我们要自己建金矿,把数据存下来。但眼前压着几座大山:数据量大,最直接的困难,加机器(最直接的解决办法);于是集群大、故障频繁;而数据处理往往只读部分数据,大文件的读取太慢;同时数据来自部分机器,大部分机器空闲,资源被充分浪费。为了解决以上种种,先知为我们带来了HDFS。
目标
- 大容量、大文件(PB级别)
- 高容错(无惧宕机)
- 高带宽利用(读取飞快)
核心思路
- 大容量的实现主要依赖于集群,通过构建分布式存储集群,来将存储问题分而治之。
- 高容错的实现主要依赖于备份,多备份,跨机器备份、跨机架(rack)备份,同时分块备份。
- 高带宽的实现主要依赖于拆分,将单个大文件拆分为若干文件,散步于多机器,读取速度、处理速度正比与集群规模。
- 数据块(block/chunk),将大文件拆分,提升读取性能、备份容错效率。
- 设计场景为:顺序读,批处理场景,非随机读;读写模型:写一次、读多次、增量写。
- 控制流与数据流分离,元信息与数据信息分离。
主要架构
Block
- HDFS上的文件被拆分为固定大小的块,大文件查询次数减少
- meta信息少,NameNode压力小
- 存储大文件成为可能,文件可以超过单个硬盘大小
- 备份、恢复更为容易
Namenode
- 管理namespace树(文件系统树及权限信息)
- block与DataNode对应关系
- namespace树及元信息全部存于内存
- namespace树及元信息,持久化至内存由checkpoint(存量base)和journal(增量修改)组成
DataNode
- 存储应用数据,即Block
- Block由数据本身和block元信息组成
- 集群启动阶段,DataNode向NameNode注册
- 集群运行中,DataNode向NameNode发送heartbeats,以确认DataNode可用性
- 若NameNode对DataNode心跳检测失败,则创建新DataNode,并做数据迁移
Data Flow
File read
- HDFS client 请求 NameNode,获取对应文件的 block locations
- NameNode返回一组DataNode,每个DataNode均包含一份数据副本
- HDFS client采取就近原则,选取一个DataNode读取数据
- Client读取同时进行数据校验,若读取交互报错,则选取其他DataNode读取
- HDFS client直接由DataNode读取数据,NameNode不做数据转发
File write
- HDFS client 请求 NameNode,在namespace内申请新文件名
- NameNode若确认可创建,创建文件记录;否则返回失败
- Client将待写文件拆包,写入到一个内部队列
- NameNode在DataNode开辟新block,供内容多备份写入
- DataNode将内容写入新block,完成后答复ack
- 写入完成后,NameNode已包含全部新block位置信息
Replica
大型集群的DataNode组织呈树状结构,而非平铺。同一机架(rack)DataNode共享交换机;不同机架(rack)见通过核心交换机链接.
Replica Placement原则:
- 任何DataNode均不包含重复Block
- 任何rack都不会包含同一Block两个以上备份(在rack充足的前提下)
- 考虑NameNode的负载(Disk使用率、带宽使用率),集群均衡、利用率高
Replica Management:
- NameNode保证Block的备份数符合标准,解决under-replicated、over-replicated
- NameNode检查Block在DataNode和Rack上的分布情况 3.
HA
NameNode:
- CheckpointNode: 周期性合并当前checkpoint和journal来得到最新image
- BackUpNode: 订阅journal流来维护NameNode的内存镜像,实现只读NameNode
- NFS filer: 网络文件系统,共享journal实现ha
- QJM:为提供ha journal而设计
DataNode:
- 心跳检测机制,DataNode不可用时,NameNode新建DataNode,数据迁移
- DataNode周期性数据校验数据,数据不可以时,做数据迁移
- 数据校验算法支持增量快速重算
相关项目
- Hive http://hive.apache.org/
- Hadoop http://hadoop.apache.org/
- Spark http://spark.apache.org/
- Pig http://pig.apache.org/
- Tez http://tez.apache.org/
- Hbase http://hbase.apache.org/
参考文献
- The Hadoop Distributed File System
- The Google File System
- Hadoop The definitive Guide 4th Edition
- apache hadoop HDFS Architecture
- The Hadoop Distributed File System Slide