简介
HDFS(Hadoop Distributed File System )Hadoop 分布式文件系统。是根据 google 发 表的论文翻版的。论文为 GFS(Google File System)Google 文件系统。
HDFS 有很多特点:
① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存 3 份。
② 运行在廉价的机器上。
③ 适合大数据的处理。多大?多小?HDFS 默认会将文件分割成 block,64M 为 1 个 block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中(namenode)。 如果小文件太多,那内存的负担会很重。
如上图所示,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 毁灭之后的部分文件恢复。
合并过程如下:
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
工作原理
写操作:
有一个文件 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;发送过程是以流式写入。
流式写入过程,
分析,通过写过程,我们可以了解到:
①写 1T 文件,我们需要 3T 的存储,3T 的网络流量带宽。
②在执行读或写的过程中,NameNode 和 DataNode 通过 HeartBeat 进行保存通信, 确定 DataNode 活着。如果发现 DataNode 死掉了,就将死掉的 DataNode 上的数据,放 到其他节点去。读取时,要读其他节点去。
③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系; 其他机架上,也有备份。
读操作:
读操作就简单一些了,如图所示,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 上的数据块的分布