谈谈HDFS
Posted 数据仓库与分析
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈谈HDFS相关的知识,希望对你有一定的参考价值。
HDFS是一种分布式文件系统,它设计的目标是运行在普通硬件上,作为目前最广泛的大数据框架的文件系统,HDFS的优势非常明显,不需要优秀的硬件资源、只需要简单的物理机组成分布式集群,可以使用横向拓展来提高存储容量。
基本介绍
并非唯一
HDFS 并非唯一的分布式文件系统,还有 GFS、TFS 等,但 HDFS 是使用最多的开源分布式文件存储系统,具有高度容错及低成本的特点。
简单的一致性模型
HDFS 通常是一次写入,多次读取,不支持随机写操作,可以在文件末尾追加。这种方式简化了数据一致性问题。
移动计算思想
针对海量数据的处理,如果需要将数据移动到计算程序所在的节点,受网络的限制,计算将变得非常缓慢。HDFS提供接口将计算程序移动到数据所在的位置,移动应用程序比移动海量数据效率高得多。
数据副本存放策略
HDFS实例通常分布运行在由许多机架组成的集群中,一个机房中有很多机架,一个机架上有多个服务器,以默认 3 个副本的情况下,采用如下的放置策略:在机架 1 上放置第一个副本,在另一个机架 2 上放置第二副本,副本三与副本二放置在同一个机架上。
框架介绍
HDFS 是 master/slave 架构,在分布式中,一主多从的架构很常见。NameNode 主要存储和管理数据的元信息以及接受客户端的请求,DataNode 主要存储文件,所有的元信息都存储在一个 NameNode 节点上。
NameNode
NameNode主要的功能有接受用户请求,维护文件系统的目录结构,管理文件与block之间的关系以及block与 DataNode 之间的关系;
NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表的角色。
目录仅仅是元信息,没有冗余备份,文件才有备份;
NameNode 怎么把元数据保存到磁盘上的呢?这里有两个不同的文件,fsimage:它是在 NameNode 启动时对整个文件系统的快照;edit logs它是在 NameNode 启动后,对文件系统的改动序列,如下图所示:
SecondaryNameNode
SecondaryNameNode 不是 NameNode 的备份,不是为了做高可用(HA)的,Secondary NameNode 的整个目的是在 HDFS 中提供一个检查点。
在NameNode 重启时,edit logs合并到 fsimage 文件中,从而得到一个文件系统的最新快照。当NameNode运行了很长时间后,edit logs文件会变得很大。怎么去管理这个文件是一个挑战。
如果NameNode挂掉了,那我们就丢失了很多改动因为此时的 fsimage 文件非常旧。
因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的 fsimage 文件,这样也会减小在NameNode上的压力。
SecondaryNameNode 就是来帮助解决上述问题的,它的职责是合并 NameNode 的 edit logs 到 fsimage(FileSystem 镜像)文件中。
DataNode
HDFS 将文件数据分割成若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。
一个物理节点可以作为一个 DataNode,也可以在一个节点上启动两个 DataNode,只是通常不会这么做;这里DataNode 负责文件数据的存储和读写操作。
应用程序客户端可以并行对这些数据块进行访问,从而使得 HDFS 可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。
Blockreport
NameNode 会与 DataNode 之间会通过心跳机制进行通信。
每个 DataNode 会定期向 NameNode 发送心跳以及Blockreport,Blockreport 上包含了该 DataNode 上的 block 列表,这种心跳机制也是 NameNode 检测 DataNode 是否存活的依据。
默认发送心跳的时间是3秒,默认判断 DataNode 是否存活的时间是 10 分钟,也就是 10 分钟接收不到该 DataNode 的心跳,则认为它已经宕机,不会再与该 DataNode 发送读写操作。
HDFS 容错性设计
数据容错性
HDFS 对于存储在 DataNode 上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和,如果校验不正确就抛出异常,应用程序捕获异常后就到其他 DataNode 上读取备份数据。
如果 DataNode 监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有 BlockID 报告给 NameNode,NameNode 检查这些数据块还在哪些 DataNode 上有备份,通知相应的 DataNode 服务器将对应的数据块复制到其他服务器上,以保证数据块的备份数满足要求。
DataNode 会通过心跳和 NameNode 保持通信,如果 DataNode 超时未发送心跳,NameNode 就会认为这个 DataNode 已经宕机失效,立即查找这个 DataNode 上存储的数据块有哪些,以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证 HDFS 存储的数据块备份数符合用户设置的数目,即使再出现服务器宕机,也不会丢失数据。
NameNode 高可用容错能力非常重要。NameNode 采用主从热备的方式提供高可用服务
以上是关于谈谈HDFS的主要内容,如果未能解决你的问题,请参考以下文章