分布式文件系统:管理网络中跨多台计算机存储的文件系统,能容忍节点故障
3.1 HDFS的设计
HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群。
- 超大文件 MB级、GB级、TB级甚至PB级大小的文件
- 流式数据访问 一次写入、多次读取数据访问模式,每次读取文件的大部分或全部,更关注文件整体读取时间,而非前几条记录读取时间。
- 商用硬件 指普通硬件集群,而非昂贵高可靠的硬件,对于庞大的集群,硬件故障率较高
不适合使用HDFS进行存储的场景
- 低时延数据访问 HDFS是为高数据吞吐量应用场景优化的,以高延迟为代价,低延迟访问需求可以采用Hbase
- 大量小文件 文件系统元数据存储于namenode,文件数量上限取决于namenode内存,据经验,每个文件、目录、数据块存储信息大约占150字节,100万个文件且每文件占1个数据块,至少需要300MB内存。
- 多用户写,任意修改文件 只支持单写,且以append方式在文件末尾追加。
3.2 HDFS的概念
3.2.1 数据块
- 文件系统块大小是磁盘sector(扇区,最小操作单位)大小的整数倍,磁盘sector一般为512字节,文件系统block一般为几千字节,减少寻址延迟,抽象底层实现。
- HDFS块,默认128MB,HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立存储单元,小于一个块大小的文件不会占用整个块空间。
HDFS块比文件系统的块大,是为了最小化寻址开销,块足够大,传输由多个块组成的大文件时间将由磁盘传输速率决定。
寻址10ms,传输速率100M/s,块大小100MB,寻址仅占传输时间的1%,随着磁盘传输速率提升,块可以设置得更大,但设置过大,map任务数(一次处理一个数据块)过少(少于集群节点数量),作业运行速度会较慢。
分布式文件系统块抽象好处
- 单文件大小可大于分布式文件系统中单磁盘容量,文件块可以存储于集群任意磁盘;
- 使用抽象块而非整个文件作为存储单元,简化了存储子系统设计,简化存储管理(计算单个磁盘可存储多少个块相对容易)
- 块适合于副本备份, 提高数据容错能力和提高可用性
以下命令可查看文件块信息
hdfs fsck / -files -blocks
3.2.2 namenode和datanode
- namenode 管理文件系统命名空间,维护文件系统树及树内目录和文件,这些信息永久保存于命名空间镜像文件和编辑文件,也记录文件所有块所在节点信息,这些信息会在系统重启时根据节点上报消息进行重建。
- datanode 存储并检索数据,定期向namenode上报其所存储块列表信息
- client 用户与namenode、datanode交互的界面,以此访问文件系统
namenode容错
- 配置多个保存元数据文件的路径(逗号隔开),写操作实时同步且原子,一般配置本地文件系统路径+NFS
secondary namenode(辅助namenode),定期合并命名空间镜像和编辑文件,防止编辑文件过大,影响写入性能。因为需要耗费大量CPU,且需要和namenode一样多的内存来执行合并,一般独立部署,可在namenode发生故障时启用。辅助namenode状态滞后于namenode,一般把存储在NFS的namenode元数据文件拷贝至辅助namenode并启用。
3.2.3 块缓存
通常datanode从磁盘读取数据,对被频繁访问的文件,对应块可被显示缓存于datanode内存中,称为堆外块缓存(off-heap block cache),一般一个块仅缓存在一个datanode内存中,可针对文件配置该数量。作业调度器通过在块缓存的datanode上运行任务,利用块缓存优势提升读性能,如join小表可缓存于内存。
- cache pool是一个管理缓存权限和资源使用的管理性分组。
- 用户或应用通过在缓冲池(cache pool)增加一个cache directive来告诉namenode需要缓存哪些路径及缓存多久。
cacheadmin命令用法
Usage: bin/hdfs cacheadmin [COMMAND]
[-addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]]
[-modifyDirective -id <id> [-path <path>] [-force] [-replication <replication>] [-pool <pool-name>] [-ttl <time-to-live>]]
[-listDirectives [-stats] [-path <path>] [-pool <pool>] [-id <id>]]
[-removeDirective <id>]
[-removeDirectives -path <path>]
[-addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-defaultReplication <defaultReplication>] [-maxTtl <maxTtl>]]
[-modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-defaultReplication <defaultReplication>] [-maxTtl <maxTtl>]]
[-removePool <name>]
[-listPools [-stats] [<name>]]
[-help <command-name>]
-ttl 缓存指令可以保持多长时间。可以按照分钟,小时,天来指定,如30m,4h,2d。有效单位为[smhd]。“never”表示永不过期的指令。如果未指定该值,那么,缓存指令就不会过期
1、增加缓冲池
> hdfs cacheadmin -addPool cache_users -owner ossuser -mode 0700
Successfully added cache pool cache_users.
2、列出所有缓冲池
> hdfs cacheadmin -listPools
Found 1 result.
NAME OWNER GROUP MODE LIMIT MAXTTL DEFAULT_REPLICATION
cache_users ossuser ossgroup rwx------ unlimited never 1
3、将hdfs路径缓存至缓冲池
> hdfs cacheadmin -addDirective -path /home/ossuser -pool cache_users
Added cache directive 1
4、查看hdfs路径是否加入至缓冲池
> hdfs cacheadmin -listDirectives -path /home/ossuser
Found 1 entry
ID POOL REPL EXPIRY PATH
1 cache_users 1 never /home/ossuser
> hdfs cacheadmin -listDirectives -path /user/ossuser
5、删除hdfs路径缓存
> hdfs cacheadmin -removeDirectives -path /home/ossuser
Removed cache directive 1
Removed every cache directive with path /home/ossuser
> hdfs cacheadmin -listDirectives -path /home/ossuser
Found 0 entries
3.2.4 联邦HDFS
namenode在内存中保存文件与数据库对应关系,内存将成为系统横向扩展的瓶颈,联邦HDFS允许通过添加namenode实现扩展,每个namenode管理一部分命名空间,如nn1管理/user,nn2管理/share。
命名空间卷(namespace volume)
- 联邦HDFS环境下,每个namenode维护一个;
- 由命名空间元数据和一个数据块池(block pool)组成;
- 相互独立不通信,不影响,所以可能部分命名空间可用。
数据块池(block pool)
- 池包含了该命名空间下所有文件的所有数据块;
- 池不再进行切分,datanode需要注册到每个namenode,且存储来自多个数据块池的数据块。
3.2.5 HDFS的高可用
namenode单点失效(SPOF, Single Point of Failure),HDFS整个不可用,包括文件创建、读取、列举等;
失败恢复,须启动一个拥有元数据副本的namenode,配置datanode和客户端以便使用整个新的namenode,对于有大量文件和数据块的集群,namenode冷启动耗时30+分钟,启动过程如下:
- 加载命名镜像文件至内存
- replay 编辑日志
- 接收足够多的来自datanode的数据块上报信息,退出安全模式。
Hadoop2通过namenode active-standby模式提供了HDFS HA支持,standby namenode接管active namenode任务时,不会有明显中断。
- namenode间通过高可用共享存储实现编辑日志的共享,当standby namenode接管任务后,将replay编辑日志,实现与active namenode的状态同步;
- standby namenode也需要同时接收来自datanode的数据块上报消息,因为数据块映射信息存储在内存,而非磁盘;
- 客户端需要使用特殊机制透明处理namenode失效问题;
- standby namenode同时行使secondary namenode职责,为active namenode命名空间设置周期性检查点。
高可用共享存储:
- NFS
- QJM(quorum journal manager)群体日志管理器,以一组日志节点形式运行,每次编辑必须写入多数节点,被推荐用于大多数HDFS部署中。active namenode失效后,standby namenode能在几十秒内接管任务,因为standby内存中已包括最新的编辑日志条目和数据块映射信息,实际观察可能1分钟左右,因为系统需要保守确定active namenode真的失效了。
active standby namenode都失效的情况非常少,可以再加一个备用namenode冷备启动。
故障迁移和规避:
- 平稳故障转移 故障转移控制器可以组织两个namenode有序地切换角色,如日常维护中管理员手动发起的切换;
- 非平稳故障转移 无法确切知道失效namenode是否已停止运行,如网络缓慢或网络分割,激发了故障转移,但是先前的namenode依然运行且是活动namenode,规避(fencing)可确保先前活动的namenode不会执行危害系统并导致系统崩溃的操作。
- QJM同一时间只允许一个namenode节点写入编辑日志,但先前活动namenode仍可能响应客户端请求,建议kill掉namenode进程;
- NFS无法同一时间只允许一个namenode写入数据(所以建议使用QJM),需要使用更有力规避机制包括:撤销namenode读写NFS权限,屏蔽相应网络端口,对应主机下电。
客户端故障转移:
通过客户端配置文件,HDFS URI使用一个逻辑主机名,该主机名映射一对namenode,客户端会失败重试。
3.3 命令行接口
常用命令:
1、查看HDFS文件列表
> hdfs dfs -ls /
Found 2 items
drwxr-xr-x - ossuser supergroup 0 2019-04-03 11:37 /user
-rw-r--r-- 1 ossuser supergroup 4 2019-04-19 17:58 /test.txt
格式为:
文件模式
文件备份数
所属用户
所属组
文件大小(字节单位,目录为0)
最后修改日期与时间
文件或目录名称
2、从本地拷贝至HDFS
> hdfs dfs -copyFromLocal test.txt /2019
3、从HDFS拷贝至当前路径
> hdfs dfs -copyToLocal /2019/test.txt .
4、查看HDFS文件内容
> hdfs dfs -cat /2019/test.txt
abc
5、删除HDFS文件
> hdfs dfs -rm /2019/test.txt
Deleted /2019/test.txt
6、创建HDFS目录
> hdfs dfs -mkdir -p /test1/test2
> hdfs dfs -ls /test1
Found 1 items
drwxr-xr-x - ossuser supergroup 0 2019-04-19 17:55 /test1/test2
7、删除HDFS目录
> hdfs dfs -rm -r /test1
Deleted /test1
HDFS文件访问权限
文件 | 目录 | |
---|---|---|
r | 读取 | 目录文件列表 |
w | 写入 | 新建、删除文件或目录 |
x | - | 访问目录子目录 |
默认,Hadoop安全措施处于停用模式,客户端身份没有经过认证,一个客户端可以在远程系统创建一个和合法用户同名的账号来访问系统。
3.4 Hadoop文件系统
抽象类org.apache.hadoop.fs.FileSystem
定义了Hadoop中一个文件系统客户端接口,有如下实现:
文件系统类型 | URI Schema | 实现类 | 说明 |
---|---|---|---|
Local | file | org.apache.hadoop.fs.LocalFileSystem | 使用客户端校验和的本地磁盘文件系统 |
HDFS | hdfs | org.apache.hadoop.hdfs.DistributedFileSystem | HDFS |
WebHDFS | webhdfs | org.apache.hadoop.hdfs.web.WebHdfsFileSystem | HDFS Web版 |
Secure WebHDFS | swebhdfs | org.apache.hadoop.hdfs.web.SWebHdfsFileSystem | WebHDFS HTTPS版本 |
HAR | har | org.apache.hadoop.fs.HarFileSystem | 一个构建于其他文件系统之上用于文件存档的文件系统,通常用于多个小文件打包成一个存档文件以较少namenode内存使用,使用hadoop archive命令创建HAR文件 |
View | view | org.apache.hadoop.fs.viewfs.ViewFileSystem | 通常用于联邦HDFS创建挂载点 |
FTP | ftp | org.apache.hadoop.fs.ftp.FTPFileSystem | - |
S3 | s3a | - | - |
Azure | wasb | - | - |
Swift | swift | - | OpenStack Swift |