HADOOP的概述
Hadoop:HDFS和mr
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进行元数据的合并,
从另外的角度来看可以提供一定的备份功能,但并不是热备,只在极端情况下可能用来恢复元数据,但是可能丢失数据。
何时出发数据合并?:
-
当fstime的时间达到3600秒时触发这个操作
-
当edits日志文件大小达到64M时触发这个操作
合并过程(参看文档图):
Block副本放置策略:(面试题)
第一个副本:放置在上传文件的DN,如果是集群就外提交,就随机选择一台磁盘不太满,cpu不太忙的节点
第二个副本:放置在第一个副本不同机架的节点上
第三个副本:放置在与第二个副本相同机架的节点上
更多副本:随机节点
HDFS的执行路程
block:1.切分规则128
2.最大值,不是固定值
3.存储规则:往datanode存储
NameNode:维护元数据信息
1、fsimage(数据持久化操作)
2.edits(日志文件—修改记录)
3.fstime(文件合并的时间)
文件合并
1.当fstime里的时间达到3600s
2.edits文件数据达到64M
SNN执行过程
1.Nn将日志文件复制一份产生新的日志文件 edits.new
2.snn通过http get获取原始日志文件以及磁盘文件----合并成为新的磁盘文件
3.将新的磁盘文件复制给nn
4.将旧得日志文件删除,将新的日志文件做重命名操作—edits
5.将旧的磁盘文件删除,将新的磁盘文件做重命名操作–fsimage
副本放置策略
1.就近原则
1.考略网络延迟 2.当前dn是否空闲
2.与副本1不同机架
3.副本2相同机架 不同机器
hdfs执行流程
HDFS的读流程
1.客户端向服务器端发送请求—进行数据的读取
2.nn要做两部操作:验证当前用户是否具有访问权限 校验当前要读取的数据是否存在
3.nn就会将对应的block块的存储的地址信息(对应的dn的地址信息)返回给客户端
4.客户端就会接收到nn发送来的地址信息,去找对应的dn,进行数据的读取
5.数据表读取完毕之后,释放资源(关闭客户端与服务器端的连接)
HDFS的写流程
1.客户端向服务器端发起连接请求—数据写入的请求
2.服务器接收这个请求:验证当前用户是否具有数据写入的权限 校验当前要写入的文件是否真实存在
3.服务器端为客户端返回dn的地址信息
4.接收到dn地址信息,进行文件切块的操作(128M为规则)
5.客户端就会拿着dn地址(第一个副本)信息进行block的存储
6.首先第一个副本找到对应的dn进行存储—默认3副本,dn之间同过管道流的形式进行副本的传输
7.第二、三副本就通过channel进行数据传输操作,第三个副本传输完成之后
8.依次向上一级dn发送ack信息
9.将这个ack信息发送给客户端,客户端接收信息,才会执行第二个block的存储操作
10.block全部存储完成之后,向服务器端发送信息(写入完毕)释放资源,断开连接
注意:
1.数据的传输是以namenode为基础的-----没有参与,只是单纯返回地址信息
2.文件的block块是hdfs来进行切分的----不是,是客户端进行文件的操作
3.就是一个block块是上产3次吗----在dn内部已管道流的形式进行的内部传输