HDFS定义
Hadoop Distributed File System,是一个使用 Java 实现的、分布式的、可横向扩展的文件系
统,是 HADOOP 的核心组件
HDFS特点
- 处理超大文件
- 流式地访问数据
- 运行于廉价的商用机器集群上;
HDFS 不适合以下场合: - 低延迟数据访问
- 大量小文件的存储
- 不支持多用户写入及任意修改文件
HDFS基本结构
HDFS相关概念 --块
- HDFS使用了块的概念,默认大小128M/256M字节
- 可针对每个文件配置,由客户端指定
- 每个块有一个自己的全局ID
- HDFS将一个文件分为一个或数个块来存储
- 每个块是一个独立的存储单位
- 以块为单位在集群服务器上分配存储
- 与传统文件系统不同的是,如果实际数据没有达到块大小,则并不实际占用整个块磁盘空间
- 如果一个文件是200M,则它会被分为2个块: 128+72
HDFS相关概念 --元数据
- 元数据 (MetaData)包括
文件系统目录树信息
- 文件名,目录名
- 文件和目录的从属关系
- 文件和目录的大小,创建及最后访问时间
- 权限
文件和块的对应关系
- 文件由哪些块组成
块的存放位置
- 机器名,块ID
- HDFS对元数据和实际数据采取分别存储的方法
- 元数据存储在NameNode服务器上;
- 实际数据储存在集群的DataNode中
HDFS相关概念 --NameNode
NameNode是用来管理文件系统命名空间的组件。一个HDFS集群只有一台(active)NameNode
- NameNode上存放了HDFS的元数据,记录了每个文件中各个块所在的数据节点的位置信息。一个HDFS集群只有一份元数据,可能有单点故障问题
- 元数据工作时在NameNode内存中,以便快速查询。1G内存大致可存放1,000,000块对应的元数据信息。按缺省每块64M计算,大致对应64T实际数据
- 集群关闭时,元数据持久化到磁盘中,启动集群时,需要将元数据装载到内存中
NameNode数据结构
- NameNode负责管理分布式文件系统的Namespace命名空间,保存了两个核心数据结构:FsImage和EditLog
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据;
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作;
NameNode 工作原理
-
在名称节点启动的时候,它会将FsImage文件中的内容加载到内存中,之后再执行EditLog文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。
-
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件
-
在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大。当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。
HDFS相关概念 --SecondaryNameNode
第二名称节点是HDFS
架构中的一个组成部
分,协助NameNode完
成Fsimage和edits文件
合并工作,使得内存
中的Fsimage保持“最
新”
。
SecondaryNameNode 一般是单独运行在一
台机器上。
HDFS相关概念 --DataNode
- 块的实际数据存放在DataNode上
- 每个块会在本地文件系统产生两个文件,一个是实际的数据文件,另一个是块的附加信息文件,其中包括块数据的长度、校验和,以及时间戳
- DataNode通过心跳包(Heartbeat)与NameNode通讯
- 客户端读取/写入数据的时候直接与DataNode通信
- 集群运行中可以安全加入和退出一些机器
HDFS体系结构
DataNode
- NameNode是一个中心服务器,单一节点,负责管理文件系统的命名空间(namespace)以及客户端对文件的访问;
- 文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,数据流不经过NameNode,只会询问它跟那个DataNode联系;
- 副本存放在哪些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延
冗余存储策略
- 每个块在集群上会存储多个副本(replication) –默认复制份数为3; 可以动态修改,可针对每个文件配置,由客户端指定
- 某个块的所有备份都是同一个ID –系统无需记录 “哪些块其实是同一份数据”
- 根据机架配置自动分配备份位置(Rack Awareness)
- 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
- 第二个副本:放置在于第一个副本不同的机架的节点上
- 第三个副本:与第一个副本相同机架的其他节点
- 更多副本:随机节点
- 优点:加快数据传输速度;容易检查错误;保证数据的可靠性
错误恢复策略
-
名称节点出错
名称节点保存了所有的元数据信息,最核心的两大数据结构
是FsImage和Editlog。当名称节点出错时,就可以根据备份
SecondaryNameNode中的FsImage和Editlog数据进行恢复。 -
数据节点出错
- 数据节点定期向名称节点发送“心跳”信息报告状态;
- 当数据节点发生故障,或者网络断网时,名称节点就无法收到来自数据节点的心跳信息,这些数据节点就被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求;
- 一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子;名称节点会定期检查,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制生成新的副本;
- HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置。
- 数据出错
-
网络传输和磁盘错误等因素,都会造成数据错误;客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据;
-
在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
-
当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块
文件权限策略
- 与Linux文件权限类似 ( chmod, chown )r: read; w:write; x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容
- 如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner是zhangsan
- HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁
安全模式
指文件系统所处的一种只读的安全模式。HDFS启动时会在safemode状态
$ hadoop dfsadmin -safemode get #安全模式当前状态信息
$ hadoop dfsadmin -safemode enter #进入安全模式
$ hadoop dfsadmin -safemode leave #解除安全模式
$ hadoop dfsadmin -safemode wait #挂起,直到安全模式结束
HDFS 写操作
- 客户端写一个文件并不是直接写到HDFS上;
- HDFS客户端接收用户数据,并把内容缓存在本地;
- 当本地缓存收集足够一个HDFS块大小的时候,客户端同NameNode通讯注册一个新的块;
- 注册块成功后,NameNode给客户端返回一个DataNode的列表; – 列表中是该块需要存放的位置,包括冗余备份
- 客户端向列表中的第一个DataNode写入块; 当完成时,第一个DataNode 向列表中的下个DataNode发送写操作,并把数据已收到的确认信息给客户端,同时发送确认信息给NameNode 之后的DataNode重复之上的步骤。当列表中所有DataNode都接收到数据并且由最后一个DataNode校验数据正确性完成后,返回确认信息给客户端
- 收到所有DN的确认信息后,客户端删除本地缓存;
- 客户端继续发送下一个块,重复以上步骤;
- 当所有数据发送完成后,写操作完成。
HDFS 读操作
- 客户端与NameNode通讯获取文件的块位置信息,其中包括了块的所有冗余备份的位置信息:DataNode的列表;
- 客户端获取文件位置信息后直接同有文件块的DataNode通讯,读取文件;
- 如果第一个DataNode无法连接,客户端将自动联系下一个DataNode;
- 如果块数据的校验值出错,则客户端需要向NameNode报告,并自动联系下一个DataNode。
HDFS追加写操作
- 客户端与NameNode通讯,获得文件的写保护锁及文件最后一个块的位置(DataNode列表)
- 客户端挑选一个DataNode作为主写入节点,并对其余节点上的该数据块加锁
- 开始写入数据。与普通写入流程类似,依次更新各个DataNode上的数据。更新时间戳和校验和
- 最后一个块写满,并且所有备份块都完成写入后,向NameNode申请下一个数据块。
HDFS命令行
cat
- 用途:显示一个或多个文件内容到控制台
- 使用方法:hadoop fs -cat URI [URI …]
- 例子:
− hadoop fs -cat hdfs://host1:port1/file1
hdfs://host2:port2/file2
− hadoop fs -cat file:///file3
/user/hadoop/file4
put/copyFromLocal
- 用途:将本地一个或多个文件导入HDFS。以上两个命令唯一的不同时copyFromLocal的源只能是本地文件,而put可以读取stdin的数据
- 使用方法:hadoop fs -put/copyFromLocal UR
- 例子:
− hadoop fs -put localfile.txt /user/hadoop/hadoopfile.txt
− hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
− hadoop fs -put localfile hdfs://host:port/hadoop
get/copyToLocal
- 用途:将HDFS中的一个或多个文件导出到本地文件系统
- 使用方法: hadoop fs -get/copyToLocal [-ignorecrc] [-crc] URI < localsrc>
- 例子:
− hadoop fs -get /user/hadoop/hadoopfile localfile
− hadoop fs -get hdfs://host:port/user/hadoop/file localfile
ls
- 用途:列出文件夹目录信息,lsr 递归显示文件
- 使用方法: hadoop fs -ls/lsr -h UR
ls
- 用途:检查dfs的文件的健康状况; 只能运行在master上
- 使用方法: hadoop fsck [GENERIC_OPTIONS]
[- move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]