客户端向HDFS读写数据机制

1、HDFS集群角色介绍
1.HDFS集群分为两大角色:NameNode、DataNode (Secondary Namenode)
2.NameNode负责管理整个文件系统的元数据
3.DataNode 负责管理用户的文件数据块
4.文件会按照固定的大小(blocksize,2.x以后默认是128M)切成若干块后分布式存储在若干台datanode上
5.每一个文件块可以有多个副本,并存放在不同的datanode上
6.Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量。
7.HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行。

2、客户端向HDFS写数据流程分析
假如这里有个300M的文件,需要将它上传到hdfs上
示意图:
客户端向HDFS读写数据机制_第1张图片

步骤:
1、使用客户端命令行进行上传操作时,hadoop fs -put cls.avi /aaa/cls.avi。首先客户端会向集群中的namenode请求上传文件到/aaa/cls.avi,此时namenode会查看/aaa文件夹是否存在,存在的话那么/aaa/cls.avi是否存在,如果不存在的话。那么会向客户端应答可以进行上传。
2、由于文件是300M,而默认切片为128M,所以需要分成三个block进行依次进行上传,首先上传第一个block,当然还是要向namenode请求该block(三个Replication,副本,多少个副本自己可以配,默认是3个)传到哪里去,namenode会根据一定的规则返回三个上传的datanode(哪些因素大致在图种列出),告诉客户端需要将第一个block传到这三个datanode上。
3、接着客户端就与datanode1建立连接通道,datanode1接着与datanode3,datanode3与datanode4建立连接通道(本质上就是rpc调用形成pipeline),通道建立完毕后datanode1会向客户端作出应答,告诉客户端,可以上传数据了。
4、客户端得知可以上传数据了,此时客户端以packet为单位向datanode1进行上传,数据并不是直接传到datanode1然后datanode1再向其他datanode传,这样效率太慢。而且将传的数据放到datanode1的一个缓冲区,再缓冲区同时向其他datanode缓冲区传,缓冲区再写到磁盘。
5、在传的过程中,会进行校验,校验失败传输失败,但是只要有一个datanode传输成功,那么就传输成功了,最后namenode会判断成功的数量与备份要求的是否一致,不一致的话则会对数据进行同步使得一致。
6、第一个block传完了以后,会再重新与namenode,datanode建立连接进行传输,每传一次都会与namenode进行连接。

3、客户端从HDFS读数据流程分析
这里就来读刚上传的cls.avi
流程图:
客户端向HDFS读写数据机制_第2张图片

步骤:
1、使用命令 hadoop fs -get /aaa/cls.avi进行下载,首先客户端与namenode建立连接,请求要下载的文件,namenode会根据请求找到该文件被切的块所存放的datanode,比如block1存放在datanode1,datanode3,datanode4;block2存放在datanode1,datanode2,datanode3等。其中block1,block2,block3刚好拼成一个完整的cls.avi。客户端拿到namenode返回的block存放的信息。
2、首先下载block1,而block在三个datanode上都有,根据就近原则去挑选一个datanod(比如datanode1)e建立连接请求读取数据,datanode就开始向客户端发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)。
3、客户端将读取到的数据放入缓存,接着重复1、2来下载block2和block3,下载的数据都会往后追加,最后写入到文件cls.avi中。(或者是下完一个block就从缓存写入到文件后面的block2,block3接着追加)。

你可能感兴趣的:(hadoop)