Hadoop 2.x HDFS新特性
HDFS联邦
HDFS HA(要用到zookeeper等,留在后面再讲)
HDFS快照
回顾: HDFS两层模型
Namespace: 包括目录、文件和块。它支持所有命名空间相关的文件操作,如创建、删除、修改,查看所有文件和目录。
Block Storage Service(块存储服务) 包括两部分:
1 在namenode中的块的管理:提供datanode集群的注册、心跳检测等功能。处理块的报告信息和维护块的位置信息。支持块相关的操作,如创建、删除、修改、获取块的位置信息。管理块的冗余信息、创建副本、删除多余的副本等。
2 存储: datanode提供本地文件系统上块的存储、读写、访问等。
1.x HDFS架构的弱点
HDFS架构在整个集群中允许且仅允许一个单独的命名空间。命名空间被一个单独的namenode节点所管理。这种架构决策实现简单。但也会产生单点,内存瓶颈,性能瓶颈等限制。
HDFS联邦
目的:水平扩展名称服务
使用多个独立的namenode和namespaces。每个namenode是独立的,不需要和其它namenode协调合作。
datanode作为统一的块存储设备被所有namenode节点使用。
每一个datanode节点都在所有的namenode进行注册。 datanode发送心跳信息、块报告到所有namenode,同时执行所有namenode发来的命令。
块池( Block Pool)
块池是属于单个命名空间的一组块。
每一个datanode为所有的block pool存储块。
Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念。
同一个datanode中可以存着属于多个block pool的多个块。
Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID。
一个Namenode失效不会影响其下的datanode为其他Namenode的服务。
HDFS联邦的好处
Namespace的可扩展性, 1.x中集群存储可以水平扩展(增加节点),但namespace不可以。
1.x的Namenode 存在单点瓶颈,在2.x中可以通过增加 namenode解决
隔离性。在1.x中,一个拙劣的应用可能耗尽namenode的性能资源从而影响其他应用运行, 2.x的多namenode可以将不同类型的应用和用户隔离在不同的namespaces
命名空间管理细节
https://issues.apache.org/jira/secure/attachment/12453067/high-leveldesign.pdf
不采用文件名Hash这一在分布式系统里常用的手段,因为同一目录下的文件可能散布于各个命名空间,性能很差
采用Client Side Mount Table,如下图
联邦未解决问题
并非真正HA, namenode失效会造成部分数据无法访问
负载均衡难以自劢完成
HDFS快照
在2.x终于实现了快照
设置一个目录为可快照:
hdfs dfsadmin -allowSnapshot <path>
取消目录可快照:
hdfs dfsadmin -disallowSnapshot <path>
生成快照:
hdfs dfs -createSnapshot <path> [<snapshotName>]
删除快照:
hdfs dfs -deleteSnapshot <path> <snapshotName>
快照位置
可快照目录下的.snapshot子目录
其它快照操作
列出所有可快照目录:
hdfs lsSnapshottableDir
比较快照之间的差异:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>