Hadoop-HDFS读写流程
简介:
HDFS是基于谷歌的"GFS"论文的开源实现的一个分布式文件系统。
优点:
- 适合存储大量数据。
- 可以运行在廉价计算机上。
- 易扩展、高容错。
缺点:
- 不支持修改,只能追加。
- 小文件过多会降低性能,会导致内存中的元数据量增多,会对mapReduce计算造成影响。
- 一个文件同一时间只能一个客户端操作。
NameNode:
- 管理文件元数据,并将元数据保存在内存中,以便对外提供更快速的服务。
- 通过专门的持久化机制保证数据的安全。
DataNode:
- 负责存储数据,文件会按照特定大小切分成多个Block,DataNode就负责存储这些Block和它们的副本。
- 定期与NameNode保持心跳,以及向NameNode汇报自己的Block信息。
一、写流程
- 客户端向nameNode申请写入文件。
- nameNode校验地址是否有效、以及客户端权限等,如果允许上传,会给客户端发送响应。
- 客户端收到nameNode的响应后,开始准备上传文件,按128M的大小将文件切分成若干个block块,先去询问nameNode第一个block块放哪几台dataNode。
- nameNode收到上传请求后,会返回三台可用的dataNode节点信息。
- 客户端收到dataNode的节点信息后,会与最近的一台dataNode建立pipeline连接。
- 第一台dataNode会继续与下一台dataNode建立连接,下一台再与下一台建立连接,整个传输通道连接建立完毕后会依次返回客户端。
- 客户端将第一个block发送到第一台dataNode,并以packet(64kb)为基本单位发送。
- dataNode在收到packet后,会按照516B为一个chunk进行数据校验,其中512B是数据,4B是校验位。
- dataNode1每收到一个packet后本地保存,然后转发给dataNode2并开始接收下一个packet,dataNode2接收完毕后再转发给dataNode3。
- 当一个block块传输完毕后,dataNode会给客户端发送响应,同时各个DataNode分别向nameNode汇报自己的block,然后客户端开始上传下一个block,重复3~9过程。
- 客户端收到所有block上传完毕后,客户端断开连接,通知NameNode文件上传完毕。
二、读流程
- 客户端向NameNode发送读请求,获取文件的元数据。
- NameNode将文件的所有block块所在的DataNode以列表形式返回客户端,并按距离排序。
- 客户端就近挑选一台DataNode建立输入流。
- 客户端同样以packet为基本单位来接收并校验。
- 客户端将下载的所有block块先缓存在本地,然后再写入到最终文件。
- 户端同样以packet为基本单位来接收并校验。
- 客户端将下载的所有block块先缓存在本地,然后再写入到最终文件。
- 传输完成后关闭输入流。
如果觉得文章对你有帮助的话,可以微信关注我的公众号:码农小诚
关注我的公众号更多技术文章分享,与你共同成长,回复【555】还有55本java技术书籍,免费送