文件上传
文件上传过程:
- 客户端向namenode发送文件上传的请求
- namenode进行一系列的检查.权限.文件的父目录是否存在 文件是否同名,检查通过则允许上传
- 允许客户端上传
- 客户端发送真正的文件上传的请求,请求包含一个重要信息,文件的长度和大小
- namenode根据文件的长度计算文件的切块的个数,获取副本的配置信息;返回副本的节点的信息的时候原则: 就近原则 ,客户端所在节点,同机架,不同机架
- 客户端准备文件上传
- 客户端对文件进行逻辑切块(128M/块)
- 开始上传第一个数据块
- 构建第一个数据块的上传的通道 pipline (构建通道的时候,客户端启动一个阻塞过程,等待datanode的响应)
- 开始上传第一个数据块,先上传到内存中,在到磁盘中(文件上传的过程中,以packet为单位进行传输的,64k为单位进行写入)
- 第一个数据块上传成功,关闭当前的pipline
- 重复之前几步的操作
- 客户端向namenode发送反馈
文件上传过程中遇到的问题
- 构建pipline(传输通道)的过程中,某一个节点宕机了,会立即重试一次,还失败,那这个datanode就剔除pipline,重新构建pipline. 至少保证整个pipline中有一个节点存活
- 进行文件上传的过程中,只需要保证至少一个副本上传成功就认为整个数据块上传成功,其他副本可以进行集群异步复制
- 进行文件上传的过程中,优先第一个副本节点是客户端所在的节点(保证副本最大程度的可以成功上传一个,相当于本地的复制,不需要网路传输)