这是我参与「第四届青训营 」笔记创作活动的的第2天
一、HDFS的基本介绍
HDFS是Hadoop的分布式文件系统,具有分布式、高吞吐、高容错、高可用、可扩展、廉价的特点。
HDFS组件:
1.Client/SDK
写流程:
读流程:
1.向NameNode发送getBlockLocations请求
2.从NameNode返回副本目标DN列表
3.读取数据块
2.NameNode(中枢节点,数据管理)
3.DataNode(数据存储)
作用:数据块存取
心跳汇报(跟NameNode保持汇报,让NameNode确定该节点存
活)
副本复制(故障时可补上)
Q:对象存储和文件系统有什么区别吗
A:
1.协议。 访问方式也不同。文件存储以挂载方式访问。
-
IO特点:针对对象存储来说,接口简单,一个对象就可以看成是一个文件,只能全写全拼,都是以大文件为主,因此要求足够的IO带宽。文件存储的话具有更丰富的及入口,是需要考虑目录、文件属性等支持的。实现一个支持并行化的文件存储应该是很困难的。
-
Ceph是同时支持对象存储和文件存储的,只是对应的接口不同。对象存储接口主要以S3与Swift为主,文件存储的话是以libcephfs库与posix接口为主。因此在接口上会存在一定的差异。
二、HDFS关键设计
1.NameNode目录树维护
为防止数据丢失,引入EditLog机制,editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。这样的好处为避免系统运行变得十分缓慢,如果每次更新都是在fsimage上进行,里面文件一般都很大,容易导致系统缓慢。
2.NameNode数据放置
3.DataNode
数据块的硬盘存放&启动扫盘
4.HDFS写异常处理
案例1.文件写了一半,client自己挂了。
产生问题:1.副本不一致2.Lease无法释放
案例2.租约。client修改文件时,需要NameNode上锁,如果中途自己挂了,也有个锁
解决方法:Lease Rescovery
租约问题:时间限制,上锁时NameNode每隔段时间确认是否存活,一定时间没有回应就会释放这个锁。
案例3.文件写入过程中,DataNode侧出现异常挂了
时机有:
创建连接时
数据传输时
complete阶段
解决方法:Pipeline Recovery
重新连接,pipeline重新构建
案例4.读取文件中,DataNode侧出现异常挂掉了
解决方法:节点Failover。换个节点重新读