目录
· 概况
· 原理
· HDFS 架构
· 块
· NameNode
· SecondaryNameNode
· fsimage与edits合并
· DataNode
· 数据读写
· 容错机制
· 数据完整性
· NameNode HA
· NameNode Federation
· HDFS Snapshots
· 操作
· API
概况
1. 文件系统抽象类FileSystem
a) 源码
1 public abstract class FileSystem extends Configured implements Closeable {
2 // ...
3 }
b) 实现类
文件系统 |
URI方案 |
Java实现 |
定义 |
Local |
file |
org.apache.hadoop.fs.LocalFileSystem |
已使用客户端校验的本地文件系统。未使用校验的本地磁盘文件系统由RawLocalFileSystem实现。 |
HDFS |
hdfs |
org.apache.hadoop.hdfs.DistributedFileSystem |
Hadoop分布式文件系统 |
HFTP |
hftp |
org.apache.hadoop.hdfs.web.HftpFileSystem |
支持通过HTTP方式以只读方式访问HDFS,通常和distcp命令结合使用。 |
HSFTP |
hsftp |
org.apache.hadoop.hdfs.web.HsftpFileSystem |
支持通过HTTPS方式以只读方式访问HDFS。 |
HAR |
har |
org.apache.hadoop.fs.HarFileSystem |
构建在Hadoop文件系统之上,对文件归档。Hadoop归档文件主要用来减少NameNode内存使用。 |
FTP |
ftp |
org.apache.hadoop.fs.ftp.FtpFileSystem |
由FTP服务器支持的文件系统。 |
S3(原生) |
s3n |
org.apache.hadoop.fs.s3native.NativeS3FileSystem |
基于Amazon S3的文件系统。 |
S3(基于块) |
s3 |
org.apache.hadoop.fs.s3.S3FileSystem |
基于Amazon S3的文件系统,解决S3的5GB文件大小限制。 |
2. HDFS特点
a) 适合存储超大文件:存储在HDFS的文件大多在GB、TB级别,甚至PB级别。
b) 运行于廉价硬件之上:设计时已考虑集群规模足够大时,节点故障是常态。HDFS无需运行在高可靠且昂贵的服务器,普通的PC服务器即可。
c) 流式数据访问:HDFS认为一次写入、多次读取时最高效的访问模式。数据集生成后,会长时间在此数据集上进行各种分析,每次分析都将设计该数据集的大部分甚至全部数据。
3. HDFS缺点
a) 实时数据访问弱:HDFS针对数据吞吐量做了优化,而牺牲了读取效率,无法做到秒级或毫秒级响应。
b) 大量小文件:HDFS启动时,NameNode将全部元数据加载到内存,而一般一个HDFS文件、目录和数据块的存储信息约150字节,因此文件个数受限于NameNode节点内存。过多小文件很快达到上限。
c) 多用户写入,任意修改文件:HDFS文件同时只能有一个写入者,且写操作总在文件末。
原理
HDFS 架构
1. 架构图
2. 守护进程
名称 |
集群中数目 |
作用 |
NameNode |
1(默认) |
存储文件系统元数据,存储文件与数据块映射,并提供文件系统全景图 |
SecondaryNameNode |
1 |
备份NameNode数据,并负责镜像与NameNode日志数据合并 |
DataNode |
多个(至少1个) |
存储块数据 |
块
1. 文件系统块:块大小是磁盘块大小的整数倍,如ext3为4KB,NTFS为4KB。
2. HDFS块
a) HDFS文件:被划分为块大小的多个分块。
b) 默认大小:64MB。
c) 较大原因:最小化寻址开销(块足够大,从磁盘传输数据块的时间明显大于定位块开始位置所需的时间)。
d) 配置:hdfs-site.xml的参数“dfs.block.size”。
3. 副本
a) 含义:每个HDFS块在集群中保存的份数,默认为3。
b) 效果:值越高,冗余性越好,占用存储越多。
c) 配置:hdfs-site.xml的参数“dfs.replication”。
4. 块分布示例
a) 环境:文件大小150MB,块大小64MB,副本数2。
b) 分布:第1块64MB,第2块64MB,第3块22MB。
5. 块布局策略
a) 第1个副本:如果HDFS客户端在集群内,默认布局在客户端所在节点;否则随机选择一个节点,但会尽量避免存储太满或太忙的节点。
b) 第2个副本:与第1个副本不同且随机另外机架中的节点。
c) 第3个副本:与第2个副本相同机架且随机选择另外一个节点。
d) 其他副本(副本数>3):集群随机选择节点,但会尽量避免在相同机架上布局太多副本。
e) 由NameNode选择节点。