HDFS|基本概念和读写原理
Posted Python与算法社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS|基本概念和读写原理相关的知识,希望对你有一定的参考价值。
01
—
HDFS设计目的
A distributed file system that provides high-throughput access to application data.
HDFS(Hadoop Distributed File System )是Hadoop分布式文件系统,设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件,流式读取方式,主要是针对一次写入,写入的过程使用的是append的方式,多次读出的使用模式。
该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份),使得用户可以专注于自身的操作运算。
02
—
HDFS相关的基本概念
block
这是HDFS的基本思想了,把大的文件分成块,每块64M。
备份(replicas)
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
机架 (rack)
由几个DataNode组成的部件称为机架
MetaData
描述我们要存储数据的数据结构
HDFS namespace
这个命名空间指的是文件的目录结构,与我们单个电脑的文件的结构树相似。
EditLog
记录文件系统的metadata变化的事务日志,是HDFS的核心数据结构。 例如,写入一个文件或修改复制因子都会向EditLog中写入一条record。
FsImage
整个文件系统的命名空间,包括block到文件的映射,文件系统的属性(大小,被分为几个block,只读,权限等信息),都被存储在一个文件中,这个文件就是FsImage。
HDFS namespace,EditLog,FsImage都存储在NameNode上。
HeartBeat
NameNode和DataNode通过HeartBeat进行通信,每隔一定时间,DataNode就会向NameNode发送心跳信号,以此报告给NameNode,说我还活着,这样NameNode 在接到读写任务时,会发命令给它。
02
—
HDFS如何分解文件
HDFS默认会将文件分割成 block,64M为1个block,然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。每个文件默认会保存3份。
如下图所示为HDFS的基本架构,按照Master和Slave的结构,主要的组件包括:NameNode、SecondaryNameNode、DataNode。
NameNode:是Master节点,
处理客户端的读、写请求;
管理数据块映射;
管理HDFS的名称空间;
配置副本策略;
SecondaryNameNode:合并fsimage和fsedits,然后再发给namenode,尽量不要与NameNode部署在同一个host上,这样避免内存的过多消耗;NameNode的冷备份;
DataNode:Slave节点,干活的。负责存储client发来的数据块block,执行数据块的读写操作。
client分类
DataNode节点可以为client
非DataNode节点可以为client,比如外部的host写入file1文件时,
如果client为DataNode,某个block的3份备份,如何选取DataNode进行存储呢?一般地,它会在自己所在的host上备份一个,然后在另外一台机架的不同DataNode上分别备份一个。
如果client不是DataNode所在的host,也就是我们比如在存入有道笔记一个pdf文件时,很明显我们不是在有道的集群上的DataNode的host上,而是在自己的主机上,此时,我们写入文件时,有道的HDFS会将此文件分解为块,然后根据某个算法,找到某个DataNode,然后在另外不同的机架上,选择两个DataNode,这是默认的行为。
03
—
向集群中写入一个文件FileA
FileA假定大小为100M。
Client将FileA按64M分块。分成两块,block1和Block2;
Client向NameNode发送写数据请求,如图蓝色虚线①。
NameNode节点,记录block信息,经过一定的算法计算后返回可用的DataNode,如粉色虚线②,计算得出,block1和block2分别被存储在如下的host中:
block1: host2,host1,host3
block2: host7,host8,host4
d. client向DataNode发送block1;发送过程是以流式写入,直到将block1发送完毕,host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。
分析写过程:
写1T文件,我们需要3T的存储,3T的网络流量带宽。
挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个rack,也没关系;其他rack上,也有备份。
04
—
从集群中读文件FileA
上面是写入FileA的过程,HDFS默认用户会多次读取这个文件FileA,那么如何读取呢?
a. client向NameNode发送读请求。
b. NameNode查看Metadata信息,返回fileA的block的位置给client。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2,而且block1去host2上读取;然后block2,去host7上读取;
上面例子中,client位于机架外。
那么如果client位于机架内某个DataNode上,例如 client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。
05
—
HDFS的缺陷
hadoop的HDFS不是完美的,也有缺陷,比如只有一个NameNode节点,这样一旦宕机,整个系统就无法工作。比如hadoop如果接来的小文件太多,那内存的负担会很重。对于这小文件存储,hadoop后续给出了解决方案,之后可以总结这个问题。
参考文献:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
https://www.cnblogs.com/laov/p/3434917.html
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html#%E5%BC%95%E8%A8%80
算法channel会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!
以上是关于HDFS|基本概念和读写原理的主要内容,如果未能解决你的问题,请参考以下文章