1 HDFS的运行机制
HDFS集群中的节点分为两种角色,一种角色负责管理整个集群的元数据,是名称节点(name node);另一种角色负责存储文件数据块和管理文件数据块,是数据节点(datanode)。
1.1 NameNode
1.1.1名称节点负责响应客户端的请求,负责管理整个文件系统的元数据。
1.1.2HDFS的内部工作机制对客户端是透明的,客户端对HDFS的读、写操作都必须先向name node申请。所以元数据是关键。
1.1.3负责维持文件的副本数量
1.1.4 为了保证集群的元数据不丢失,生产环境下需要配置辅助名称节点(secondary name node,简称2NN),目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间,万一name node的元数据丢失就可以从2NN恢复元数据。
1.1.5 名称节点可用的前提是此节点运行名为“NameNode”的进程。
1.2 数据节点Data Node
1.2.1 负责存放被切割后的文件块。文件在data node的存储单位是块(block)。
1.2.2 如果hadoop集群是完全分布式模式,那么一个文件的每一个块必须有多个副本,存放在不同的datanode上。当客户端把某个文件写入HDFS时,首先按照固定的块大小(block size)把该文件切成若干个块,再分布式地存储在若干台data node上。
1.2.3 data node通过心跳信息定期地向name node汇报自身保存的文件块信息。
1.2.4 数据节点可用的前提是此节点运行名为“DataNode”的进程。
下面介绍一下客户端向HDFS写数据和读数据的流程,hadoop集群规模以“1台namenode + 3台data node”为例。
1.3 客户端向HDFS写数据的流程
1.3.1 客户端和name node通信,name node检查目标文件是否已存在,父目录是否存在,检查通过以后name node通知客户端可以写入
1.3.2 客户端向name node请求上传文件的第一个块(block1),询问name node应该把block1上传到哪些data node主机上。客户端每传一个block都要向name node请求
1.3.3 name node把3台data node服务器信息返回给客户端。基于可靠性的考虑,每个文件块都有副本,每个副本分别存放在不同的data node服务器上。副本存放的data node选择策略:首选在本地机架的一个节点上存放副本, 第二个副本在本地机架的另一个不同节点,第三个副本在不同机架的不同节点上
1.3.4 正式上传之前,客户端请求与3台中的其中一台(dn1)建立传输通道,dn1又和dn2主机建立传输通道,dn2又和dn3建立传输通道
1.3.5整个传输通道建立完成后,客户端把block1从磁盘读出来放到本地缓存, 开始向dn1上传block1,上传时以package为单位进行传输,package默认大小64kb。dn1每收到一个package就会复制一份传给dn2,dn2再复制一份传给dn3。
1.3.6 当block1传输完成后,客户端再次向name node申请上传此文件的第二个块block2