HDFS 技术

126 阅读10分钟

这是我参与更文挑战的第4天 ,活动详情查看更文挑战

HDFS定义

Hadoop Distributed File System,是一个使用 Java 实现的、分布式的、可横向扩展的文件系 统,是 HADOOP 的核心组件

HDFS特点

  • 处理超大文件
  • 流式地访问数据
  • 运行于廉价的商用机器集群上; HDFS 不适合以下场合:
  • 低延迟数据访问
  • 大量小文件的存储
  • 不支持多用户写入及任意修改文件

HDFS基本结构

image.png

HDFS相关概念 --块

  1. HDFS使用了块的概念,默认大小128M/256M字节
  • 可针对每个文件配置,由客户端指定
  • 每个块有一个自己的全局ID
  1. HDFS将一个文件分为一个或数个块来存储
  • 每个块是一个独立的存储单位
  • 以块为单位在集群服务器上分配存储
  1. 与传统文件系统不同的是,如果实际数据没有达到块大小,则并不实际占用整个块磁盘空间
  • 如果一个文件是200M,则它会被分为2个块: 128+72

HDFS相关概念 --元数据

  1. 元数据 (MetaData)包括 文件系统目录树信息
  • 文件名,目录名
  • 文件和目录的从属关系
  • 文件和目录的大小,创建及最后访问时间
  • 权限

文件和块的对应关系

  • 文件由哪些块组成

块的存放位置

  • 机器名,块ID

image.png

  1. 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中记录了所有针对文件的创建、删除、重命名等操作;

image.png

NameNode 工作原理

  1. 在名称节点启动的时候,它会将FsImage文件中的内容加载到内存中,之后再执行EditLog文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。

  2. 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件

  3. 在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大。当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。

HDFS相关概念 --SecondaryNameNode

第二名称节点是HDFS 架构中的一个组成部 分,协助NameNode完 成Fsimage和edits文件 合并工作,使得内存 中的Fsimage保持“最 新” 。 SecondaryNameNode 一般是单独运行在一 台机器上。

image.png

HDFS相关概念 --DataNode

  • 块的实际数据存放在DataNode上
  • 每个块会在本地文件系统产生两个文件,一个是实际的数据文件,另一个是块的附加信息文件,其中包括块数据的长度、校验和,以及时间戳
  • DataNode通过心跳包(Heartbeat)与NameNode通讯
  • 客户端读取/写入数据的时候直接与DataNode通信
  • 集群运行中可以安全加入和退出一些机器

HDFS体系结构

image.png

DataNode

  • NameNode是一个中心服务器,单一节点,负责管理文件系统的命名空间(namespace)以及客户端对文件的访问;
  • 文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,数据流不经过NameNode,只会询问它跟那个DataNode联系;
  • 副本存放在哪些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延

冗余存储策略

  • 每个块在集群上会存储多个副本(replication) –默认复制份数为3; 可以动态修改,可针对每个文件配置,由客户端指定
  • 某个块的所有备份都是同一个ID –系统无需记录 “哪些块其实是同一份数据”
  • 根据机架配置自动分配备份位置(Rack Awareness)
  1. 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
  2. 第二个副本:放置在于第一个副本不同的机架的节点上
  3. 第三个副本:与第一个副本相同机架的其他节点
  4. 更多副本:随机节点
  • 优点:加快数据传输速度;容易检查错误;保证数据的可靠性

错误恢复策略

  1. 名称节点出错 名称节点保存了所有的元数据信息,最核心的两大数据结构 是FsImage和Editlog。当名称节点出错时,就可以根据备份 SecondaryNameNode中的FsImage和Editlog数据进行恢复。

  2. 数据节点出错

  • 数据节点定期向名称节点发送“心跳”信息报告状态;
  • 当数据节点发生故障,或者网络断网时,名称节点就无法收到来自数据节点的心跳信息,这些数据节点就被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求;
  • 一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子;名称节点会定期检查,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制生成新的副本;
  • HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置。
  1. 数据出错
  • 网络传输和磁盘错误等因素,都会造成数据错误;客户端在读取到数据后,会采用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 写操作

  1. 客户端写一个文件并不是直接写到HDFS上;
  2. HDFS客户端接收用户数据,并把内容缓存在本地;
  3. 当本地缓存收集足够一个HDFS块大小的时候,客户端同NameNode通讯注册一个新的块;
  4. 注册块成功后,NameNode给客户端返回一个DataNode的列表; – 列表中是该块需要存放的位置,包括冗余备份
  5. 客户端向列表中的第一个DataNode写入块; 当完成时,第一个DataNode 向列表中的下个DataNode发送写操作,并把数据已收到的确认信息给客户端,同时发送确认信息给NameNode 之后的DataNode重复之上的步骤。当列表中所有DataNode都接收到数据并且由最后一个DataNode校验数据正确性完成后,返回确认信息给客户端
  6. 收到所有DN的确认信息后,客户端删除本地缓存;
  7. 客户端继续发送下一个块,重复以上步骤;
  8. 当所有数据发送完成后,写操作完成。

image.png

HDFS 读操作

  1. 客户端与NameNode通讯获取文件的块位置信息,其中包括了块的所有冗余备份的位置信息:DataNode的列表;
  2. 客户端获取文件位置信息后直接同有文件块的DataNode通讯,读取文件;
  3. 如果第一个DataNode无法连接,客户端将自动联系下一个DataNode;
  4. 如果块数据的校验值出错,则客户端需要向NameNode报告,并自动联系下一个DataNode。

image.png

HDFS追加写操作

  1. 客户端与NameNode通讯,获得文件的写保护锁及文件最后一个块的位置(DataNode列表)
  2. 客户端挑选一个DataNode作为主写入节点,并对其余节点上的该数据块加锁
  3. 开始写入数据。与普通写入流程类似,依次更新各个DataNode上的数据。更新时间戳和校验和
  4. 最后一个块写满,并且所有备份块都完成写入后,向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]]

启动HDFS服务

image.png

关闭HDFS服务

image.png