写在前面
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系
解答
上一篇我们分享了 HDFS 的设计目标——HDFS的设计目标是什么?
实际上作为一个分布式文件系统,HDFS 需要满足下面的几个设计需求
- 透明性
- 并发控制
- 可伸缩性
- 容错
- 安全
设计目标和设计需求的区别可以简单理解为一个是主动一个是被动
补充
透明性
如果按照开放分布式处理的标准确定就有8种透明性:
- 访问的透明性
- 位置的透明性
- 并发的透明性
- 复制的透明性
- 故障的透明性
- 移动的透明性
- 性能的透明性
- 伸缩的透明性
对于分布式文件系统,最重要的是能达到以下5个透明性要求。
访问的透明性
用户能通过相同的操作来访问本地文件和远程文件资源。
HDFS可以做到这一点,如果HDFS设置成本地文件系统,而非分布式,那么读写分布式HDFS的程序可以不用修改地读写本地文件,要做修改的是配置文件。
可见,HDFS提供的访问的透明性是不完全的,毕竟它构建于Java之上,不能像NFS或者AFS那样去修改UNIX内核,同时将本地文件和远程文件以一致的方式处理。
位置的透明性
使用单一的文件命名空间,在不改变路径名的前提下,文件或者文件集合可以被重定位。
HDFS集群只有一个 NameNode来负责文件系统命名空间的管理,文件的 block可以重新分布复制, block可以增加或者减少副本,副本可以跨机架存储,而这一切对客户端都是透明的。
移动的透明性
这一点与位置的透明性类似,HDFS中的文件经常由于节点的失效、増加和 replication 因子的改变或者重新均衡等进行复制或者移动。
而客户端和客户端程序并不需要改变什么, NameNode的 edits日志文件记录着这些变更。
性能的透明性和伸缩的透明性
HDFS的目的是构建大规模廉价机器上的分布方式系统集群,可增减其规模。
HDFS通过一个高效的分布式算法,将数据的访问和存储分布在大量的服务器中。
在用户访问时, HDFS将会计算使用网络最近的和访问量最小的服务器给用户提供访问,而不仅是从数据源提取,这是传统存储架构的一个颠覆性发展。
并发控制
客户端对文件的读写不应该影响其他客户端对同一个文件的读写。
要想实现近似原生文件系统的单个文件拷贝语义,分布式文件系统需要做出复杂的交互。
例如,采用时间戳或者类似回调承诺。
回调有两种状态,即有效或者取消。客户端通过检査回调承诺的状态来判断服务器上的文件是否被更新过。
HDFS并没有这样做,它的机制非常简单,任何时间都只允许一个写的客户端,文件经创建并写入之后不再改变。
它的模型是 write-one-read-many, 一次写,多次读。
这与它的应用场合是一致的,HDFS的文件大小通常是MB~TB级的, 这些数据不会经常修改,最经常的是被顺序读并处理,随机读很少,因此HDFS非常适合MapReduce框架或者Web Crawler应用。
HDFS文件的大小也決定了它的客户端不能像其他分布式文件系统那样可以缓存到几百或上千文件。
文件复制劝能
一个文件可以表示为其内容在不同位置的多个备份。
这样做有两个好处:
- 访问同个文件时,可以从多个服务器中获取,从而改善服务的伸缩性;
- 提高了容错能力,某个副本损坏了,仍然可以从其他服务器节点获取该文件。
HDFS文件的block为了容错都将被备份,根据配置的 replication因子,默认是3。
副本的存放策略也很有讲究,一个放在本地机架的节点,一个放在同一机架的另一节点,还有一个放在其他机架上。
这样可以最大限度地防止因故障导致的副本丢失。不仅如此,HDFS读文件的时候也将优先选择从同一机架乃至同一数据中心的节点上读取 block。
硬件和搡作系统的异构性
由于构建在Java平台上,HDFS的跨平台能力毋庸置疑,得益于Java平台已经封装好的文件I/O系统,HDFS可以在不同的操作系统和计算机上实现同样的客户端和服务端程序。
容错能力
在分布式文件系统中,尽量保证文件服务在客户端或者服务端出现问题的时候能正常使用是非常重要的。
HDFS的容错能力大概可以分为两方面:文件系统的容错性,表现Hadoop本身的容错能力。
文件系统的容错性主要通过以下几点体现
- 在 NameNode和 DataNode之间维持心跳检测。
当由于网络故障之类的原因,导致DataNode发出的心跳包没有被 NameNode正常收到的时候, NameNode就不会将任何新的IO操作派发给那个 DataNode,该DataNode上的数据被认为是无效的。
因此 NameNode会检测是否有文件 block的副本数目小于设置值,如果小于就自动开始复制新的副本并分发到其他DataNode节点。 - 检测文件 block的完整性。
HDFS会记录每个新创建的文件的所有 block的校验和, 当以后检索这些文件的时候,从某个节点获取 block,会先确认校验和是否一致,如果不ー致,会从其他 DataNode节点上获取该 block的副本。 - 集群的负载均衡。
由于节点的失效或者增加,可能导致数据分布的不均匀,当某个DataNode节点的空闲空间大于ー个临界值的时候,HDFS会自动从其他 DataNode迁移数据过来。 - NameNode上的 FSImage和 EditLog日志文件是HDFS的核心数据结构,如果这些文件损坏了,HDFS将失效。
因而, NameNode可以配置成支持维护多个 Fsimage和 Editlog 的副本。任何对 Fsimage或者 Editlog的修改,都将同步到它们的副本上。它总是选取最近的一致的 Fslmage和 Editlog使用。 NameNode在HDFS中是单点存在的,如果 NameNode 所在的机器错误,就需要进行手动设置。 - 文件的删除。
删除并不是立即从 NameNode中移除 namespace,而是放在/trash 目录随时可恢复,直到超过设置时间才被正式移除。
再说 Hadoop本身的容错性, Hadoop 支持升级和返回,当升级 Hadoop软件时出现bug或者不兼容现象,可以通过恢复到旧的Hadoop版本。
安全性问题
- 使用与UNIX文件系统类似的文件许可控制
- 实现类似NFS的kerberos验证系统。