一、上传文件原理(步骤)
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上