hadoop-hdfs简介(二)

来源:互联网 发布:如何做erp软件 编辑:程序博客网 时间:2024/06/06 10:40

1.HDFS 体系架构

1) HDFS 是一个主/从(Master/Slave)体系架构,由于分布式存储的性质,集群拥有两类节点 NameNode 和 DataNode。

2)NameNode(名字节点):系统中通常只有一个,中心服务器的角色,管理存储和检索多个 DataNode 的实际数据所需的所有元数据。

3)DataNode(数据节点):系统中通常有多个,是文件系统中真正存储数据的地方,在NameNode 统一调度下进行数据块的创建、删除和复制。


2.HDFS 数据块复制

1)为了系统容错,文件系统会对所有数据块进行副本复制多份,Hadoop 是默认 3 副本管理。

2)复本管理策略是运行客户端节点上放一个复本(若客户端运行在集群之外,会随机选择一个节点),

第二个复本会放在与第一个不同且随机选择的节点上,

第三个复本与第二个复本放在相同节点。

存在其他复本,则放在集群中随机选择的节点上,不过系统会尽量避免在相同机架上放太多复本。

3)所有有关块复制的决策统一由NameNode负责,NameNode会周期性地接受集群中数据节点 DataNode 的心跳和块报告。

一个心跳的到达表示这个数据节点是正常的。一个块报告包括该数据节点上所有块的列表。


3.HDFS 读取和写入流程

1) 读文件的过程:

首先 客服端通过 File System 的 Open 函数打开文件,

DistributedFile System 用RPC 调用 NameNode 节点,得到文件的数据块信息。

对于每一个数据块,NameNode节点返回保存数据块的数据节点的地址。

DistributedFile System 返回FSDataInputStream 给客户端,用来读取数据。

客户端调用 stream 的 read()函数开始读取数据。

DFSInputStream 连接保存此文件第一个数据块的最近的数据节点。

DataNode从数据节点读到客户端(client),当此数据块读取完毕时,DFSInputStream 关闭和此数据节点的连接,

然后连接此文件下一个数据块的最近的数据节点。

当客户端读取完毕数据的时候,调用 FSDataInputStream 的 close 函数。

在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。


2) 写文件的过程:

客户端调用 create()来创建文件,Distributed File System 用 RPC调用 NameNode节点,在文件系统的命名空间中创建一个新的文件。

NameNode节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

Distributed File System返回DFSOutputStream,客户端用于写数据。

客户端开始写入数据,DFSOutputStream 将数据分成块,写入 Data Queue。

Data Queue 由 DataStreamer 读取,并通知 NameNode节点分配数据节点,用来存储数据块(每块默认复制 3块)。

分配的数据节点放在一个 Pipeline里。Data Streamer 将数据块写入Pipeline中的第一个数据节点。

第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

DFSOutputStream为发出去的数据块保存了Ack Queue,等待Pipeline中的数据节点告知数据已经写入成功。