HDFS!一家分布式图书馆...
导语
小白和喵先生觉得今天天气不错去了一家图书馆,路上小白问喵先生什么是hdfs,喵先生说:hdfs又称分布式文件系统,它运作原理就像图书馆运作原理一样,你听我慢慢道来:
1、借书 像hdfs读取文件
喵先生对小白说:“咱们去图书馆借书,肯定是4个步骤”
- 我们先到引导台检索图书在哪。
- 引导台会告诉书在哪个书架。
- 走到相应的书架上找到要借阅的书。
- 带着书在引导台处登记下,离开。
翻译过来就是以下的流程:
-
我们指hdfs client 用来连接hdfs的客户端、 引导台指namenode 用来存储数据的信息以及所在路径,例如:book
/home/foo/data 3** -
此时当我们知道书架位置后是我们直接与书架打交道,所以这里的引导台(namenode)类似于负载的作用
-
书架指datanode,用来存放真实数据的地方,由于书可以在书架上存放多个副本,所以这里的数据也一样会备份多个放在多个datanode上,存储的格式是像以block(文件)形式存放 /home/foo/data/file1, /home/foo/data/file2…以及用于校验数据的本身md5值(用于校验后文件是否损坏的一种方式)。
-
当书被借走后,由于datanode与namenode保持着心跳,所以将书被借走的信息同步给namenode让其更新下元数据
小白点点头:“太形象啦”
2、新增图书 像hdfs写文件
突然就在他们要走出图书馆的时候,发现这时图书管理员拿了一堆新书——《数据猿温大大》准备上架
喵先生打趣的跟小白说:”嘿嘿,录入图书的过程就像hdfs的写入一样,3步走:
- 引导台处查询是否由重复的数据,没有则进行上架
- 为了安全考虑,管理员将书第1本放到了当前最近位置,然后副本分别放到了其他书架
- 最后管理员将这堆《数据猿温大大》分别放置到不同的书架上,这个过程运用了一种类似并行处理的方式
翻译过来就是以下流程:
- 管理员指hdfs client,首先在namenode上查询有没有这个数据的记录,没有则记录元数据。
- namenode根据一个hdfs放置策略,决定每个副本放到哪个datanode上,策略是:第1个副本肯定是放在跟hdfs clint所在同一个机架M1上一台服务器A,第2个副本会放到机架M2上一台服务器上B,第3个副本放到同一个机架M2的C.
- 管理员(hdfs clint)只与第一个服务器A建立tcp连接,A与B建立tcp连接,B与C建立tcp连接,A\B\C之间的连接就叫pipeline,同时hdfs clint将block(文件)切割成更小的单位packet,假设共需要备份3个packet传输, 且服务器之间传输1个packet耗时1毫秒,最终目标是需4个packet都备份到ABC服务器上:
通过这种pipeline类似并行处理方式:在这里插入图片描述
第1个packet传递过程:当hdfs clint将第1个packet(p1)传输给A时,A接收(p1),B等待传输,C等待传输,耗时1毫秒
第2个packet传递过程:当hdfs clint将第2个packet(p2)传输给A时,A接收(p2)的同时会传输p1给B,C等待传输,耗时1毫秒
第3个packet传递过程:当hdfs clint将第3个packet(p3)传输给A时,A接收(p3)的同时会传输p2给B,B接收(p2)的同时会传输p1给C,C接收p1,耗时1毫秒
第4个packet传递过程:当hdfs clint将第4个packet(p4)传输给A时,A接收(p4)的同时会传输p3给B,B接收(p3)的同时会传输p2给C,C接收p2,耗时1毫秒
最后,C接收p3/p4,耗时2毫秒
最终同步4个packet共耗时6毫秒,所以能看到这种pipeline像管道流水一样,能加快备份
3、假如namenode数据丢失怎么办,secondnamenode来帮忙:
小白听了后,略有所思说到:“namenode太重要了,负责映射真实数据与文件,万一它那天宕机了咋办呢。”
喵先生先是一愣,赶紧说到:“好问题,目前有2种方法用于恢复数据,
第一种通过记录日志文件,好处是:完整性好,什么操作都会被记录下来;缺点是:服务器运行越久日志数据越大,这样恢复也慢”
第二种通过镜像或快照,好处是:通过基于某个时间点做数据的同步,恢复时间特别快;
缺点是:IO消耗高并且同步伴随着时间间隔,可能会丢数据
hdfs采纳了日志与镜像的优点:开机时通过FsImage做镜像+通过EdisLog记录增量的文件,此过程就是由secondnamenode来做的,定时将FsImage做镜像+通过EdisLog记录增量生成新的FsImage镜像,定时传给namenode,便于namenode定时恢复(期间省略了新镜像合并过程).
小白听了总结道:“secondname就是用来帮namenode做备份的呗,便于namenode数据丢失后快速恢复”
喵先生满意的点了点头。
絮叨
大家好,我是温大大,一个用故事给大家趣说:数据测试、数据运维的人,欢迎微信搜索「数据猿温大大」,关注公众号,这里有好多故事等着你呢!
另外,如果觉得文章对你有帮助,欢迎分享给你的朋友,也给温大大个「点和收藏」,这对我也非常重要,谢谢你们,我们下次见!