Hadoop之HDFS上传下载文件、管理数据原理

一、上传文件原理(步骤)

1、客户端请求namenode上传文件数据(包括文件大小、物理块大小、副本个数等);

2、namenode接受到客户端的请求,校验权限、存储容量等信息,并分配元数据信息;

3、客户端收到namenode的OK响应,客户端就开始请求上传第一块数据;

4、namenode返回第一块数据的元数据信息给客户端;

5、客户端和返回的元数据中的三台机器建立连接通道;

6、返回OK给客户端;

7、客户端本地输入流读取待上传文件的第一块数据内容(一边读取数据一边将数据转换成分布式输出流);

8、客户端分布式输出流将字节数据封装成数据包,以此提高传输效率;

9、linux001上的分布式输入流接收来自本地的数据包,一边将数据传递给linux001本机的输出流,一边将数据发送给linux002的分布式出入流;linux002上的分布式输入流接收来自linux001的数据包,一边将数据传递给linux002本机的输出流,一边将数据发送给linux003的分布式出入流;linux003上的分布式输入流接收来自linux002的数据包,将数据传递给linux003本机的输出流;

10、linux001的本机输出流将数据写在磁盘上;linux002的本机输出流将数据写在磁盘上;linux003的本机输出流将数据写在磁盘上。

注意:1、当集群中有一个数据块存储成功,本次的上传任务就会给客户端反馈成功。

二、下载文件原理(步骤)

1、客户端向namenode发出下载文件请求;

2、namenode在接收到客户端下载数据的请求的时,将该文件的元数据信息和请求成功的信息一同返回给客户端;

3、客户端在接收到元数据信息后,会将元数据信息进行解析,然后根据元数据信息分别请求不同的datanode;

4、datanode在接受到客户端的请求后,开始执行下载任务。

三、数据存储位置特征

1、一个文件在集群中的物理块大小默认为128M,这样运算效率和传输成功率高;

2、每个物理块默认存储3个副本在不同的机器上,以此来保证数据的安全;

3、每个文件在namenode中都有元数据信息;

4、在HDFS分布式文件系统中不允许存放大量小文件;否则会对namenode产生压力,默认一个文件启动一个map程序;

5、HDFS中的数据不能被随机修改,即一次存储,多次读取;但允许追加,允许随机读

6、因为数据是被存储在不同节点上的,读取数据需要请求namenode和datanode,所以读取文件的效率并不是很高;

7、易扩展。

注意:HDFS系统管理数据时是以文件为单位进行管理的,该文件被分为几个物理块,每个物理块的基本信息以元数据信息的形式存储在namenode中;

四、namenode和datanode

namenode职责:

1、接收datanode的注册,并分配集群ID,生成datanode  uuid唯一标识,存储标识;

2、管理datanode的存储内容,分配存储、复制等任务;

3、接收客户端上传下载请求,返回元数据信息;

4、datanode定时汇报数据存储情况;

5、管理维护数据存储的元数据信息。

datanode职责:

1、真正存储数据的节点;

2、处理客户端的读写任务;

3、向namenode注册,并定时发送存储信息;

4、接收namenode的复制副本任务,并且维护集群中数据副本的个数。

namenode和datanode的通信机制:

1、namenode启动,初始化,加载元数据信息;

2、datanode启动,根据配置文件中的信息找到namenode,向namenode发送注册请求;

3、namenode返回datanode注册成功消息,并给它返回存储路径信息;

4、datanode向namenode汇报自己的整体数据存储情况;

5、datanode每隔3s向namenode发送心跳机制;

6、当namenode发现集群中的副本不够时,会将复制任务分配给datanode,datanode随着心跳机制将任务领取。

五、namenode管理元数据(checkpoint机制)

1、什么是元数据?

元数据描述了数据在HDFS集群中的存储位置。

2、数据存储在哪里?

内存、磁盘。

内存中的数据存取快,但极易丢失。

磁盘中的数据存取慢,但不容易丢失。

将内存中的数据写入磁盘叫序列化,反之叫反序列化。

3、namenode如何管理元数据?

(1)、当客户端对HDFS上的数据进行操作以后, 数据的元数据会发生变化 , NameNode可以FSImage.saveImage()修改内存对象数据 , (内存中的数据存储量有限);

(2)、为了保证宕机后数据的正确性,我们可以设计定期的将存储元数据FsImage对象序列化到磁盘上 。当用户操作数据的时候 , 会将用户的操作记录在edit日志中 ,随着时间的推移,日志数据也会越来越大 , 当宕机重启的时候会花费大量时间加载日志数据,启动时间过长 ,用户无法操作,这个时候引入secondrayname来对存储数据的元数据处理 (checkpoint机制) , 大致如下:

下载namenode 的 Fsimage000000文件(初始化文件 ,只下载一次),

下载生成好的日志文件 ,没有_inprocess的日志文件

加载镜像文件生成内存对象

加载日志文件 , 修改镜像对象

序列化镜像对象 ,

将镜像对象上传到namenode中

清理nameNode 上没用的日志数据和序列化的镜像文件

定期下载日志文件 , 合并镜像对象 , 上传到namenode上

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值