3.HDFS存储系统

HDFS文件存储系统的构成:

  每个block块大小为什么默认是128M?

  计算机硬盘吞吐速度为128M左右。(CPU,磁盘,网卡之间的协同效率 即 跨物理机/机架之间文件传输速率)

block块大小设计原则:最小化寻址开销,减少网络传输

  1. 如果块设置过大

第一点: 从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;

第二点: mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。

第三点: 在数据读写计算的时候,需要进行网络传输.如果block过大会导致网络传输时间增长,程序卡顿/超时/无响应. 任务执行的过程中拉取其他节点的block或者失败重试的成本会过高.

第四点: namenode监管容易判断数据节点死亡.导致集群频繁产生/移除副本, 占用cpu,网络,内存资源.

  2. 如果块设置过小

第一点: 存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的物理内存是有限的;

第二点: 文件块过小,寻址时间增大,导致程序一直在找block的开始位置。

第三点: 操作系统对目录中的小文件处理存在性能问题.比如同一个目录下文件数量操作100万,执行"fs -l "之类的命令会卡死.

第四点: ,则会频繁的进行文件传输,对严重占用网络/CPU资源.

那么为什么是128M?

  1.HDFS中,平均寻址时间大概为10ms;

  2.经测试发现,寻址时间为传输时间的 1% 时,为最高效状态;10ms/ 0.01 = 1000ms = 1s

3.目前磁盘的传输速率普遍为100MB/s,网卡普遍为千兆传输速率也是100MB/s;

  100MB/s X 1s = 100MB

  所以最佳默认block大小为128M

4.实际生产中,可以根据集群之间的具体情况进行设置

  例如:跨物理机/机架之间文件传输效率为200MB/s时,一般设定block块大小为256MB;文件传输速率为400MB/s时,一般设定block块大小为512MB。最大一般不超过512MB,因为目前固态硬盘的读写速率应该不会超过512MB(RAID另行考虑)

 


 

一、NameNode、SecondaryNameNode以及DataNode

  1> Namenode(NN):元数据节点  ---->  存储的是目录

  一个HDFS集群只有一个活跃的NN。是HDFS主从架构中的master,负责整个文件系统的目录树。

  作用:管理的是Block块的元数据信息;

     处理客户端的读写请求;

     管理Block块的副本放置策略

NameNode被格式化之后,将在Hadoop的/data/tmp/dfs/name/current目录中产生如下文件:

fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION

  1、Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户

端执行的所有写操作首先会被记录到Edits文件中。

  2、Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包

含HDFS文件系统的所有目录和文件inode的序列化信息。

  3、seen_txid文件:保存的是一个数字,就是最后一个edits_的数字。

  4、每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits

里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成

NameNode启动的时候就将Fsimage和Edits文件进行了合并。


  edits文件会特别多,namenode会将这些edits传给Secondarynamenode

(理解为秘书),由它来存储并合并,在将合并后的Fsimage文件传回给

namenode。

 

  2> SecondaryNameNode(SNN): 从元数据节点  ---->  相当于Namenode的秘书

  接受namenode传来的edits文件按,并每隔一段时间后将他们合并压缩成

一个Fsimage文件,将他传回给Namenode,Namenode需要的时候直接从这

里读取就即可,没有再去读edits文件。

为什么需要一个“秘书”?  

  NameNode的元数据到底存放在哪里?

  首先不可能是磁盘,因为如果存放在磁盘,那么经常操作hdfs,效率会非低,那么就只能会存放内存里。可是,效率虽然快了,但是如果内存满了,或者集群停止服务,那么数据的元数据就会丢失,对于这个问题,HDFS做了一个专门用来解决这个问题的角色,SecondaryNameNode

  3> DataNode(DN):数据节点  ---->  真正存储数据并进行备份的地方

  保存、检索Block。接收的数据真正存储的地方。一个集群可以有多个数据节点。正常工作中,他一直与namenode进行交互通信,提供自己的本地信息。

   4> HDFS的容错机制:

  4.1:心跳机制:

    在NameNode和DataNode之间维持心跳检测,如果NN没有正常接收到某一个DN的心跳反馈,接下来就不会将任何新的I/O操作派发到那个节点上。同时该节点上的数据也会被认为是无效的,NN就开始检测是否有文件快的副本数目小于设置值,如果小于,就自动开始复制新的副本发送到其他DN节点上。

  4.2:检测文件的完整性:

    HDFS会记录每个新创建文件的所有储存块的校验和。每当检索这些文件或者从某个节点获取块时,会首先确认校验和是否一致。不一致则代表该块上的数据缺失,便会从其他DataNode节点上获取该块的副本。

  4.3:集群的负载均衡:

    某时刻如果集群上的某一个节点失效或者增加,可能导致数据分布不均匀,当某个DataNode节点的空闲时间大于一个临界值时,HDFS会自动从其他DataNode迁移数据过来。

  4.4:多副本机制:

    HDFS会将文件切片成块,再存储至各个DataNode上,文件数据块在HDFS的布局情况由NameNode和hdfs-site.xml中的配置dfs.replication共同决定。dfs.replication表示该文件在HDFS中的副本数,默认为3,即有两份冗余。

 


 

 

二、读写过程

  1、HDFS副本机制:

  为避免数据丢失,hdfs会创建多个数据的副本,他的存放满足以下特点:

副本默认书为3份。
一个在本地机架节点 一个在同机架不同节点(通过机架感知) 一个在不同机架上的某一节点
如果设置了更多的副本数,其余的副本随机分配,但会尽量避免多份副本在同一节点上

  2、读文件

  客户端发出请求,传递给DistributedFilesystem,由他向Namenode申请,Namenode获取对应的数据所在块的位置(元数据)。客户端通过这些位置信息,根据就近原则,依靠FSDataInputStream去DataNode上读取相应位置上的文件

  3、写文件

  客户端发出请求,传递给DistributedFilesystem,由他向Namenode申请,Namenode先判断文件是否已经存在,并返回给客户端。如果可以上传,再获取距离客户端最接近的节点位置,传递给他,他再返回给客户端;客户端通过这个位置信息,以FSDataOutputStream去在对应的节点上存储数据,存储完成后,通过机架感应,在同机架的另一个节点位置上再写(备份),这一步完成后,再去其他的任意机架上的某一节点,再去备份。这样存储的数据就有三份(副本机制)。

 

posted on 2021-10-20 19:17  理想三旬_z  阅读(219)  评论(0编辑  收藏  举报

导航