HDFS原理(超详解)

简介

HDFS(Hadoop Distributed File System )Hadoop 分布式文件系统。是根据 google 发 表的论文翻版的。论文为 GFS(Google File System)Google 文件系统。

HDFS 有很多特点:

① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存 3 份。

② 运行在廉价的机器上。

③ 适合大数据的处理。多大?多小?HDFS 默认会将文件分割成 block,64M 为 1 个 block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中(namenode)。 如果小文件太多,那内存的负担会很重。

HDFS原理(超详解)_第1张图片

如上图所示,HDFS 也是按照 Master 和 Slave 的结构。分 NameNode、 SecondaryNameNode、DataNode 这几个角色。

NameNode:是 Master 节点,是管理者。管理数据块映射;处理客户端的读写请求;配 置副本策略;管理 HDFS 的名称空间;

NameNode 保存的 metadata 包括

文件 ownership 和 permission

文件包含的 block 信息

Block 保存在那些 DataNode 节点上(这部分数据并非保存在 NameNode 磁 盘上的,它是在 DataNode 启动时上报给 NameNode 的,Name 接收到之后 将这些信息保存在内存中)

NameNode 的 metadata 信息在 NameNode 启动后加载到内存中

Metadata 存储到磁盘上的文件名称为 fsimage

Block 的位置信息不会保存在 fsimage 中

Edits 文件记录了客户端操作 fsimage 的日志,对文件的增删改等。

用户对 fsimage 的操作不会直接更新到 fsimage 中去,而是记录在 edits 中

SecondaryNameNode:分担 namenode 的工作量;是 NameNode 的冷备份;合并 fsimage 和 fsedits 然后再发给 namenode。

     合并fsimage和fsedits文件,然后发送并替换NameNode的fsimage文件, 同时自己留下一个副本。这个副本可供 NameNode 毁灭之后的部分文件恢复。

  1. 可以通过配置 fs.checkpoint.period 修改合并间隔时间,默认 1 小时
  2. 也可以通过配置 edits 日志文件的大小,fs.checkpoint.size 规定 edits 文 件的最大值,来让 SecondaryNameNode 来知道什么时候该进行合并操作了。 默认是 64M

合并过程如下:

HDFS原理(超详解)_第2张图片

DataNode:Slave 节点,奴隶,干活的。负责存储 client 发来的数据块 block;执行数据 块的读写操作。

热备份:b 是 a 的热备份,如果 a 坏掉。那么 b 马上运行代替 a 的工作。

冷备份:b 是 a 的冷备份,如果 a 坏掉。那么 b 不能马上代替 a 工作。但是 b 上存储 a 的 一些信息,减少 a 坏掉之后的损失。

fsimage:元数据镜像文件(文件系统的目录树。)

edits:元数据的操作日志(针对文件系统做的修改操作记录)

namenode 内存中存储的是=fsimage+edits。

SecondaryNameNode 负责定时默认 1 小时,从 namenode 上,获取 fsimage 和 edits 来 进行合并,然后再发送给 namenode。减少 namenode 的工作量。

HDFS 优点

高容错性

数据自动保存多个副本

副本丢失后,自动回复

适合批处理

移动的计算和操作

数据位置暴漏给计算框架

适合大数据处理

GB、TB、PB 甚至更大

百万规模以上的文件数量

10K+节点

可构建在廉价的机器上

通过副本提高可靠性

提供了容错和恢复机制

HDFS 缺点

低延迟数据访问

毫秒级读取

低延迟与高吞吐量

小文件存取

占用 NameNode 内存空间

寻址时间超过读取时间

并发写入、文件随即修改

一个文件同时只能由一个写入者

仅支持 append

 

工作原理

写操作:

HDFS原理(超详解)_第3张图片

HDFS原理(超详解)_第4张图片

有一个文件 FileA,100M 大小。Client 将 FileA 写入到 HDFS 上。

HDFS 按默认配置。

HDFS 分布在三个机架上 Rack1,Rack2,Rack3。

a. Client 将 FileA 按 64M 分块。分成两块,block1 和 Block2;

b. Client 向 nameNode 发送写数据请求,如图蓝色虚线①------>。

c. NameNode 节点,记录 block 信息。并返回可用的 DataNode,如粉色虚线②------->。

Block1: host2,host1,host3

Block2: host7,host8,host4

原理:

NameNode 具有 RackAware 机架感知功能,这个可以配置。

若 client 为 DataNode 节点,那存储 block 时,规则为:副本 1,同 client 的节点上; 副本 2,不同机架节点上;副本 3,同第二个副本机架的另一个节点上;其他副本随机挑选。

若 client 不为 DataNode 节点,那存储 block 时,规则为:副本 1,随机选择一个节 点上;副本 2,不同副本 1,机架上;副本 3,同副本 2 相同的另一个节点上;其他副本随 机挑选。

d. client 向 DataNode 发送 block1;发送过程是以流式写入。

流式写入过程,

  1. 将 64M 的 block1 按 64k 的 package 划分;
  2. 然后将第一个 package 发送给 host2;
  3. host2 接收完后,将第一个 package 发送给 host1,同时 client 想 host2 发送第 二个 package;
  4. host1 接收完第一个 package 后,发送给 host3,同时接收 host2 发来的第二个 package。
  5. 以此类推,如图红线实线所示,直到将 block1 发送完毕。
  6. host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。 如图粉红颜色实线所示。
  7. client 收到 host2 发来的消息后,向 namenode 发送消息,说我写完了。这样就 真完成了。如图黄色粗实线
  8. 发送完 block1 后,再向 host7,host8,host4 发送 block2,如图蓝色实线所示。
  9. 发送完 block2 后,host7,host8,host4 向 NameNode,host7 向 Client 发送通 知,如图浅绿色实线所示。
  10. client 向 NameNode 发送消息,说我写完了,如图黄色粗实线。。。这样就完 毕了。

分析,通过写过程,我们可以了解到:

①写 1T 文件,我们需要 3T 的存储,3T 的网络流量带宽。

②在执行读或写的过程中,NameNode 和 DataNode 通过 HeartBeat 进行保存通信, 确定 DataNode 活着。如果发现 DataNode 死掉了,就将死掉的 DataNode 上的数据,放 到其他节点去。读取时,要读其他节点去。

③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系; 其他机架上,也有备份。

读操作:

HDFS原理(超详解)_第5张图片

HDFS原理(超详解)_第6张图片

读操作就简单一些了,如图所示,client 要从 datanode 上,读取 FileA。而 FileA 由 block1 和 block2 组成。

那么,读操作流程为:

a. client 向 namenode 发送读请求。

b. namenode 查看 Metadata 信息,返回 fileA 的 block 的位置。

block1:host2,host1,host3

block2:host7,host8,host4

c. block 的位置是有先后顺序的,先读 block1,再读 block2。而且 block1 去 host2 上读取; 然后 block2,去 host7 上读取;

上面例子中,client 位于机架外,那么如果 client 位于机架内某个 DataNode 上,例如,client 是 host6。那么读取的时候,遵循的规律是:

优选读取本机架上的数据。

HDFS 文件权限

与 Linux 文件权限类似

r:read;w:write;x:execute

如果 Linux 系统用用户 xxx 使用 hadoop 命令创建一个文件,那么,在 hdfs 中这个文件的 owner 就是 xxx

HDFS 的权限目的是将控制权交出去,本身只判断用户和权限,至于用户是不是真的,不管。

HDFS 安全模式

NameNode 启动的时候,首先讲 fsimage 载入内存,然后按照 fsedits 中的各项操作修改 内存中的 fsimage。

当元数据文件在内存中创建完成之后,在 NameNode 上创建一个新的 fsimage 替换原 fsimage,同时创建一个空的 fsedits 文件(无需 SecodaryNameNode 参与) 这时,NameNode 是运行在安全模式的。即对外(客户端)只读,所以此段时间内对 hdfs 的写入、删除、重命名都会失败。

然后 NameNode 收集各个 DataNode 的报告,当 block 达到最小副本数以上时,会被认为 “安全”的了,在一定比例的数据块被确定为“安全”后,再过若干事件后,安全模式结束。 当检测到副本数不足的数据块时,该块会被复制,直到达到最小副本数。

Hdfs 中数据块的位置并不是由 namenode 维护的,而是以块列表的形式存储在 datanode 中的。

HDFS 中常用到的命令

1. hdfs fs

hdfs fs -ls /

hdfs fs -lsr

hdfs fs -mkdir /user/hadoop

hdfs fs -put a.txt /user/hadoop/

hdfs fs -get /user/hadoop/a.txt /

hdfs fs -cp src dst

hdfs fs -mv src dst

hdfs fs -cat /user/hadoop/a.txt

hdfs fs -rm /user/hadoop/a.txt

hdfs fs -rmr /user/hadoop/a.txt

hdfs fs -text /user/hadoop/a.txt

hdfs fs -copyFromLocal localsrc dst 与 hadoop fs -put 功能类似。

hdfs fs -moveFromLocal localsrc dst 将本地文件上传到 hdfs,同时删除本地文件。

2.hdfs fsadmin

hdfs dfsadmin -report

hdfs dfsadmin -safemode enter | leave | get | wait

hdfs dfsadmin -setBalancerBandwidth 1000

3. hdfs fsck

4. start-balancer.sh

负载均衡,可以使 DataNode 节点上选择策略重新平衡 DataNode 上的数据块的分布

你可能感兴趣的:(Hadoop)