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分类

  1. DataNode节点可以为client

  2. 非DataNode节点可以为client,比如外部的host写入file1文件时,


如果client为DataNode,某个block的3份备份,如何选取DataNode进行存储呢?一般地,它会在自己所在的host上备份一个,然后在另外一台机架的不同DataNode上分别备份一个。


如果client不是DataNode所在的host,也就是我们比如在存入有道笔记一个pdf文件时,很明显我们不是在有道的集群上的DataNode的host上,而是在自己的主机上,此时,我们写入文件时,有道的HDFS会将此文件分解为块,然后根据某个算法,找到某个DataNode,然后在另外不同的机架上,选择两个DataNode,这是默认的行为。



03

向集群中写入一个文件FileA

HDFS|基本概念和读写原理


FileA假定大小为100M。

  1. Client将FileA按64M分块。分成两块,block1和Block2;

  2. Client向NameNode发送写数据请求,如图蓝色虚线①。

  3. 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|基本概念和读写原理的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop — HDFS的概念原理及基本操作

转帖Hadoop — HDFS的概念原理及基本操作

HBase基本概念

HDFS文件的读写操作剖析

Hbase原理基本概念基本架构

Hbase原理基本概念基本架构