简介:
今天来聊聊 HDFS,它是 Hadoop 分布式文件系统(HDFS)是一种旨在在商品硬件上运行的分布式文件系统。
具有高度的容错能力,旨在部署在低成本硬件上。HDFS 提供对应用程序数据的高吞吐量访问,并且适用于具有大数据集的应用程序。
从 Hadoop 的架构中看出,HDFS 是最底层存储集群中所有存储节点文件的文件系统,犹如一座大厦的地基。
01-HDFS 架构
HDFS 总体上采用了 master/slave 架构:
- NameNode (以下称为 NN)
- DataNode (以下称为DN)
- Secondary NameNode (以下称为 SN)
02-成员介绍
1、Client(客户端,亦或是用户)
- 与 NN 和 DN交互访问 HDFS 中 的文件。
- 提供了一个类似 POSIX 的文件系统接口供用户调用。
2、NN( master,类似管理者)
- 管理文件系统的名字空间(namespace)
- 处理客户端对文件的访问
- 确定数据块(Block)到具体 Datanode 节点的映射
- 配置副本策略(复制/存放/选择)
3、DN(Slave,NN 的小弟们)
- 存储实际的数据块。
- 负责处理文件系统客户端的读/写请求。
4、SN(NN 的助手,只能分担 NN 的工作量,不能顶替):
- 定期合并 fsimage 和 fsedits,并推送给NN。
- 在紧急情况下,可辅助恢复 NN。
03-写文件的工作流程
1、NN 里面维护着一份元数据,若客户端要存储一个文件,它可以检测该文件是否已经存储了,以及存在哪。
2 、对客户端来说,存储一次就够了,避免网络不稳定导致副本出错。所以 DN 会帮客户端存储的数据进行副本复制。默认三份保存。
3、HDFS被设计成支持大文件,适用那些需要处理大规模的数据集的应用。
这些应用都是只写入数据一次,但却读取一次或多次,并且读取速度应能满足流式读取的需要。
HDFS支持文件的“一次写入多次读取”语义。一个大文件会被拆分成一个个的块(block),然后存储于不同的DataNode上。如果一个文件小于一个 block 的大小,那么实际占用的空间为其文件的大小。
另外块(block)也有限制大小,HDFS 默认Block大小是128 MB,如果存储文件太小会占用太多的 NN 空间,造成浪费。所以 HDSF 不适合存储大量的小文件。
PS:Block 大小 从 2.7.3版本开始,官方关于 Data Blocks 的说明中,block size由 64 MB变成了128 MB的。
04-故事翻译
NN 就像一个存储仓库的“主管”,手里有一本物资清单,记录着仓库里面的商品名称和商品的位置。
如果外面的客户要存储一个商品,NN“主管”翻开清单查阅,看看该商品是否已经在仓库存储过了,以及放在哪里?
对客户来说,我就存一次,但为了防止商品存放损坏或者丢失,DN 这群小弟拿出了哆啦 A 梦的拷贝镜子,按规矩多复制了两份,加上原来的一份总共三份,因为事不过三嘛。
NN “主管” 的 管理 HDFS “仓库”地方够大,非常适合大型商品存储,只需进货一次,N 次取出,取货的速度比顺丰还快。业绩蒸蒸日上。
同行派人暗中调查,发现原来客户存放一次大商品,都会被拆卸分成一个个块(妇科圣手啊,什么都能切)记上标记,然后给分配给一下空闲的 DN 小弟,小弟在仓库里都有自己负责的货架。
每次拆卸大商品都是有规矩的,不能拆分太大或太小,默认是 128 MB。
05-写文件图解流程
图中所示客户端请求存储一个 test.txt 文件的流程
1 )步骤 1 表示:客户端找到 NN ,申请上传文件;
2)步骤 2 表示:NN 查询自己的元数据,是否已经存过,若没有,则返回分配的 DN 给客户端,允许存储;
3)步骤3.1-3.3 表示:把一个文件切分从块(block)存储到不同的 DN 中,客户端在写入第一个block 后,DN 会自己另外复制两个副本;
4)步骤4.1-4.2 表示:block 的复制过程,若复制的过程失败了,最终会反馈给 NN ,让 NN 随机通知一个 DN 继续复制到另一个 DN 上。
所以这就保证了,客户端只需要写入一次就够了,剩下的副本复制 HDFS 会处理。