1、namenode职责:
1.1、管理各个datanode节点
1.2、管理分布式文件系统的元数据信息
比如 一个文件多大,文件名,文件被切成几块,每个文件块存到哪台datanode服务上
1.3、通过RPC心跳机制来监控datanode的状态。对于网络通信,http主外,rpc主内
1.4、为了确保数据存储的可靠性,采用冗余机制来实现,注意:副本数量不宜过多,因为会降低整个集群的磁盘利用率,一般采用3副本策略,
2、hdfs读写过程
2.1从HDFS上下载文件过程
①、Client向namenode发起Open file请求。目的是获取指定文件的输入流。
namenode收入请求之后,会检查路径 的合法性,此外,还会检查客户端的操作权限。如果检测未通过,则直接报错返回,后续过程不会发生
②、Client也会向namenode发起GetBlockLocation请求,获取指定文件的元数据信息。如果第一步的检测通过,namenode会将元数据信息封装到输入流里,返回给客户端。
③、客户端根据元数据信息,直接去对应的datanode读取文件块,然后下载到本地(或创建 本地的输出流,然后做流的对接)
④、读完后,关流
2.2 往HDFS上写文件过程
①、Client向namenode发起Create File请求,目的是获取HDFS文件的输出流,namenode收到请求后,会检测路径 的合法性和权限,如果检测未通过,直接报错返回。
如果通过检测,namenode会将文件的切块信息(比如文件被切成几块,每个文件块的副本存在哪台datanode上),然后把这些信息封装到输出流里,返回给客户端。
所以注意:文件块的输出(上传)是客户端直接和对应datanode交互的,namenode的作用是告诉Client文件块要发送给哪个datanode上。
②、Client通过输出流,发送文件块(底层会将一个文件块打散成一个一个的packet,每个packet的大小为64kb)。这个过程的机制,叫Pipeline(数据流管理机制), 这种机制的目的在于充分利用每台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延时
③、通过数据流管道机制,实现数据的发送和副本的复制。每台datanode服务器收到数据之后,会向上流反馈ack确认机制,直到第五步的ack发送给Client之后,再发送下一个packet。依次循环,直到所有数据都复制完成。此外,在底层传输的过程中,会用到全双工通信。
④、数据上传完成之后,关流
2.3 从HDFS上删除文件的流程
①、客户端赂namenode发现删除文件指令,比如:hadoop fs -rm /park01/1.txt
②、namenode收到请求后,会检查路径 的合法性及权限
③、如果检测通过,会将对应的文件从元数据中删除。(注意:此时这个文件并没有真正从集群上被删除)
④、每台datanode会定期向namenode发送心跳,会领取删除的指令,批到对应的文件块,进行文件块的删除