### 2.6 HDFS读写流程

通过漫画理解hdfs读写流程：

写数据流程：

![](img/hdfs_read_write/a.jpg)

每个元素的职责：

client：客户端发起读写请求

NameNode：只有一个，我维护整个环境

DataNode：负责存储数据，可以有上千个

写数据流程（part1）：

需求：想要发送200MB数据

客户端处理数据2要素：

1，客户端需要把文件拆成128M的数据块

2，每一个block存储在多个位置

![](img/hdfs_read_write/b.jpg)

1，bolck操作是按照顺序的

2，按照副本数量和副本位置将数据块存储到DataNode上

3，第一个数据负责上传，对饮的DataNode会自动复制到其他DataNode上

![](img/hdfs_read_write/c.jpg)

副本通道：副本之间互相拷贝数据

每个DataNode拷贝完成后会上传到NameNode

第一个数据块写完后，后续数据块和上述内容一致

写完所有数据块后，关闭写入数据

客户端：负责拆分数据

NameNode：对于每一个bock分配地址

DataNode：通过副本通道保存数据

![](img/hdfs_read_write/d.jpg)

读数据：

向NameNode请求数据的存储的数据块个数及其存储位置信息，获取后向对应的NameNode拿数据

![](img/hdfs_read_write/e.jpg)

![](img/hdfs_read_write/g.jpg)

常见错误及其解决方案：

节点问题：DataNode通过心跳机制向NameNode发送数据

网络错误：block report，通过Checksum来检查数据完整性

![](img/hdfs_read_write/h.jpg)

写错误：DataNode向Client返回ACK

读错误：读数据没有响应自动跳到其他的副本节点

![](img/hdfs_read_write/i.jpg)

NameNode：维护和更新两张表

1，List of Blocks

2，List of Datanodes

DataNode错误：

1，当block出现问题，更新表1

2，当DataNode出现问题，更新表1，2

NameNode通过表一查询，对于没有完全完成副本拷贝的block标记为“under replicated”的block

![](img/hdfs_read_write/j.jpg)

三副本放置策略：

第一个副本是随机放置

第二三个副本放置在别的机架的不同节点上

支持自定义放置策略

![](img/hdfs_read_write/k.jpg)
