架构设计
一 角色名称及作用
- NameNode(简称NN)
1 HDFS元数据管理者,管理NameSpace(文件系统命名空间),记录文件是如何分割成数据块以及他们分别存储在集群中的哪些数据节点上。
2 NameSpace或其本身属性的任何更改都由NameNode记录,维护整个文件系统的文件和目录。 - DataNode(简称DN)
DataNode是文件系统的工作节点。根据客户端或者NameNode发送的管理指令,负责HDFS的数据块的读写和检索操作。
通过心跳机制定期向NameNode发送他们的存储块的列表。 - Client
客户端Client代表用户与NameNode或者DataNode交互来访问整个文件系统的对象。
开发人员面向Client API来编程实现,对NameNode、DataNode来说透明无感。
二 读流程
第一步:Client向NameNode发送数据请求后,寻找数据对应的数据块的位置信息。
第二步:NameNode返回文件对应的数据块元数据信息,如所属机器、数据块的block_id、数据块的先后顺序等。
第三步:由Client与DataNode直接通信,读取各个block数据块的信息。过程为并行读取,由客户端合并数据。
三 写流程
- List item
第一步:
Client向NameNode发送写数据请求后,寻找可以写入的数据块block信息的机器位置。
若文件过大,写入可能会分成很多block数据块,实际上是通过一个block一个block的申请。
若副本为3,则每次请求后返回一个block的对应的3个副本的block的存放位置。
第二步:
Client获取到对应的block数据块所处的DataNode节点位置后,Client开始写操作。
Client先写入第一个DataNode,以数据包package的方式逐个发送和接收。如64K大小的package包大小来发送和接收。
存在多个副本时,package包的写入是依次进行的。写入到第一个DataNode后,第一个向第二个DataNode传输。第二个写完后,由第二个向第三个DataNode传输package。以此类推。
写完一个block数据块后,如果还有则反复进行第一步和第二步。
第三步:
待所有的数据块block均写完后,Client接收到全部写完的ack答复,告诉NameNode数据已写完,Client关闭socket流。
DataNode也会向NameNode报告新增block数据块的信息。