HDFS
- HDFS的设计
- HDFS的概念
- 数据块
- NameNode和DataNode
- Secondary NameNode
- hadoop2.0新增的功能
HDFS的设计
- 超大文件
"超大文件"是指具有几百MB、GB甚至是几百TB大小的文件。
- 流式数据访问
一次写入、多次读取
- 不适合低时间延迟的数据访问
- 不适合大量的小文件
由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量。每个文件、目录和数据块的存储信息大约占150字节。假设块大小为128MB ,备份数量是3 ,那么一个1GB大小的文件将占用8 * 3=24个文件块。如果现在有1000个1MB大小的文件,则会占用1000*3=3000个文件块(1000个文件不能放到一个块中)。我
们可以发现,如果文件越小,存储同等大小文件所需要的元信息
就越多,所以Hadoop更喜欢大文件。
- 不支持多用户写入,任意修改文件
HDFS中的文件写入只支持单个写入者,而且写操作总是以只添加的方式在文件末尾写数据。它不支持多个写入,以及不支持在文件的任意位置进行修改。
HDFS的概念
数据块
- HDFS的数据块默认大小是128MB,比磁盘的块大,目的是为了最小化寻址开销
- HDFS中的fsck指令可以显示块的信息
hdfs fsck / -files -blocks
NameNode和DataNode
- NameNode
主节点(master),再hadoop1.0中只有一个,所以会有单节点故障问题。在2.0中加入了HA,使得集群的高可用性增加!具体的咱们下面详细说说
- (1) 元数据持久化
在NameNode中存放元信息的文件是 fsimage。在系统运行期间所有对元信息的操作都保存在内存中并被持久化到另一个文件edits中。并且edits文件和fsimage文件会被SecondaryNameNode周期性的合并
- (2) namenode存储着一些元数据信息,有着两种映射关系
- 已知路径path(HDFS上的路径) => blockID list 列表
- blockID数据库 => DataNode节点地址
- DataNode
1、datanode是文件系统的工作节点,负责为系统客户端提供数据块的读写服务。
2、 存储并定期检查(心跳机制)数据块(受到客户端或者namenode的调度),定期的向namenode发送他们存储数据块的 block list。
3、 DataNode之间进行通信,块的副本处理
- 副本的机架感知策略:
- 第一个副本,在客户端相同的节点(如果客户端是集群外的一台机器,就随机算节点,但是系统会避免挑选太满或者太忙的节点)
- 第二个副本,放在不同机架(随机选择)的节点
- 第三个副本,放在与第二个副本同机架但是不同节点上
Secondary NameNode
> 用来保存HDFS的元数据信息,比如命名空间信息、块信息等,由于这些信息是在内存的,SecondNameNode是为了考虑持久化到磁盘
fsimage:它是在NameNode启动时对整个文件系统的快照
editlogs:它是在NameNode启动后,对文件系统的改动序列
作用:
1. 定时到NameNode去获取edit logs,并更新到fsimage[Secondary NameNode自己的fsimage]
2. 一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
3. NameNode在下次重启时会使用这个新的fsimage文件,进而减少重启时间
hadoop2.0新增的功能
* HA
> • 什么问题:Hadoop 1.0中NameNode在整个HDFS中只有一个,存在单点故障
风险,一旦NameNode挂掉,整个集群无法使用
• 解决方法:HDFS的高可用性将通过在同一个集群中运行两个NameNode (
active NameNode & standby NameNode )来解决
• 在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态
• Active NN负责集群中所有客户端的操作;
• Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速
的故障恢复
1、同步问题:需要依赖JournalNodes守护进程,完成元数据的一致性
2、快速的故障恢复:心跳保证,Standby NN也需要保存集群中各个文件块的存储位置
3、避免分歧:任何情况下,NameNode只有一个Active状态,否则导致数据的丢失及其它不正确的结果
- 联邦HDFS
- 集群中提供多个NameNode,每个NameNode负责管理一部分DataNode
- 好处:实现NameNode的横向扩展,使得Hadoop集群的规模可以达到上万台
- 快照
1、HDFS快照是一个只读的基于时间点文件系统拷贝
2、常用来作为数据备份,防止用户错误操作和容灾恢复
3、 Snapshot 并不会影响HDFS 的正常操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。
4、快照数据是当前数据减去修改的部分计算出来的。
5、快照会存储在snapshottable的目录下
# 为/user/spark目录打开snapshot的功能
hdfs dfsadmin -allowSnapshot /user/spark
# 为开启了snapshot功能的/user/spark目录创建一个snapshot
hdfs dfs -createSnapshot /user/spark s0
# 对开启了snapshot功能的目录执行删除操作,对已开启快照的目录,删除会报错
# 例如 执行 hdfs dfs -rmr /user/spark
hdfs dfs -rmr /user/spark
rmr: Failed to move to trash: hdfs://master:9000/user/spark: The directory /user/spark cannot be deleted since /user/spark is snapshottable and already has snapshots
#对 snapshot进行重命名
hdfs dfs -renameSnapshot /user/spark s0 s_init
# 删除snapshot
hdfs dfs -deleteSnapshot /user/spark s_init
# 关闭/user/spark目录的snapshot特性
hdfs dfsadmin -disallowSnapshot /user/spark
# 查看已经开启了snapshot的目录列表
hdfs lsSnapshottableDir
- 缓存
- 允许用户指定要缓存的HDFS路径
- 明确的锁定可以阻止频繁使用的数据被从内存中清除
- 集中化缓存管理对于重复访问的文件很有用
- 可以换成目录或文件,但目录是非递归的
- ACL
- Hadoop从2.4.0开始支持目前HDFS的权限控制与Linux一致,包括用户、用户组、其他用户组三类权限,这种方式有很大局限性
- 首先参数上要开启基本权限和访问控制列表功能
dfs.permissions.enabled
dfs.namenode.acls.enabled
- 常用命令:
hadoop fs -getfacl /input/acl
hdfs dfs -setfacl -m user:mapred:r-- /input/acl
hdfs dfs -setfacl -x user:mapred /input/acl