先从HDFS1.0开始说起吧
HDFS1.0由三部分组成,分别是NameNode,SecondaryNameNode,DataNode,如图所示
下面针对几个组件详细讲解一下
NameNode
1.管理着文件系统命名空间,维护着文件系统树及树中的所有文件和目录
2.存在于主节点上,存储一些元数据信息
1)元数据存储在内存中,目的是为了快速响应请求,提高性能,但是也有一定的风险:关机重启时,数据丢失
2)既然数据有丢失风险,那么肯定要做好一定的防范措施,Hadoop1.0采取持久化的方式(fsimage)进行规避,在NameNode中存放元信息的文件是 fsimage。在系统运行期间所有对元信息的操作都保存在内存中并被持久化到另一个文件edits中。并且edits文件和fsimage文件会被SecondaryNameNode周期性的合并,也就是说:
a)fsimage是元数据的镜像文件
b) 持久化的过程是由SNN模块完成的,备份的过程是从内存 -> edit logs(磁盘上) -> fsimage,恢复是反向的过程
c) NameNode和edit logs的关系
1)NameNode需要把每一次改动都存在edit log中,整个过程Datanode与Namenode之间的心跳机制主动推进的
2)edit在NameNode节点上,edit的信息都是来自于当前机器的内存信息(NameNode的元数据)
3.数据映射关系
1)已知路径path(HDFS上的)-> blockid list列表
2)blockid数据块 -> dataNode节点地址
这样子来个文件名就知道被哪些机器(dataNode)存储
4.版本问题
1) NameNode只有一个,所以有单点故障的风险。(1.0的时候还没有一个比较好的集群方案,比如没有zookeeper)
2)不适合存储太多小文件,小文件会导致block太多,内存可能会放不下
3)适合存储大文件,但是如果是大压缩文件对后续的MapReduce的处理无法分片
SecondNamenode
1.SecondNameNode并不是NameNode的备份,用来保存HDFS的元数据信息,比如命名空间信息、块信息等,由于这些信息是在内存的,SecondNameNode是为了考虑持久化到磁盘。SNN存在的意义就是:备份,恢复数据
2.SNN下有两个文件:
1)fsimage:在NameNode启动时对整个文件系统的快照
2)edit logs:在NameNode启动后,对文件系统的改动序列
3.流程解析
1)定时到NameNode去获取edit logs,并更新到fsimage(SecondNamenode自己的fsimage)
2)一旦有了新的fsimage,将其拷贝会NameNode中
3)NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间
DataNode
1.负责存储数据块,负责为系统客户端提供数据块的读写服务。根据NameNode的指示进行创建、删除和复制等操作。心跳机制,定期报告文件块列表信息。DataNode之间进行通信,块的副本处理
2.数据映射关系:block数据块-->真实数据
3.机制和原则
1)心跳机制
a)定期报告文件块列表信息
b) 默认3秒心跳一次
2) 副本机制
a) 默认3个副本
b) 作用:用数据冗余做到数据高可用的目的,利用空间换取高可用
c) 数据高可用:保证用户请求都能访问到数据,A服务挂掉还有BC服务可用
3) 本地化原则(就近原则):避免远程拷贝数据访问带来的性能影响
4.数据块(磁盘读写的基本单位)
1)HDFS1.0默认数据块大小64MB
2) 磁盘块一般为512B
3) 原因:块增大可以减少寻址时间,降低寻址时间/文件传输时间,若寻址时间为10ms,磁盘传输速率为100MB/s,那么该比例仅为1%
4)数据块过大也不好,因为一个MapReduce通常为一个块作为输入,块过大会导致整体任务数量过小,降低作业处理速度
HDFS的可靠性
1.数据校验
1)目的:保证数据的完整性(通过crc32校验算法,循环冗余校验码)
2)在整个数据传输过程中,数据校验的流程
a) client给DataNode写数据时候,由client完成,要针对所写的数据,每个检查单位(512字节),创建一个单独校验码(crc32),将数据和校验码一起发送给DataNode
b)DataNode接收数据的时候:用同样加密算法生成校验码,并与接收到的校验码进行校验
3)在后台有个扫描进程->DataBlockScanner,一但检查出有问题的Block,通过心跳机制,通知NN,于是NN让DN进行修复(拷贝一个无问题的备份(Block))
简单举个例子
client --> datanode --> block里面,默认512字节创建一个校验码
===| ===| ===| ===| ===|
假设三个等号创建一个字节码,从前往后传输数据,接收一部分校验一部分,客户端和datanode以相同的方式对数据加密之后比较,相同时写入到block里面,不同则直接舍弃。数据坏了,在心跳阶段,namenode就会收到来自block的一个修复命令(dataNode接收namenode发送的一个block,从其他数据块中接收数据来修复)
datanode --> client
===| ===| ===| ===| ===| (校验码没那么及时,是记录上一次的校验码),如果验证通过,需要更新时间(验证码是有时间限制的)
2.可靠性保证机制
1)心跳机制
2)多副本机制
3)机架感知策略
4)crc32数据校验
5)SNN-->数据备份,数据恢复,保证元数据避免丢失
6)回收站(.Trash目录),可通过配置文件配置文件的停留时间,超过时间删除
7)报告-->hdfs fsck /文件名 -files -blocks -locations
8) 快照-->备份,有助于快速还原
HDFS特点
上面讲了很多理论性的东西,下面我们来谈谈HDFS到底能做些什么,又不适合做些什么
1.能做什么
a)存储并管理大数据
b)处理非结构化的数据
c)注重数据处理的吞吐量(延迟不敏感)
d)应用模式:write-once read-many(少写多读,避免数据不一致的问题)
write-once:多人访问,写会造成阻塞,影响访问互斥
read-many:依赖多副本机制,均摊访问压力
2.不适合做什么
a)存储小文件(不建议):一般来说,一条元信息记录会占用200byte内存空间。假设块大小为64MB,备份数量是3 ,那么一个1GB大小的文件将占用16*3=48个文件块。如果现在有1000个1MB大小的文件,则会占用1000*3=3000个文件块(多个文件不能放到一个块中)。我们可以发现,如果文件越小,存储同等大小文件所需要的元信息就越多,所以Hadoop更喜欢大文件
b)大量随机读(不建议),原因是无法被系统做大量寻址方面的优化,正常读取有预读机制
c)修改文件(不支持)
d)多用户写入(不支持)