Hadoop~HDFS
一、Hadoop概述
1. Hadoop起源
Hadoop起源于Apache Nutch项目,始于2002年,是Apache Lucene的子项目之一。2006年2月将Hadoop单独分离出来,成为一套单独的系统框架,被称为Hadoop的1.x版本。
2012年更新Hadoop2.x版本,其中推出了yarn架构作为Hadoop框架的资源管理器是重要提升。yarn的作用是将Hadoop的计算和资源管理调度解耦。
Hadoop3.x版本在结构上并没有较之前大版本有所改变。
2. Hadoop的组成结构
- HDFS:分布式文件存储系统
- yarn:资源调度器
- MapReduce:数据运算框架
二、HDFS
1. HDFS概述
HDFS(分布式文件存储系统)作为Hadoop框架下的存储系统,包括NameNode(NN)、DataNode(DN)、SecondaryNameNode(2NN),这三个组件共同构成了HDFS的存储系统。
1. NameNode
NN
作为HDFS集群的重要组成,负责存储、管理HDFS中存储的文件元数据信息。元数据信息包括文件名、目录结构、文件属性(副本数、文件权限等)、数据块列表、数据块所在DN的信息
。
NN除了保存元数据信息,还负责处理客户端对数据上传、下载的请求
,管理、分配DN作为数据存储节点。
2. DataNode
DN
作为数据的存储节点,负责存储真实数据块和数据的校验和。
3. SecondaryNameNode
2NN
的存在是为了辅助NN工作,减轻NN的压力。定时合并、备份集群的元数据信息。
2.HDFS的特点
1. 优点
高容错性
:HDFS在保存文件时或保存多份副本,默认保存3份,可以通过配置文件修改。当一份副本损坏时,会从没损坏的数据副本复制数据。- 适合处理
PB
级以上的数据。 - 可以构建在
廉价的、性能较差
的服务器运行。
2. 缺点
- HDFS很难实现低时延的数据访问,无法做到毫秒级数据操作。
- HDFS对小文件十分敏感,不擅长存储、处理小文件。
- HDFS不支持数据并发写入,不支持文件随机修改。
三、DataNode的节点选择机制
NN在给Client
(客户端)分配DN节点时,尽量
按照“就近原则”进行分配。
- NN首先判断Client所在的服务器有没有可用的DN节点,如果有则选择该节点为
DN1
;如果没有可用节点,则选择同一机架上的可用的节点作为DN1
。 - 如果同一机架上也没有可用的节点作为DN1,则选择其他机架上的可用节点作为
DN1
。 - DN1选择完毕后,在其他机架选择一个可用的节点作为
DN2
。 - DN2选择完毕后,在DN2所在的机架随机选择一个节点作为
DN3
。 - 如果不只3个节点,其余节点随机选择。
为什么这样分配?
DN不都放在同一服务器是为了防止该服务器出现故障导致数据丢失时,没有可用副本恢复数据。
DN2和DN3放在同一机架是为了提高HDFS的效率。
四、HDFS的读写数据流程
1. 写数据流程 ----- 数据上传
向HDFS写入数据时,默认将数据按照128MB的大小切分为数据块。完整的数据将以若干数据块的形式存储在DN上。具体步骤如下:
-
Client首先实例化一个连接对象(Distributed FileSystem),通过该对象实现连接。
-
Client向
NN
发送上传数据请求,NN会检查当前用户是否由上传权限,并校验目标数据的合法性
。之后NN向Client反馈请求结果。 -
Client之后向NN请求上传数据,并向
NN
请求DN
作为数据存储节点。NN会根据Client的实际情况返回DN的信息。 -
获取DN的信息后,Client会实例化文件传输流对象(FSFataOuputStream)操作数据流上传数据。该对象向最近的DN通信,建立数据传输通道。
-
之后
DN1
向DN2
通信建立通道,DN2
向DN3
通信……之后DN之间相互做出应答。这样的设计是为了减轻客户端的IO压力。
-
通道建立完成后,Client按照==
Packet
(数据包)为单位==向DN1
传输数据。每个Packet大小为64KB,包含127份(chunk 512Bytes + sumchunk 4Bytes),chunk存储的是真实数据,sumchunk存储的是数据校验和。
-
当Packet按照顺序发送到DN1后,DN1会将这个Packet发送给DN2……
DN写入数据时是并行执行的
。数据写入时按照chunk的顺序先存放在Dataqueue,整个Packet全部写入队列后,再按照chunk的顺序写进Ackqueue,之后再将数据写入DN的IO保存。如果从Dataqueue写入Ackqueue时发生错误,Ackqueue中的数据会==“回滚”==到Dataqueue中,等到通道正常之后再开始写入数据。
-
数据全部写入完成后,Client会跟DN断开连接,并向NN汇报。
数据块默认为128MB是根据当前磁盘的IO速度设定的,如果磁盘IO速度快,可以自定义数据块大小。
2. 读数据流程 ----- 数据下载
HDFS的读取数据流程(数据下载)相较写数据要简单得多,具体步骤如下:
-
Client实例化一个连接对象(Distributed FileSystem),获取连接后向NN发送读取文件请求。NN会将目标文件的元数据信息返回给Client。
-
获取元数据后,Client实例化一个输入流对象(FSdatainputstream)对象,通过该对象向距离Client最近的DN建立传输通道,按照数据块的顺序将数据读入本地缓存。
-
当所有数据块缓存完毕并且没有损坏之后,将数据写入本地IO。
如果所存的数据块不全存放在一个DN上,则客户端会按照数据块的顺序先后从对应的DN下载数据块到缓存。
五、NN和2NN
注意
:2NN并不是NN的热备,当NN发生故障时,2NN不能替代NN对外提供服务,只能恢复部分NN的元数据信息。
1. 元数据管理
元数据是HDFS中十分重要的数据信息,存储HDFS中存储数据的详细信息。因此,元数据不支持随机修改,只能向文档末尾追加信息。
元数据分为两部分:一份存在磁盘中,另一份存储在内存中。最新的元数据信息= 内存中的元数据+磁盘中最大编号的元数据。
对元数据进行操作时,实际上操作的是内存中的元数据信息。内存中的操作信息会被追加到edits文件中,当符合要求时会将元数据信息进行合并。
2. NN中的元数据管理
NN中存有两种
元数据信息:fsimage文件和edits文件。
- fsimage文件:是
xml
类型的文件,存放真正的元数据。 - edits文件:内存中的元数据的操作记录会被追加到edits文件中。
元数据合并流程
NN只有在刚启动集群时,才会自己合并元数据,其他时候由2NN
负责合并元数据信息。
- 当NN中的元数据信息满足一定条件时,2NN会通知NN将要进行元数据合并。由于NN仍需要对外提供服务,所以NN会停止向正在使用的edits文件中追加元数据操作记录,另外生成一份文件存放最新的操作记录。
- 2NN从NN处获取fsimage文件和edits文件后,会将两份元数据信息进行合并,将最新的元数据发送到NN本地保存,同时2NN也会保留一份元数据作为NN的备份,
- NN收到最新的元数据信息后,会将上一次的元数据保留,作为历史记录。
3. 2NN的工作机制
- 2NN每隔60s检查一次NN中的edits_inprogress是否达到
100万
条记录(chickpoint)。如果达到要求,则向NN发送合并元数据的请求。如果edits_inprogress一直没有满足100万
条的要求,2NN会检查本地时间,自集群启动后的每1小时合并一次元数据。 - NN收到请求后,会立即停止向正在使用的edits文件追加元数据操作记录,转向新生成的文件中追加记录。
- 2NN会从NN处拷贝正在使用的edits_progress文件和最大编号的fsimage文件。拷贝到2NN本地后,将两份文件进行合并。
- 合并完成后,2NN会将最新的元数据文件(
fsimage.chkpoint
)发到NN本地保存,并且保留一份文件作为NN的备份。 - NN获得最新的元数据文件后,会将上一次的元数据保留作为历史备份,最新的元数据文件改名后保存。
为什么2NN保留上一次的元数据备份,还需要每次从NN处获取呢?
因为一旦集群故障需要重启,NN重启后会亲自合并元数据,当达到下一次合并元数据条件时,NN中的fsimage文件已经发生改变,而2NN中的备份并没有重启之后的记录,所以需要从NN处获取fsimage文件和edits文件。
六、DN的工作机制
1. 心跳信号和掉线限制
1. 心跳信号
DN为了保证数据的完整性,除了真实数据块之外,还存储了数据长度、数据校验和、时间戳
。
心跳信号
就是ping一下NN的主机地址,DN的工作流程如下:
- 集群首次启动后,DN会向NN注册自己,并立即向NN汇报当前DN上的所有数据信息。
- 之后DN每隔6小时向NN汇报一次。
- 除了汇报工作之外,正常工作中DN每隔3s向NN发送一次心跳信号,NN会将心跳信号返回,返回的信号中包括NN对DN下达的命令。
2. 掉线限制
如果心跳信号超过3s,NN不会立即判定该节点不可用,当超过10分钟+30s后还没有心跳信号,NN才会判定该节点为不可用状态。
2. 数据完整性
为了保证数据的完整性,DN会核验数据的校验和。
- 当DN读取到Block信息时,会计算该Block的
校验和
(CheckSum)。 - 如果核验校验和时发现与刚写入数据时的校验和不一致,则判定此数据块损坏。
- 损坏数据的DN会找到最近的保存文件副本的DN,并完成Block更新。
8.新节点的服役、退役
1. 服役
当需要扩展新的存储节点时,只需要将新的服务器设置好目标集群的配置,并更该主机名、IP信息。之后启动DataNode和NodeManager就完成了新节点的扩展。
#单点启动命令
hdfs --daemon start datanode 启动datanode
yarn --daemon start nodemanager 启动nodemanager
2. 退役
当一台服务器需要移出集群,但是服务器的数据需要保留备份时,需要退役服务器。
使用黑名单、白名单
的机制管理集群服务器。
在NN的节点服务器的**/opt/module/hadoop-3.1.3/etc/hadoop**目录下创建黑名单和白名单文件。
白名单的服务器就是正常运行的服务器。
黑名单中的服务器会在完成数据迁移后退出集群。
创建好黑白名单后,需要向hdfs-site.xml中追加配置信息。并将配置文件和黑白名单文件分发到所有集群服务器。
<!-- 白名单 -->
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
服务器完成退役后,不需要重启集群,只需要刷新集群就可以。
hdfs dfsadmin -refreshNodes 刷新hdfs节点信息
yarn rmadmin -refreshNodes 刷新yarn节点信息