1. 响应所有客户端的请求
2.维护整个文件系统元数据(目录树,文件快的对应信息)
3.管理众多datanode
hadoop fs -put 1.txt /aaa(shell客户端上传文件流程,写数据)
1. shell客户端请求(RPC)namenode上传文件,namenode检查datanode的节点健康状况和磁盘使用情况
2. namenode自我检测元数据中是否存在datanode,客户端将分块的文件上传到namenode,namenode(元数据和datanode信息池)根据请求找出3台可用的datanode地址(默认3副本策略)
a. 如果客户端那台机器上就有datanode,且健康有空间,则第一份就放在那台机器上
b. 第二份放在同一台机架的不同机器上, 因为距离最近
c. 第三份则最忌放在其他机器上
3. 信息池返回给客户端3台可用的datanode地址
4. shell客户端请求建立传输数据的pipeline(管道),用于连接datanode存储数据,之后shell客户端以packet(包的大小为64k)的形式一个一个的发送到datanode的指定目录下保存,并且把包继续往其他datanode服务器分发并保存
5. 在pipeline(管道)的反方向逐个校验数据包,逐个发送ack(命令正确应答)
6. 当所有的block都上传完毕,通知namenode建立数据结构,并记录下来
注: pipeline只要有一块上传写成功,就认为这个块是写成功的,缺少的那块由namenode根据datanode信息池找其他副本来进行赋值,只要最终集群上你上传的文件块数==你设置的副本数即可满足需求
HDFS读数据流程(hadoop fs -get /aaa/1.txt)
1. shell客户端请求namenode下载文件
2. namenode根据请求并结合元数据,将数据列表(坐标)返回给客户端
注:namenode返回给客户端的block所在的集群列表是排好序的
3. shell客户端连接datanode请求下载(读取)1.txt,当该文件的所有block都读取到客户端本地,按照block的顺序追加拼接成文件最终的样子
注: namenode与datanode通过心跳机制进行通信, 用于监视datanode是否活着
MapReduce 分而治之 先分再合
Map: 负责分
Reduce: 负责合 把map的数据聚合
MapReduce处理数据形式都是采用