HDFS 副本摆放策略
不同的版本副本摆放策略可能并不一致, HDFS 主要采用一种机架感知 (Rack-ware) 的机制来实现摆放策略.
由于不同的机架上节点间通信要通过交换机(switches), 同一机架上的通信带宽要优于不同机架.
HDFS 默认采用 3 副本策略(参考 2.9.1 & 3.2.1):
1. 若操作的机器 (writer) 为一个 DataNode, 则将一个副本放在该机器上, 否则任选一个 DataNode;
2. 将第二个副本放在与第一个不同的机架上;
3. 第三个副本放置在与第二个同一机架但不同的节点上.
机架故障的可能性远小于节点故障的可能性.
如果复制因子大于 3, 则在确定每个机架的副本数量低于上限 (基本上是(副本 - 1)/ 机架 + 2) 的同时, 随机确定第 4 个及以下副本的位置.
由于 NameNode 并不允许同一 DataNode 存放多于一个副本, 因此副本数不能超过 DataNode 数.
HDFS 写数据流程
1. client 发起文件上传请求, 通过 RPC 与 NameNode 建立通信连接;
2. NameNode 检查目标文件是否已存在等, 是否可以上传;
2. client 向 NameNode 请求写入第一个 block 位置;
4. NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配, 返回可用的 DataNode 的地址告知 client 如: DN1,DN2,DN3;
5. client 请求 3 台 DataNode 中的一台 DN1 上传数据(本质上是一个 RPC 调用, 建立 pipeline),DN1 收到请求会继续调用 DN2, 然后 DN2 调用 DN3, 将整个 pipeline 建立完成, 后逐级返回 client;
6. client 开始往 DN1 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存), 以 packet 为单位(默认 64K),DN1 收到一个 packet 就会传给 DN2,DN2 传给 DN3;N1 每传一个 packet 会放入一个应答队列等待应答.
7. 数据被分割成一个个 packet 数据包在 pipeline 上依次传输, 在 pipeline 反方向上, 逐个发送 ack(命令正确应答), 最终由 pipeline 中第一个 DataNode 节点 DN1 将 pipelineack 发送给 client;
8. 当一个 block 传输完成之后, client 再次请求 NameNode 上传第二个 block 到服务器.
HDFS 元数据(metadata)
元数据即数据的数据, 是维护 HDFS 中的文件和目录所需要的信息. 用于描述和组织具体的文件内容. 元数据的可用性直接决定了 HDFS 的可用性.
形式上分为内存元数据和元数据文件两类, 其中 NameNode 在内存中维护整个文件系统的元数据镜像, 用于 HDFS 的管理; 元数据文件则用于持久化存储.
元数据上保存信息分为以下三类:
文件与目录自身的属性信息, 如文件名, 目录名, 文件大小, 创建时间等;
文件内容存储的相关信息, 如分块情况, 副本个数, 副本存放位置等;
HDFS 所有 DataNodes 的信息, 用于 DataNodes 管理.
从来源上讲, 元数据主要来源于 NameNode 磁盘上的元数据文件 (它包括元数据镜像 fsimage 和元数据操作日志 edits 两个文件) 以及各个 DataNode 的上报信息
来源: http://www.bubuko.com/infodetail-3438232.html