Hadoop架构深入与优化
1. Hadoop的优化与发展
1.1Hadoop的局限与不足
- Hadoop1.0的核心组件(MapReduce和HDFS)主要存在以下不足
- 抽象层次低,需人工编码
- 表达能力有限
- 开发者自己管理作业(Job)之间的依赖关系
- 难以看到程序整体逻辑
- 执行迭代操作效率低
- 资源浪费(Map和Reduce分两阶段执行)
- 实时性差(适合批处理,不支持实时交互式)
1.2针对Hadoop的改进与提升
- Hadoop的优化与发展主要体现在两个方面:
-
一方面是Hadoop自身两大核心组件MapReduce和HDFS的架构设计改进
-
另一方面是Hadoop生态系统其它组件的不断丰富,加入了Pig、Tez、Spark和Kafka等新组件
-
组件 | Hadoop1.0的问题 | Hadoop2.0的改进 |
---|---|---|
HDFS | 单一名称节点,存在单点失效问题 | 设计了HDFS HA,提供名称节点热备机制 |
HDFS | 单一命名空间,无法实现资源隔离 | 设计了HDFS Federation,管理多个命名空间 |
MapReduce | 资源管理效率低 | 设计了新的资源管理框架YARN |
组件 | 功能 | 解决Hadoop中存在的问题 |
---|---|---|
Pig | 处理大规模数据的脚本语言,用户只需要编写几条简单的语句,系统会自动转换为MapReduce作业 | 抽象层次低,需要手工编写大量代码 |
Spark | 基于内存的分布式并行编程框架,具有较高的实时性,并且较好支持迭代计算 | 延迟高,而且不适合执行迭代计算 |
Oozie | 工作流和协作服务引擎,协调Hadoop上运行的不同任务 | 没有提供作业(Job)之间依赖关系管理机制,需要用户自己处理作业之间依赖关系 |
Tez | 支持DAG作业的计算框架,对作业的操作进行重新分解和组合,形成一个大的DAG作业,减少不必要操作 | 不同的MapReduce任务之间存在重复操作,降低了效率 |
Kafka | 分布式发布订阅消息系统,一般作为企业大数据分析平台的数据交换枢纽,不同类型的分布式系统可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换 | Hadoop生态系统中各个组件和其他产品之间缺乏统一的、高效的数据交换中介 |
2.HDFS2.0的新特性
2.1HDFS HA
-
HDFS1.0组件及其功能
-
名称节点保存元数据:
(1)在磁盘上:FsImage和EditLog
(2)在内存中:映射信息,即文件包含哪些块,每个块存储在哪个数据节点
- HDFS 1.0存在单点故障问题
- 第二名称节点(SecondaryNameNode)无法解决单点故障问题
- HDFS 1.0存在单点故障问题
-
-
HDFS HA(High Availability)是为了解决单点故障问题而出现的
- HA集群设置两个名称节点,“活跃(Active)”和“待命(Standby)”
- 两种名称节点的状态同步,可以借助于一个共享存储系统来实现
- 一旦活跃名称节点出现故障,就可以立即切换到待命名称节点
- Zookeeper确保一个名称节点在对外服务
- 名称节点维护映射信息,数据节点同时向两个名称节点汇报信息
- HDFS HA架构图:
- HA集群设置两个名称节点,“活跃(Active)”和“待命(Standby)”
2.2 HDFS Federation
HDFS 1.0中存在的问题:
- 单点故障问题
- 不可以水平扩展(是否可以通过纵向扩展来解决?)
- 系统整体性能受限于单个名称节点的吞吐量
- 单个名称节点难以提供不同程序之间的隔离性
- HDFS HA是热备份,提供高可用性,但是无法解决可扩展性、系统性能和隔离性
为针对HDFS1.0存在的问题,提出了HDFS Federation的设计方案
-
在HDFS Federation中,设计了多个相互独立的名称节点,使得HDFS的命名服务能够水平扩展,这些名称节点分别进行各自命名空间和块的管理,相互之间是联盟(Federation)关系,不需要彼此协调。并且向后兼容
-
HDFS Federation中,所有名称节点会共享底层的数据节点存储资源,数据节点向所有名称节点汇报
-
属于同一个命名空间的块构成一个“块池”
-
HDFS Federation的访问方式
对于Federation中的多个命名空间,可以采用客户端挂载表(Client Side Mount Table)