- HDFS的概述
HDFS是Hadoop分布式文件系统,用来分布式存储海量数据,并具有高可靠 高性能 可伸缩的能力。
hdfs屏蔽了分布式存储的细节,提供了标准的访问方式,能够以类似访问本地文件系统的方式访问hdfs中的文件。
可以通过shell 或 javaapi方式操作hdfs中的数据。
- HDFS技术细节
分布式存储系统
HDFS的主要原理,是将数据进行切块后进行复制并分布式存储在集群的多个节点中,从而实现了海量数据分布式存储,并通过副本实现了可靠性保证。
其中切出的块称为Block。
负责存放Block的节点称之为DataNode节点。
负责存放元数据的节点称之为NameNode节点。
另外还有一个独立进程称作SecondaryNameNode负责帮助NameNode进行元数据的合并操作
Block 块—文件切块 - 知识点:
1.文件块的切分规则 2.存储规则(往datanode存储)3.128M不是文件块的固定大小,只是最大值
HDFS中存储的基本单位。
当文件被存储到hdfs的过程中,会先将文件按照指定大小来切块即block,复制出指定数量的副本(默认是3个),分布式存储在集群中(存储在不同的datanode里)
Hadoop 1.0的时候默认大小Block是64MB
Block 默认的大小为128MB
如果切分过后,剩余数据不够128MB,则会将剩余数据单独作为一个Block存储(剩多少块的大小就是到少),数据多大,Block就多大,Block块的数量就越多,
注意:128MB只是最大大小,不是固定大小。
例如,一个256MB文件,共有256/128=2个Block.
一个258MB文件,共有258/128 = 2 余下2MB,则余下的2MB会独占一个Block大小为2MB,则且分出 两个128MB的Block和一个2MB的Block
一个1MB文件,则单独占用一个Block,这个Block为1MB大小。
将文件切块有如下几个目的:
1.一个大文件切分为小的若干个Block方便分布式的存储在不同磁盘中
2.屏蔽了数据的区别,只需要面向Block操作,从而简化存储系统。
3.有利于数据的复制。每次复制的是一个体积较小的Block,而不是一个大型文件,效率更高。
- NameNode
存储元数据信息(不是文件数据)
客户获取文件块信息首先通过nn去找对应的dn
NameNode维护着HDFS中的元数据信息(不是文件数据),包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息,数据格式参照如下:
FileName replicas block-Ids id2host
存储规则:例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
NameNode中的元数据信息存储在内存/文件中,内存中为实时信息,文件中为数据镜像作为持久化存储使用。
其中内存中的信息包括 文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息
而文件中的信息包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息
可以发现文件中的元数据比起内存中缺失了 blockid和datanode之间的对应关系,这是因为,hdfs集群经常发生变动,datanode变多或变少都是很正常的,因此这些信息都是临时在内存中组织的,而不会存储在磁盘镜像文件中
文件包括:(磁盘文件信息)
fsimage 元数据镜像文件(磁盘文件)。存储某NameNode元数据信息,并不是实时同步内存中的数据。
edits 操作日志文件
fstime 保存最近一次checkpoit的时间
触发文件文件合并的前提条件:
1.当fstime时间达到3600s触发问价合并
2.当日志文件(edits)达到64MB时触发文件合并
热备份:snn不是nn的热备(实时备份)
snn具备一定的数据的备份能力----但是数据的完整性不能保证
能不能将snn和nn放到一台机器上(是可以的)但是工作环境不建议,为了性能的提升
当有写请求时,NameNode会首先写editlog到磁盘edits文件中,成功后才会修改内存,并向客户端返回
所以,fsimage中的数据并不是实时的数据,而是在达到条件时要和edits文件合并,合并过程需要SNN参与
**之所以不直接改fsimage而是要在edits中记录日志,是因为记录日志是一种连续读写操作,比直接改fsimage的随机读写操作效率要高的多。
- DataNode
数据以Block的形式存放在DataNode中
DataNode节点会不断向NameNode节点发送心跳报告保持与其联系
在心跳报告中,向NameNode报告信息,从心跳响应中接受NameNode的指令,执行对块的复制 移动 删除等操作。
NameNode如果10分钟都没收到dn的心跳,则认为该DataNode已经lost,并copy其上的block到其他dn
SecondaryNameNode
SecondaryNameNode并不是NameNode的热备份,而是协助者帮助NameNode进行元数据的合并,
从另外的角度来看可以提供一定的备份功能,但并不是热备,只在极端情况下可能用来恢复元数据,但是可能丢失数据。
何时出发数据合并?:
1.当fstime的时间达到3600秒时触发这个操作
2.当edits日志文件大小达到64M时触发这个操作
合并过程(参看文档图):
- Block副本放置策略:(面试题)
第一个副本:放置在上传文件的DN,如果是集群就外提交,就随机选择一台磁盘不太满,cpu不太忙的节点
第二个副本:放置在第一个副本不同机架的节点上
第三个副本:放置在与第二个副本相同机架的节点上
更多副本:随机节点