一、HDFS概述
当一台独立的物理计算机不足以存储数据集时,就需要对该数据集进行物理切分和分区操作,将其存储在若干台互为关联的计算机上。管理多台计算机的文件存储系统就是分布式文件系统。Hadoop有自己的分布式文件系统,名为:HDFS,它就是为了存储超大文件而设计的。
(1)分布式文件系统:Hadoop分布式文件系统定义了一个Java抽象类org.Apache.Hadoop.fs.FileSystem,里面包含了各种文件系统接口,并且该抽象类有很多具体的实现类,HDFS只是其中一个实现,还有一些文件系统例如:hfs、FTP等。
(2)数据块:HDFS在进行数据存储的时候,会将文件切分为数据块的方式进行存储。
- 概念:
- 数据块是磁盘进行数据读写的最小单位。
- HDFS的数据块,我们称之为Block,它的大小要比常见的数据块、文件系统块大得多,在Hadoop1.x中,Block块的大小默认为64MB,在Hadoop2.x中,Block块的默认大小为128MB。
- 如果HDFS上的一个文件小于Block的大小,她不会占据整个块的存储空间,而是占据它实际的文件大小空间。
- 块存储的优点:
- 可以存储超大文件,当文件大于任一磁盘容量的时候,文件被分隔成不同的块存储在集群中任何节点上。
- 最小单位为块,方便存储系统管理
- 方便对数据进行备份,每个块在集群中存储多个副本,HDFS默认是3个副本。
二、HDFS核心元素及其原理
HDFS通过两类节点来管理整个系统的数据,它们之间以(管理者--工作者)的形式运行。一类是:NameNode(管理者),一类是:DataNode(工作者)。
(1)HDFS读取数据的原理
:-:
- 1.客户端读取数据时,先和NameNode建立联系,NameNode查看需要读取MetaData信息,MetaData数据存储在内存中。
- 2.NameNode获得MetaData信息将其返回给客户端,然后客户端才能在DataNode中读取数据。
(2)MetaData:从单词来理解就是元数据,存储元数据,有别于文件数据本身,它是文件的一些属性信息、存储位置信息、副本数量及存储位置和节点的对应关系等。
- HDFS存储数据包括两部分:一部分是元数据,一部分是数据块本身。
- 元数据:(FileName,replicas,block-ids,id2host),始终保存在内存中
- FileName:文件名
- Replicas:副本数量
- Block-ids:表示存储为几个Block,id分别为多少
- id2host:Block存储节点
(3)NameNode:是整个文件系统的管理节点,它维护着整个文件和目录的元数据信息、文件系统的文件目录树以及每个文件对应的数据块列表,还能够接收用户的操作请求。
- NameNode包含以下文件
- fsimage:内存中的元数据序列化到磁盘上的文件名称,是元数据的镜像文件,它存储某一时间段NameNode内存元数据信息。
- fstime:保存最近一次checkpoint的时间。
- edits:操作日志文件。
- fsimage、fstime、edits都是保存在Linux的文件系统中的,存储位置如下:hadoop包的/tmp/dfs/name/current
(3)DataNode:为真实的文件数据提供存储服务,在HDFS中最基本的存储单位是Block。默认Block大小为128MB,那么一个256MB的文件就有256/128=2个Block,而且每个Block默认都会保存3份。
:-:
- 为了保证在节点发生故障时,数据不会丢失,DataNode在存储Block之后,会监控每个Block的数量是否和设置的副本数保持一致,如果有节点宕机了,Block的数量小于设置的副本数,DataNode和NameNode之间会根据心跳机制来判断DataNode节点是否宕机。如果宕机了,NameNode将会在另外一个节点上复制一个副本,以保证副本数量和设置的副数量一致。
(4)SecondaryNameNode:是HA(High Availably,高可用)的一个解决方案,它负责辅助NameNode完成相应的工作。
- 工作时会下载数据信息fsimage和edits,然后把两者合并,生成新的fsimage并在本地进行保存,然后将其推送到NameNode,替换旧的fsimage。
:-:
- 工作流程:
- 1.secondary通知NameNode切换edits文件
- 2.secondary从NameNode获得fsimage和edits(通过http)
- 3.secondary将fsimage载入内存,然后合并edits,合并完成后清空edits
- 4.secondary将新的fsimage发回给NameNode
- 4.NameNode用新的fsimage替换旧的fsimage
- checkpoint合并时机
- 1.fs.checkpoint.period指定两次checkpoint的最大时间间隔,默认为3600s,也就是一小时合并一次
- 2.fs.checkpoint.size规定edits文件的最大值,一旦超过这个值就强制checkpoint,不管是否达到最大间隔