1、什么是HDFS(存放大文件)
1)概念
Hadoop分布式文件系统(Hadoop Distributed File System)
2003年10月Google发表了GFS(Google File System)论文
HDFS是GFS的开源实现
HDFS是Apache Hadoop的核心子项目
在开源大数据技术体系中,地位无可替代
2)设计目标
运行在大量廉价商用机器上:硬件错误是常态,提供容错机制
简单一致性模型:一次写入多次读取,支持追加,不允许修改,保证数据一致性
流式数据访问:批量读而非随机读,关注吞吐量而非时间
:存储大规模数据集:典型文件大小GB~TB,关注横向线性扩展(喜欢大文件)
2、优点
高容错、高可用、高扩展
数据冗余多副本,副本丢失后自动恢复
NameNode HA、安全模式
10K节点规模
海量数据存储
典型文件大小GB~TB,百万以上文件数量, PB以上数据规模
构建成本低、安全可靠
构建在廉价的商用服务器上
提供了容错和恢复机制
适合大规模离线批处理
流式数据访问
数据位置暴露给计算框架
3、缺点
不适合低延迟数据访问
:不适合大量小文件存储
元数据占用NameNode大量内存空间
磁盘寻道时间超过读取时间
不支持并发写入
一个文件同时只能有一个写入者
不支持文件随机修改
仅支持追加写入
4、系统架构:
设计思想
基本概念
1、Active NameNode(AN)(主节点)
活动Master管理节点(集群中唯一)
管理命名空间
管理元数据:文件的位置、所有者、权限、数据块等
管理Block副本策略:默认3个副本(副本数量可以改)
处理客户端读写请求,为DataNode分配任务
2、、Standby NameNode(SN)
热备Master管理节点(Active NameNode的热备节点)
Hadoop 3.0允许配置多个Standby NameNode
Active NameNode宕机后,快速升级为新的Active
周期性同步edits编辑日志(存放元信息),定期合并fsimage与edits到本地磁盘
3、NameNode元数据文件
edits(编辑日志文件):保存了自最新检查点(Checkpoint)之后的所有文件更新操作
fsimage(元数据检查点镜像文件):保存了文件系统中所有的目录和文件信息,如:某个目录下有哪些子目录和文件,以及文件名、文件副本数、文件由哪些Block组成等
Active NameNode内存中有一份最新的元数据(= fsimage + edits)
Standby NameNode在检查点定期将内存中的元数据保存到fsimage文件中
4、DataNode
Slave工作节点(可大规模扩展)
存储Block和数据校验和
执行客户端发送的读写操作
通过心跳机制定期(默认3秒)向NameNode汇报运行状态和Block列表信息
集群启动时,DataNode向NameNode提供Block列表信息
5、Block数据块
HDFS最小存储单元
文件写入HDFS会被切分成若干个Block
Block大小固定,默认为128MB,可自定义
若一个Block的大小小于设定值,不会占用整个块空间
默认情况下每个Block有3个副本
6、Client
将文件切分为Block
与NameNode交互,获取文件元数据
与DataNode交互,读取或写入数据
管理HDFS
5、存储机制:
文件存储
1、Block存储()
Block是HDFS的最小存储单元
如何设置Block大小
目标:最小化寻址开销,降到1%以下
默认大小:128M(HDFS 1.x中,默认64M)
块太小:寻址时间占比过高
块太大:Map任务数太少,作业执行速度变慢
Block和元数据分开存储:Block存储于DataNode,元数据存储于NameNode
Block多副本
以DataNode节点为备份对象
默认副本数:3
机架感知:将副本存储到不同的机架上,实现数据的高容错
副本均匀分布:提高访问带宽和读取性能,实现负载均衡
2、Block文件
Block文件是DataNode本地磁盘中名为“blk_blockId”的Linux文件
DataNode在启动时自动创建存储目录,无需格式化
DataNode的current目录下的文件名都以“blk_”为前缀
Block元数据文件(*.meta)由一个包含版本、类型信息的头文件和一系列校验值组成
3、Block副本放置策略
副本1:放在Client所在节点
对于远程Client,系统会随机选择节点
系统会首先选择空闲的DataNode节点
副本2:放在不同的机架节点上
副本3:放在与第二个副本同一机架的不同节点上
副本N:随机选择
节点选择:同等条件下优先选择空闲节点
元数据存储
元数据(Metadata)
信息存放在NameNode内存当中
包含:HDFS中文件及目录的基本属性信息(如拥有者、权限信息创建时间等)、文件有哪些block构成、以及block的位置存放信息。
元数据信息持久化
fsimage(元数据镜像检查点文件)
edits(编辑日志文件)
注意:block的位置信息并不会做持久化,仅仅只是在DataNode启动汇报给NameNode,存放在NameNode内存空间内。
6、读写操作
写操作
客户端发送创建文件指令给分布式文件系统
文件系统告知namenode
检查权限,查看文件是否存在
EditLog增加记录
返回输出流对象
客户端往输出流中写入数据,分成一个个数据包
根据namenode分配,输出流往datanode写数据
多个datanode构成一个管道pipeline,输出流写第一个,后面的转发
每个datanode写完一个块后,返回确认信息
写完数据,关闭输出流
发送完成信号给namenode
读操作
读流程
客户端发送打开文件指令给分布式文件系统
文件系统访问namenode,获得这个文件的数据块位置列表,返回输入流对象
客户端从输入流中读取数据
输入流从各个datanode读取数据
关闭输入流
7、安全模式
1、什么是安全模式
安全模式是HDFS的一种特殊状态,在这种状态下,HDFS只接收读数据请求,而不接收写入、删除、修改等变更请求
安全模式是HDFS确保Block数据安全的一种保护机制
Active NameNode启动时,HDFS会进入安全模式,DataNode主动向NameNode汇报可用Block列表等信息,在系统达到安全标准前,HDFS一直处于“只读”状态
2、何时正常离开安全模式
Block上报率:DataNode上报的可用Block个数 / NameNode元数据记录的Block个数
当Block上报率 >= 阈值时,HDFS才能离开安全模式,默认阈值为0.999
不建议手动强制退出安全模式
3、触发安全模式的原因
NameNode重启
NameNode磁盘空间不足
Block上报率低于阈值
DataNode无法正常启动
日志中出现严重异常
用户操作不当,如:强制关机(特别注意!)
4、故障排查
找到DataNode不能正常启动的原因,重启DataNode
清理NameNode磁盘
谨慎操作,有问题找星环,以免丢失数据
8、高可用
1、优势
高容错性
扩展性
海量数据的高效读、写
2、劣势
NameNode内存受限问题
Federation机制
NameNode单点故障问题
对NameNode做高可用(High Availability)
3、Journal集群
负责存储edits编辑日志
部署奇数(2N+1)台服务器
4、利用QJM实现元数据edits文件高可用
QJM机制(Quorum Journal Manager)
只要保证Quorum(法定人数)数量的操作成功,就认为这是一次最终成功的操作
QJM共享存储系统
写edits的时候,只要超过半数(>=N+1)的JournalNode返回成功,就代表本次写入成功
最多可容忍N个JournalNode宕机
基于Paxos算法实现
操作命令
1、系统配置
核心配置文件
core-site.xml:Hadoop全局配置
hdfs-site.xml:HDFS局部配置
示例:NameNode URI配置(core-site.xml)
2、环境变量文件
Hadoop-env.sh:设置了HDFS运行所需的环境变量