Hadoop HDFS(二)结构解析和名词解释

1.Hadoop HDFS架构向导的目的

在这篇关于HDFS文章结构的指南里,你可以读到所有关于HDFS的东西。首先,我们讨论一下HDFS的设计理念和目标。这个结构教程会覆盖所有Hadoop HDFS的结构细节,比如NameNode, DataNote, 二手节点,检查节点,和备份节点。HDFS的特征比如机架感知,高可用性,数据块,复制管理,HDFS数据读写操作也会在这个教程中被讨论到。

2.什么是Hadoop HDFS?
Hadoop 分布式文件系统是世界上最可靠的文件系统。HDFS可以再大量硬件组成的集群中存储大文件。它的设计原则是趋向于存储少量的大文件,而不是存储大量的小文件。即使在硬件发生故障的时候,HDFS也能体现出它对数据存储的可靠性。它支持高吞吐量的平行访问方式。

2.1 HDFS 的理念和目标
I. 硬件故障
硬件故障已经不再是异常了,它变成了一个常规现象。HDFS实例由成千上万的服务机器组成,这些机器中的任何一个都存储着文件系统的部分数据。这里元件的数量是庞大的,而且极可能导致硬件故障。这就意味着总是有一些组件不工作。所以,核心结构的目标是快速的自动的进行错误检测和恢复。

II. 流数据访问
HDFS 应用需要依赖流去访问它的数据集。Hadoop HDFS的设计方向主要面向于批处理而不是用户交互。着力点在于重视数据访问的高吞吐率而不是数据访问的低延迟性。它注重于如何在分析日志的同时尽肯能快速的获得数据。

III. 巨大数据集
HDFS通常需要工作在大数据集上。标准的实践中是,HDFS系统中存在的文件大小范围是GB(千兆字节)到TB(兆兆字节)。HDFS架构的设计就是如果最好的存储和获得大量的数据。HDFS也提供高聚合数据的带宽。它同样应该具备在单一集群中可以扩展上百个节点的能力。与此同时,它也应该具备在一个单元实例中处理处理数千万个文件的能力。

IV. 简单的一致性模型
它工作在一次性写入多次的读取的理论上。一旦数据被创建、写入和关闭,改文件是不能被修改的。这种方式解决数据一致性的问题同时也实现了高吞吐量访问数据的需求。基于MapReduce的应用和或者网络爬虫的应用在这种模型中拥有很高的适应性。和每一apache笔记一样,未来计划增加追加写入文件这一功能。

V. 转移计算量比转移数据更合理
如果一个应用在它操作的数据附近进行计算,总会比在离它远的地方做计算更高效。这个现象在处理大的数据集时,往往提现的更明显。这样做主要的优势体现在增加系统的总吞吐量上。它同时也最小化了网路阻塞。其理念是,将计算移动到离数据更近的位置,来代替将数据转移到离计算更近的位置。

VI. 便捷的访问有不同软件和硬件组成的平台
HDFS 被设计成便捷的在平台之间切换。这让HDFS系统能够因为其适应性而广泛传播。这是在处理大数据集数据的最好的平台。

  1. 什么是HDFS的架构?
    Hadoop架构由主/从体系结构构成,主实体是NameNode用来储存元数据,从实体是DataNode用来实际存放数据。一个HDFS结构包含一个NameNode,剩下的都是DataNodes.

我们下面讨论一下Hadoop HDFS架构中节点们的细节。

3.1 什么是HDFS中的NameNode?
NameNode在HDFS架构中也被成为主节点。HDFS NameNode存储元数据,比如,数据块的数量,副本的数量和其它的一些细节。这些元数据被存放在主节点的内存中,为了达到最快速度的获取数据。NameNode 负责维护和管理从节点并且给从节点分配任务。它是整个HDFS的中心环节,所以应该将其部署在可靠性高的机器上。

NameNode的任务清单:
· 管理文件系统命名空间
· 规定客户端访问文件规则
· 对文件执行命名,关闭,打开文件或打开路径等 操作
· 所有的数据节点发送心跳给NameNode, 它需要确保数据是否在线。一个数据块报告包含所有这个数据点上的所有block的情况。
· NameNode也负责管理复制因子的数量。

文件呈现在NameNode元数据中如下所以:

FsImage(镜像文件) –

FsImage在NameNode中是一个“镜像文件”。它将全部的文件系统的命名空间保存为一个文件存储在NameNode的本地文件系统中,这个文件中还包含所有的文件序列化路径和在文件系统中的文件inodes,每个inode都是文件或者目录元数据的内部表示。

EditLogs(日志文件) –

日志文件包含所有在镜像文件上对系统的最新修改。当NameNode从客户端收到一个创建/更新/删除请求时,这条请求会先被记录到日志文件中。

3.2 什么是HDFS DataNode?

DataNode在HDFS架构中的从节点。在Hadoop HDFS架构,DataNode是实际的存储数据节点。它可以执行来自客户端的每个读和写的请求。DataNodes可以部署在商品硬件上。

DataNode的任务:
· 根据NameNode的指令对Block进行复制,创建和删除
· DataNode管理系统数据的存储
· DataNode发送心跳给NameNode给HDFS报告其本身的确定性。默认情况下3秒钟上报一次心跳。

3.3 什么是次要NameNode?

在HDFS中,当NameNode运行时,它首先从镜像文件FsImage中读取HDFS的状态,然后它在日志文件中读取并执行日志文件中的操作指令。执行完毕后将一个最新的HDFS状态写给镜像文件FsImage。写入状态完毕之后,我们又得到了一个空的日志文件,继续等待日常操作的记录。 在启动时,NameNode会将镜像文件和日志文件融合,因此随着时间的推移,日志文件可能会变得非常大。拥有较大的日志文件的后果是在下一次重新启动Namenode时需要更长的时间。

次要NameNode的产生就是为了解决这个问题,次要NameNode从NameNode下载FsImage和EditLogs。然后将EditLogs和FsImage进行融合。它给日志文件的大小一个限制。它将融合后的FsImage文件存储在一个永久存储器中。我们可以在NameNode出现故障的时候使用它。

次要NameNode在HDFS中起到一个常规检查点的作用。

3.4 什么是检查点节点?

检查节点是一个定期在命名空间创建检查点的节点。在Hadoop中的检查点先从活动的Namenode中下载FsImage文件和日志文件,它在本地将两个文件进行融合,然后上传新的镜像给活动NameNode。它存储最后的检查点的结构,所以它的路径结构应该跟NameNode的路径结构一样。读取检查点镜像的权限,如果有必要应该一直为NameNode开放。

3.5 什么是备份节点?

备份节点也提供和检查节点一样的检查功能。在Hadoop中,Backup节点保留内存中最新文件系统命名空间的副本。它和NameNode的状态总是同步的。在HDFS架构中的备份节点不需要从活动的NameNode中下载FsImage和它日志文件去创建检查点。它在内存中已经拥有了最新的命名空间状态。备份节点的检查点流程比起检查节点的检查流程效率更高,因为它只需要保存命名空间到本地镜像文件和重置日志文件就够了。NameNode一次只支持一个备份节点。

3.6 HDFS架构中的Blocks是什么?

HDFS将巨大的文件分割成小的文件块,这种文件块就叫Blocks. 这些Blocks是文件系统中最小的数据单元。客户端或者管理员,不需要控制这些blocks的存储位置,由NameNode决定类似的事情。

默认的HDFS block大小为128MB,当然这值可以根据不同需求而改变。一个文件除了最后一个block其他block的大小都是相同的,最后一个文件的大小可以是128MB,也可以更小。如果数据的大小比block默认值的大小小的话,block大小就会等于数据的大小。例如一个数据的大小为129MB,则系统会为这个数据创建两个Block一个大小为128MB,另一个大小只为1MB. 存储成这样的好处是,既可以节省空间,有可以节省查询时间。

3.7 什么是复制管理?

Block复制支持容错机制。如果一个副本不能被访问或者损坏,我们可以从其他的副本中读取数据。在HDFS架构中一个文件的副本数量叫做复制因子。默认的复制因子为3,可以通过修改配置文件修改复制因子。当复制因子为3的时候每个block会被存放在3个不同的DataNode中。

如果一个文件是128MB,根据默认配置它将占用384MB的系统空间存储。

NameNode通过从DataNode定期接收数据块上报去维护复制因子,当一个数据块过多复制或者复制不足,则NameNode负责根据需要增加或删除副本。

3.8 什么是HDFS架构中的机架感知?

在大型的Hadoop集群中,为了提高读、写HDFS文件的效率,NameNode都是按就近原则选择数据节点的,一般的都是选择相同机架的DataNode或者是邻近机架的DataNode去读、写数据。NameNode通过为维护每个数据节点的机架ID来获取机架信息。机架感知在hadoop中是一个有机架信息来获取数据节点的概念。

在HDFS架构中, NameNode必须确保所有的副本不存放在相同机架或者单一机架中。它遵循机架感知算法来减少延迟和提高容错。我们知道默认的复制因子为3。根据机架感知算法,一个数据块的第一个副本会存储在本地机架上,第二个副本会存储在同一个机架的不同DataNode上,第三个副本会存储在Hadoop集群中的不同机架上。

机架感知对于提升一下方面有着重要作用:
· 数据高可用性和可靠性
· 集群的表现
· 提升网络带宽

3.9 HDFS读、写操作

3.9.1 写操作

当客户端想写入一个文件到HDFS中时,它与NameNode进行交互,索取元数据。NameNode根据请求,返回一定数量的blocks和他们的位置,副本和其他的信息给客户端。根据从NameNode获取的信息,客户端将文件分割成多个blocks,然后开始讲这些blocks发送给第一个数据节点。

客户端首先向DataNode 1发送block A和其它个数据节点的信息。当DataNode 1收到从客户端发来的block A,它复制相同的block给同一机架上DataNode 2。由于这两个数据节点在同一个机架上,所以数据块传递通过机架开关。现在DataNode 2复制同样的block给DataNode 3,因为这两个数据节点在不同的机架上,所以两者之间的块传输通过一个机架外开关。

当DataNode收到从客户端传递过来的Blocks,它会发送给NameNode一个确认信息。这个过程会持续重复,直到这个文件每一个block被发完。

3.9.2 读操作

从HDFS中读取文件,客户端也需要跟NameNode通讯请求元数据。客户端给出文件名称和它自身的地址,NameNode响应请求并返回blocks的数量、位置、副本等其他信息。

现在客户端直接跟数据节点进行通讯,客户端开始平行的从NameNode提供的数据节点上读取数据。当客户端或者应用收到所以的blocks的时候,它将这些数据块还原成原始的文件形态。

    原文作者:Simple_Coder
    原文地址: https://www.jianshu.com/p/86a70ac1f5f9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞