初识Hadoop Distributed File System(HDFS)
首先,学习大数据技术时需要关注的重点
1.分而治之
2.并行计算
3.计算向数据移动
4.数据本地化读取
今天就来聊聊大数据的一些历史,以及HDFS。
一、Hadoop
1、Hadoop之父Doug Cutting
Cutting儿子有个玩具小象,所以这下能够理解为啥Hadoop的LOGO是个象了。
2、Hadoop时间简史
(1)谷歌著名的三篇论文:前两篇是Hadoop的思想之源。
《The Google File System》 2003年
《MapReduce:Simplified Data Processing on Large Clusters》 2004年
《Bigtable:A Distributed Storage System for Structured Data》 2006年
(2)Hadoop由Apache Software Foundation于2005年秋天作为Lucene的子项目Nutch的一部分正式引入。
(3)2006年3月份,Map/Reduce和Nutch Distributed File System (NDFS)分别被纳入称为Hadoop的项目中。
(4)Cloudera公司在2008年开始提供基于Hadoop的软件和服务。
(5)2016年10月hadoop-2.6.5。
(6)2017年12月hadoop-3.0.0。
3、Hadoop项目包含
(1)Hadoop Common(1.x+)
(2)Hadoop Distributed File System(HDFS)(1.x+)
(3)Hadoop YARN(2.x+)
(4)Hadoop MapReduce(1.x+)
4、Apache其他和Hadoop相关的项目
(1)Ambari
(2)Avro
(3)Cassandra
(4)Chukwa
(5)HBase:思想源于Google的《Bigtable这篇论文》
(6)Hive
(7)Mahout
(8)Pig
(9)Spark
(10)Tez
(11)Zookeeper:分布式协调服务
分布式文件系统那么多,为什么Hadoop项目还要开发一个hdfs文件系统?
hdfs能更好的支持分布式计算。
二、HDFS存储模型
1、文件线性按字节切割成块(block),具有offset、id
2、文件与文件的block大小可以不一样
3、一个文件除最后一个block,其他block大小一致
4、block的大小依据硬件的IO特性调整:1.x时默认64M,2.x时默认128M
5、block被分散存放在集群的节点中,具有location
6、block具有副本(replication),副本没有主从概念,不能出现在同一个节点
7、副本是满足可靠性和性能的关键
8、文件上传可以指定block大小和副本数,上传后只能修改副本数
9、一次写入多次读取,不支持修改
10、支持追加数据
三、HDFS架构设计
1、HDFS是一个主从(Master/Slaves)架构
2、由一个NameNode和一些DataNode组成
3、面向文件包含:文件数据(data)和文件元数据(metadata)
4、NameNode负责存储和管理文件元数据,并维护了一个层次型的文件目录树
5、DataNode负责存储文件数据(block块),并提供block的读写
6、DataNode与NameNode维持心跳,并汇报自己持有的block信息
7、Client 和NameNode交互文件元数据 和DataNode交互文件block数据
四、HDFS角色功能
1、NameNode
(1)完全基于内存存储文件元数据、目录结构、文件block的映射
(2)需要持久化方案保证数据的可靠性
(3)提供副本放置策略
2、DataNode
(1)基于本地磁盘存储block(文件的形式)
(2)并保存block的校验和数据,保证block的可靠性
(3)与NameNode保持心跳,汇报block列表状态
五、HDFS元数据持久化
1、任何对文件系统元数据产生修改的操作,NameNode都会使用一种称为EditLog的事务日志记录下来
2、使用FsImage存储内存所有的元数据状态
3、使用本地磁盘保存EditLog和FsImage
4、EditLog具有完整性,数据丢失少,但恢复速度慢,并有体积膨胀风险
5、FsImage具有恢复速度快,体积与内存数据相当,但不能实时保存,数据丢失多
6、NameNode使用了FsImage + EditLog 整合的方案
滚动将增量的EditLog更新到FsImage,以保证更近时点的FsImage和更小的EditLog体积
六、HDFS安全模式
1、HDFS搭建时会格式化,格式化操作会产生一个空的FsImage
2、当NameNode启动时,它从磁盘中读取EditLog和FsImage
3、将所有的EditLog中的事务作用在内存中FsImage上
4、并将这个新版本的FsImage从内存中保存到本地磁盘上
5、然后删除旧的EditLog,因为这个旧的EditLog的事务都已经作用在FsImage上了
七、HDFS中的SNN
SecondaryNameNode(SNN)
1、在非HA模式下,SNN一般是独立的节点,周期完成NameNode的EditLog向FsImage合并,减少EditLog大小,减少NN启动时间
2、根据配置文件设置时间间隔fs.checkpoint.period,默认3600秒
3、根据配置文件设置edits log大小,fs.checkpoint.size 规定edits文件的最大值(默认是64MB)
八、Block的副本放置策略
1、第一个副本:
放置在上传的DataNode;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
2、第二个副本:
放置在于第一个副本不同机架的节点上
3、第三个副本:
与第二个副本相同机架的节点
4、更多副本:
随机节点。
九、HDFS写流程
1、Client和NameNode连接创建文件元数据
2、NameNode判定元数据是否有效
3、NameNode触发副本放置策略,返回一个有序的DataNode列表
4、Client和DataNode建立Pipeline连接
5、Client将块分成packet(64KB),并使用chunk(512B)+ chucksum(4B)填充
6、Client将packet放入发送队列dataqueue中,并向第一个DataNode发送
7、第一个DataNode收到packet后本地保存并发送给第二个DN
8、第二个DataNode收到packet后本地保存并发送给第三个DN
9、这一过程中,上游节点同时发送下一个packet
生活中类比工厂的流水线,结论:流式其实也是变种的并行计算
10、HDFS使用这种传输方式,副本数对于client是透明的
11、当block传输完成,DataNode们各自向NameNode汇报,同时client继续传输下一个block
12、所以,client的传输和block的汇报是并行的
十、HDFS读流程
1、为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本
2、如果在读取程序的同一个机架上有一个副本,那么就读取该副本
3、如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本
语义:下载一个文件
Client尝试和NameNode交互文件元数据获取fileBlockLocation
NameNode会按距离策略排序返回
Client尝试下载block并校验数据完整性
下载一个文件其实是获取文件所有的block元数据,那么子集获取某些block应该成立,HDFS支持client给出文件的offset自定义连接哪些block的DN,自定义获取数据,这个是支持计算层的分治、并行计算的核心。