Hadoop基础知识二

Hadoop基础知识二

元数据:描述文件的大小,持有者,创建时间等等的信息元数据

NameNode节点主要是保存元数据单节点
(主)NameNode所维护的是单独的目录树结构和Linux下的目录没有任何关系–>有相似的地方就是目录树结构
(从)DataNode节点是保存文件Block块数据:多节点
DateNode和NameNode之间保持这一种关系–>心跳机制
ps:心跳机制是一种健康检查机制,检查当前节点是否存活也就是说节点和节点之间需要发送数据包
提交Block列表时候也就是心跳机制传递给主(NameNode)

HDFSClient:客户端程序

HDFS会和NameNode之间进行元数据信息的交互
HDFSClient会和DataNode之间进行BLock块数据的交互
这个数据交互的流程既是HDFS的读写流程

NameNode(NN)

基于内存存储的: 不会和磁盘发生交互操作只存在内存中
这样的主要目的就是为了快,但是内存存储会出现一个问题–>掉电易失,一旦断电内存中所存储的数据就什么都没有,所以就需要将数据持久化到磁盘中

NameNode数据持久化

NameNode的metaData信息启动的时候就会加载到内存

存储到磁盘中的两种方法

第一种:在某个时间点做一个备份将数据信息存储到磁盘上,metadata存储到次哦暗中,文件名–>“fsimage”,Block的位置信息不会保存到"fsimage",若需要回复,只能等待DataNode重新汇报Block信息

第二种: 以日志文件的形式保存成一个日志文件edit log 记录对metadata的所有操作信息

NameNode的主要功能:

接收客户端的读写服务,收集DataNode回报的Block列表信息,
NameNode保存metadata的信息包括: 文件的所属权,文件的权限,文件大小,时间(Block列表,Block偏移量),位置信息

DataNode(DN)

DataNode是BLock真正存储的地方,DataNode中存储的数据会以本地磁盘文件的形式存储Block块信息,同时还保存着Block块的元数据信息文件

DataNode和NameNode之间保持心跳联系,3秒一次,若超过十分钟没有联系,此时NameNode就会认为DataNode丢失

SecondaryNameNode(SNN)

SecondaryNameNode是NameNode的备份,实际上SecondaryNameNode的主要作用并不是备份,主要做使用合并数据使用;
主要是合并fsimage和edit log
SecondaryNameNode就是为了解决这个问题而生,会定时合并NameNode中的edit log和fsimage文件,从而产生一个新的fsimage文件,然后会拷贝给NameNode,这样一来HDFS在启动的时候,就不需要每次合并大量的editlog 和 fsimage
SNN执行合并时机:
在配置文件中设置时间间隔 fs.checkpoint period—>如果不设置默认是3600秒(1h)
还可以设置edit log 文件的大小 fs.checkpoint.size -->不设置默认64MB

ps: fsimage是如何产生的?

HDFS系统要开始运行的时候需要先对NameNode进行一次格式化
那么第一次格式化就会产生一个fsimage文件,但是这个文件是空文件,NameNode启动的时候会加载fsimage然后edit log 文件执行加载到内存,然后会立刻向磁盘中写入一个新的fsimage文件,这个fsimage就是一个最新的存储信息
只要NameNode不格式化或重新启动fsimage保持原始状态,edits会不断增加---->启动SecondaryNameNode完成合并

HDFS 读写流程

Block存储方式:
HDFS数据存放策略就是采用相同节点与并行机架之间存储方式,在运行客户端当前节点上存放第一个副本第二个副本,存放第一个副本同机架的节点上,第三个副本放置的位置与第二个副本放置的位置与第二个副本再通过一个机架上,而不是同一个节点

1.客户端或者用户通过调用FileSystem对象的OPen()方法打开需要读取的文件,这就是HDFS分布式系统所获取的一个对象

2.FileSystem通过远程协议调用NameNode确定文件的前几个Block的位置,对于每一个block,NameNode返回一个含有Block的元数据信息,接下来DataNode,那么就会有限从本地DataNode节点读取数据
HDFS完成上面的工作之后,此时返回一个FSDataInputStream给客户端,让其从FSDataInputStream中读取数据
FSDataInputStream包装了一个类似DFSInputStream,用来管理DataNode和NameNode的I/O操作

3.NameNode向客户端返回了一个数据信息的地址,客户端根据地址的创建一个FSDDataInputStream的对象开始进行数据的读取

4.FSDataInputStream 根据开始存的前几个Block的DataNode地址,连接到最近的DataNode上对数据开始从头读取,客户端会反复调用read()方法,以流的形式读取DataNode中的数据

5.当读取到BLock的结尾的时候,FSDataInputStream会关闭当前DataNode的连接,然后查找能否读取下一个BLock的DataNode位置信息,此时给客户端产生的感觉就是数据连续读取的,也就是说读取的时候会开始查找下一个块所在的地址

读取完成时需要使用close()方法关闭FSDataInputStream

写:

  1. Client通过调用FileSystem这个类的Create()方法,请求创建文件1.Client通过调用FileSystem这个类的Create()方法,请求创建文件

  2. FileSystem通过对NameNode发出远程请求,在NameNode里面创建一个新的文件,但是此时并不关联任何块,NameNode进行很多检查来保证不存在的要创建的文件已经在系统中了,同时检查是否有相应的选线来创建文件,如果这些都检查完了,那么NameNode会记录下这个新文件的信息
    FileSystem会返回一个FSDataInputStream给客户端用来写入数据,和读取的情形类似,FSDataInputStream将保证一个DFSOutputStream用于对DataNode和NameNode的通信,一旦文件创建失败,会给客户端返回一个IOException表示文件创建失败并停止任务

  3. 客户端开始写书FSDataInputStream把要写的数据分成包的形式,将其吸入到中间队列中,其中的数据有DataStream来读取,DataStreamer的职责就是让NameNode分配一个新的块通过查找对应的DataNode来存数据,来存储的数据会被备份出一个副本,存储到其他节点完成数据写入即可

  4. FSDataInputStream维护了一个内部冠以packets包的队列,里面存放着等待被DataNode确认的信息,一旦数据信息写入DataNode成功后就会移除队列中

  5. 当数据完成写入之后,客户端会调用close()方法,会通知NameNode完成写入之前通过一个方法flush将残留的数据一起写进去,和NameNode确定写入的位置信息并返回当前成功状态

HDFS文件系统所以存在读写权限
r —>read w—>write x—>execute
–| --|— 可以看成是一个八进制 1代表所有权限 0代表没有权限
rxw |r–| -w- -->数字的形式

伪分布式集群
搭建一个在服务器上所有角色basic上单机版本改变成伪分布式

时间同步:
在搭建完全分布式集群的时候,需要所有的集群的时间统一的,这样上传的数据才不会出现问题
1.手工修改修饰 date -s"2019-09-18"
2.使用命令 ntpdate 时间服务器
一个服务一个服务器的时间同步,耗时耗力
3.创建一个时间服务器,写一个脚本7*24,用脚本同步时间
ps: 单独一个服务器,即做本地yum源也做时间同步–>政府,军方
电脑需要安装一个软件
yum install -y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值