HDFS前言

HDFS产生背景:

数据量越来越大,在一个操作系统下存不下所有数据,那么就需要分配到更多的操作系统管理的磁盘中,但是这样不方便管理。所以需要一种系统来管理多台机器上的文件,这句诗分布式文件管理系统,HDFS只是分布式文件管理系统中的一种。

HDFS是什么:

Hadoop Distributed File System ,Hadoop分布式文件系统,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。主要用来解决海量数据的存储问题。

HDFS使用场景:

适合一次写入,多次读出的场景,且不支持文件的修改。所以适合用来做数据分析,不适合用来做网盘应用。

设计思想:

1、分散均匀存储 dfs.blocksize = 128M

2、备份冗余存储 dfs.replication = 3(数据默认存3份)

在大数据系统中的应用:

为各类分布式运算框架(如:mapreduce,spark,tez,……)提供数据存储服务。

重点概念:

文件切块,副本存放,元数据

HDFS 的概念和特性

概念:

首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件

其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;

重要特性:

(1)HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

(2)HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data

(3)目录结构及文件分块信息(元数据)的管理由namenode节点承担

——namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)

(4)文件的各个block的存储管理由datanode节点承担

\---- datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication)

(5)HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改

_(注:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)_

图解HDFS:
通过上面的描述我们知道,hdfs很多特点:

保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份)。注意,副本数再大,也大不过节点数。

运行在廉价的机器上

适合大数据的处理。HDFS默认会将文件分割成block,,在hadoop2.x以上版本默认128M为1个block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。

如上图所示,HDFS也是按照Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。

NameNode:是Master节点,是大哥(大哥只能有一个)。存储文件
的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,
文件权限等),以及文件的块列表(就是指文件被划分储存在了
哪些block块上) 。注意:namenode不存文件,只存 fsimage+edits

SecondaryNameNode:是大哥老婆(老婆也就一个)分担大哥namenode
的工作量(特指合并fsimage和edits),虽然能分担一部分
大哥的工作量,但永远不能替代大哥。是NameNode的冷备份,负责定时
默认1小时,从namenode上,获取fsimage和edits来进行合并, 
合并成fsimage.ckpt 并推送给namenode(意味着替换了旧的,所
以namenode和secondrynamenode是交替更新的)。同时还会创建
一个checkpoint还原点。相当于win系统的还原点。减少namenode的工作
量。在紧急情况下,可辅助恢复namenode(只能回复部分,并不是所有)
由于secondrynamenode的特点,会发现它还是蛮鸡肋的,既不能立马
替换挂掉的Namenode并提供服务,又不能完全恢复Namenode数据。
【为什么不能完全恢复,其实也很好理解,因为比如规定的是每隔一小时
secondry去拿。我们在十一点进行了大量操作,然后11:59 namenode挂
了。因为secondry还没拿到最新的,所以只能恢复到11点的,11-11:59
的就丢失了】

DataNode:Slave节点,小弟,干活的(小弟就有无数个了)。负责
存储client发来的数据块block;执行数据块的读写操作以及块数据的
校验和(就是验证数据的完整性)。正因为要验证数据的完整性,
所以datanode始终会与namenode保持通讯,这个叫做心跳。用来告诉
老大我这个小弟挂没,以及我存储了哪些文件的信息报告。
具体点就是通过向 NN 发送心跳保持与其联系(3 秒一次),
如果 NN 10 分钟没有收到 DN的心跳,则认为其已经 lost,
并 copy 其上的 block 到其它 DN

热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是
b上存储a的一些信息,减少a坏掉之后的损失。  

fsimage:元数据镜像文件(文件系统的目录树。)  
edits:元数据的操作日志(针对文件系统做的修改操作记录)

block块大小:Block的大小等于传输时间\*传输速率。在hadoop2.x版本当中
默认大小是128M。并且blcok是datanode当中的子元素。之所以这么说,
是因为datanode的作用之一就是存储实际的数据块。(上面有介绍)
另外,block块的存储空间其实是个虚拟空间。类似于我们虽然给每台虚拟
机都设置了50G的存储空间,但是这50G的空间并没有说被硬生生的独立出
来啊。能用到50G就用到,用不到也不妨碍别人继续用,差不多就是这么个
意思。因此不存在说空间浪费的说法。此外,分块存贮文件,都是一个
block用完就用下一个,不存在平分的说法。举个例子:
有一个文件130M要存储到HDFS当中,那么就相当于该文件占据了两个block块,
在第一个block块中存放了128M,在第二个blcok块中存
放了2M,同时就像上面我们所说,block是虚拟的空间,不是独立出去的。
所以第二个blcok块的剩余空间还能存其他文件啊。
另外再提一点,我们已经知道block是存放文件的,那么要是该文件还有其
他副本呢?很简单,还是同样的block块也跟着复制。
比如有一个110M的文件,它占据了1个blcok块。但是他还有两个副本,因
此还会再有两个相同的blcok块。差不多就是这个意思,文件有副本,对应
的blcok块也会有相应副本,这是一一对应的。因此,说以并不是说文件副
本越多越好。虽然安全了,但是占据的存储空间也就多了。
另外,副本存放策略HDFS也会有规则的

副本存放策略:
1) 第一个副本:放置在上传文件的 DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU 不太忙的节点。
2) 第二个副本:放置在于第一个副本不同的机架的节点上
3) 第三个副本:与第二个副本相同机架的不同节点
4) 更多副本:随机节点

最后回答几个问题

  1. 为什么块的大小不能设置的太小,也不能设置的太大。
(1)HDFS的块是指的太小,会增加寻址时间,程序一直在找块的开始位置
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需时间。呆滞程序在处理这块数据时会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率

2.如何解决上面我们所说的,就一个namenode老大,挂掉了数据会丢失的问题呢?(其实这就是单点故障问题)

 1)启动一个拥有文件系统元数据的新NameNode(这个一般不采用,因为复制元数据非常耗时间)

 2)配置一对活动-备用(Active-Sandby)NameNode,活动NameNode失
 效时,备用NameNode立即接管,用户不会有明显中断感觉。

    共享编辑日志文件(借助NFS、zookeeper等)

    DataNode同时向两个NameNode汇报数据块信息

    客户端采用特定机制处理 NameNode失效问题,该机制对用户透明
 
方法2就是 HA 高可用方法。

3.一般情况下HDFS当中这三个进程的启动顺序

namenode > datanode > secondarynamenode

DKCN
0 声望0 粉丝