在了解HDFS的文件上传的读取之前要了解几个组件的作用
NameNode,DataNode,SecondaryNameNode
NameNode
NameNode也被称之为名字节点,在HDFS的主从架构中的主角是的扮演者。它维护着整个文件系统的目录树,以及目录树里所有的文件和目录。这些信息以文件的形式存储在本地,一种是FSImage(命名空间镜像也称为文件系统镜像),即HDFS元数据的完整快照,每次NameNode启动的时候,默认会加载最新的命名空间镜像,另一种是命名空间的编辑日志文件(edit log)
SecondaryNameNode
SecondaryNameNode被称为第二名字节点,定期将命名空间镜像文件和命名空间镜像编辑日志文件合并的守护进程。由于是定期合并所以这是NameNode的“冷备”
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
DataNode
DataNode被称为数据节点,在HDFS中扮演从的角色。它在NameNode的指导下完成 I/O 任务。所有的块都存放在DataNode上。
文件的读取
- HDFS客户端首先访问NameNode,并告诉要读取的文件
- NameNode会首先确认这个客户端是否有权限,如果有权限就会告知这个文件的第一个数据块的标号以及保存该数据块的DataNode列表。这个列表是DataNode与HDFS客户端间的距离进行了排序
- HDFS客户端拿到这些数据便直接访问最合适的DataNode,读取所需要的数据块。这个过程会一直重复直到该文件的所有数据块读取完毕或者HDFS客户端主动关闭文件流
- 特殊情况:如果HDFS客户端就是集群中的DataNode时,该节点将从本地DataNode中读取数据
文件的上传
- 请求NameNode,并创建该文件的元数据,但此时的元数据并为与任何数据块相关联。
- 当客户端将数据写入流时,数据会自动拆分为数据包,并将数据包保存在内存队列中。客户端有一个独立的线程,它从队列中读取数据包,并向NameNode申请一组DataNode列表以便写入数据块的多个副本。
- HDFS客户端将直接连接到列表中的第一个DataNode,该DataNode又连接到第二个DataNode,第二个又连接到第三个,这样就建立了一个数据块的复制通道。
- 成功写入后HDFS客户端会重新向NameNode申请下一组DataNode