这篇文章是关于HDFS如何设计建筑的。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。
一、Hadoop 简介
Hadoop版本刚出来的时候,是为了解决两个问题:一个是如何存储海量数据,另一个是如何计算海量数据。Hadoop的核心设计是HDFS和Mapreduce。HDFS解决了如何存储海量数据的问题,而Mapreduce解决了如何计算海量数据的问题。HDFS的全称是:Hadoop分布式文件系统。
二、分布式文件系统
图中的HDFS实际上可以理解为一个分布式文件系统。如图1所示,假设每台服务器的存储空间存储10G的数据,可以看出这四台服务器是否都有自己的文件系统来存储数据。假设在数据量很小的情况下存储10G的数据是可以的,那么当数据量大于服务器的存储空间时,单个服务器是否不可能存储呢?我们能否在服务器中部署一个Hadoop,这样我们就可以构建一个集群(超级计算机)?这样就存储了4*10=40G的数据量,这样当我们面对用户时,是不是只有一台超大型计算机相当于一个分布式文件系统?
HDFS是一个主从架构,只有一个NemeNode作为主节点。从节点中有多个数据节点。
三、HDFS 架构
图片:假设我们这里有五个服务器,每个服务器都是用Hadoop部署的。让我们只选择一台服务器部署名称节点,其余服务器部署数据节点。
客户端上传文件时,假设文件大小为129MHDFS,默认拆分大小为128M m,此时会生成两个blkNameNode通知DataNode上传文件(这里有一定的策略),所以我们假设这些文件会分别存储在四个服务器上。为什么要分开存放?假设有一天数据节点服务器突然挂起。我们还能通过DataNode4或者2、3读取数据,防止数据丢失吗?
NameNode
管理元数据信息(文件目录树):文件与数据块、数据块与数据节点主机之间的关系。
名称节点将元数据信息加载到内存中,以便快速响应用户的操作。
DataNode
数据存储,将上传的数据划分为固定大小的文件块(blocks),从Hadoop2.73之前的64M变为后来的128M。
为了确保数据安全,默认情况下每个文件有三个副本。
SecondaryNamenode
定期从NameNode拉Edtis和fsimage文件,将这两个文件添加到内存中,然后将这两个文件添加到内存中进行合并,以生成新的fsimage并将其发送到NameNode。
四、HDFS写入数据流程
客户端将使用文件路径向名称节点发送写请求,通过RPC与名称节点建立通信。NameNode将检查目标文件并返回是否可以上传。
客户端请求第一个数据块应该传输到哪个数据节点服务器;
NameNode根据副本数量和副本放置策略分配节点,并返回DataNode节点,如a、b和c。
请求客户端A节点建立管道,A收到请求后会继续调用B,然后B调用C,整个管道建立完成后,会一步步向客户端返回消息;
接收到客户端A返回的消息后,开始向A上传第一块,该块被切割成64K数据包,在pepiline管道中连续传输,并从A复制存储到B and B到c。
当一个数据块传输完成后,客户端请求NameNode再次上传第二个数据块的存储节点,并保持来回存储。
当传输完所有块块后,客户端调用FSDataOutputSteam的close方法关闭输出流,最后调用FileSystem的complete方法通知NameNode数据写入成功。
五、HDFS读取数据流程
客户端首先用读取路径向NameNode发送读取请求,通过RPC与NameNode建立通信,NameNode检查目标文件,确定请求文件所在块的位置信息。
NameNode将根据需要返回文件中的部分或全部块列表。对于每个块,名称节点将返回包含该块副本的数据节点地址。
这些返回的DataNode地址会根据集群拓扑得到DataNode和Client之间的距离,然后按照两个规则进行排序:网络拓扑中距离客户端最近的排第一;心跳机制超级联赛上报的DN状态为STALE,较低;
客户端选择排名靠前的数据节点,并调用FSDataInputSteam的读取方法来读取块数据。如果客户端本身是数据节点,块数据将直接在本地获得。
读取一批块块后,如果文件读取尚未完成,客户端将继续从NameNode获取下一批的块列表并继续读取。
读取所有块块后,客户端调用FSDataInputStream.close()方法关闭输入流,并将所有读取的块块合并到一个完整的最终文件中。
六、HDFS缺陷
注:早期版本
单点问题
记忆限制
感谢阅读!这篇关于“HDFS如何设计建筑”的文章就分享到这里。希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/139136.html