HDFS产生背景:node
数据量愈来愈大,在一个操做系统下存不下全部数据,那么就须要分配到更多的操做系统管理的磁盘中,可是这样不方便管理。因此须要一种系统来管理多台机器上的文件,这句诗分布式文件管理系统,HDFS只是分布式文件管理系统中的一种。
HDFS是什么:安全
Hadoop Distributed File System ,Hadoop分布式文件系统,由不少服务器联合起来实现其功能,集群中的服务器有各自的角色。主要用来解决海量数据的存储问题。
HDFS使用场景:服务器
适合一次写入,屡次读出的场景,且不支持文件的修改。因此适合用来作数据分析,不适合用来作网盘应用。
设计思想:网络
一、分散均匀存储 dfs.blocksize = 128M 二、备份冗余存储 dfs.replication = 3(数据默认存3份)
在大数据系统中的应用:框架
为各种分布式运算框架(如:mapreduce,spark,tez,……)提供数据存储服务。
重点概念:分布式
文件切块,副本存放,元数据
概念:oop
首先,它是一个文件系统,用于存储文件,经过统一的命名空间——目录树来定位文件 其次,它是分布式的,由不少服务器联合起来实现其功能,集群中的服务器有各自的角色;
重要特性:大数据
(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不少特色:spa
保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存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)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