HDFS 全称 Hadoop Distribute File System,是 Hadoop 的一个分布式文件系统
一、HDFS 的系统结构 1.1 数据块 —— block文件在 HDFS 上分块存储。
一个文件分多少块,是按照你设置的存储单位大小算的。
设置存储单位时,不能太大,也不能太小。
太大:处理数据时,需要教高的配置。
太小:数据块的映射信息是存在 NameNode 的内存中(一个快占用 150 字节),内存也是受限的,如果块太小,会占用较多 namenode 的存储空间。
80M 文件,1M一个块,就会分成80块数据。占用 NameNode 内存 80 * 150 字节
80M 文件,64M一个块,分2块一块:64M,一块:16M(如果小于块大小,就按照实际存储)。占用 NameNode 内存 2 * 150 字节
总结如下:
数据块是 HDFS 中基本的数据存储单位,一般大小为64M/128M/256M,一个大文件根据数据块的大小,将文件分为若干个块。
NameNode 存储的文件对应的 block 映射信息;而 datanode 存储块信息对应的数据。
块越小读取的速度就越快,但是整体占用 NameNode 的空间就越大,因为不管块大小一个块所占用的 NameNode 内存存储空间为一般为150字节。
一个大文件会被拆分成一个个的块,然后存储于不同的机器。对于大规模的集群会存储在不同的机架上,如果一个文件少于 Block 大小,那么实际占用的空间为其文件的大小。
数据块也是基本的读写单位,类似于磁盘的扇区,每次都是读写一个块。读写多个块就合成了一个文件。
为了容错,文件的所有数据块都会有副本,也就是说复制的是数据块而不是单独的一个文件被复制了,默认复制3份,可以在 hdft-site.xml 里进行配置。
副本的数据的存储规则:
若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
NameNode:
是整个集群的中心,负责安排管理集群中数据的存储并记录存储文件的元数据和负责客户端对文件的访问。
HA 模式下,一般有一个 active 状态的 NameNode,若干个 standby 状态的 NameNode,其中,active 状态的 NameNode 负责所有的客户端操作,standby 状态的 NameNode 处于从属地位,维护着数据状态,随时准备切换。
存储文件的元数据(metadata),主要包括整个文件系统的目录树、文件名与 blockid 的映射关系、blockid 在哪个 datanode 上等。
在运行时把所有的元数据都保存到 NameNode 机器的内存中,所以整个 HDFS 可存储的文件数受限于 NameNode 的内存大小。
一个 block 在 NameNode 中对应一条记录。
NameNode 的元数据的镜像文件会保存到本地磁盘,但不保存 block 具体的位置信息,而是由 DataNode 注册和运行时进行上报维护。
NameNode 完蛋了,那整个 HDFS 也就完蛋了,所以要采用冗余的方案来保证 NameNode 的高可用性。
DataNode:
保存 block 块对应的具体数据。
负责数据的读写和复制操作。
DataNode 启动时会向 NameNode 报告当前存储的数据块信息,也会持续的报告数据块的修改信息。
DataNode 之间会进行互相通信,来完成复制数据块的动作,以保证数据的冗余性。
DataNode 启动时要在 NameNode 上注册,当 DataNode 改变时,也要通知 NameNode 。DataNode 会定期向 NameNode 发送心跳,告知 NameNode 该节点的 DataNode 是可用的。
JournalNode:
负责两个状态的 NameNode 进行数据同步,保持数据一致
ZKFC:
作用是 HA 自动切换。会将 NameNode 的 active 状态信息保存到 zookeeper。
二、数据的读取和写入过程 2.1 HDFS 的数据写入过程客户端发起数据写入请求,告诉 NameNode 要写入的文件信息;
NameNode 根据你的情况(client端所在位置、文件大小)分配给你分配写入数据的位置也就是写到那几个机器上;
客户端根据 NameNode 反馈的信息向 DataNode 写入数据;
DataNode 之前感觉副本数复制数据;
复制完成之后,各数据节点向 NameNode 上报 block 信息;
DataNode 通知客户端已完成;
2.2 HDFS 的数据读取过程