Hadoop 3.x 新特性详解
Hadoop 3.x 新特性详解
Hadoop 3 相比 Hadoop 2 带来了许多重要的增强和优化功能,进一步提升了稳定性、可扩展性和性能。以下是 Hadoop 3 的主要新特性及改进的详细介绍。
HDFS的新特性
HDFS 是 Hadoop 用来存储数据的核心组件,它可以把大文件切分成多个块(Block),然后分布式地存储在多台机器上。
纠删码支持(Erasure Coding)
背景:传统副本存储问题
传统方式:为了防止数据丢失,HDFS 通常会把同一份数据复制 3 份(即 3 倍存储开销)。
问题:这种方法可靠性高,但非常浪费存储空间。
纠删码(Erasure Coding)解决了什么问题?
纠删码的原理:
将数据分成多个部分,并生成一些额外的校验数据。
即使部分数据丢失,仍然可以通过校验数据重建完整数据。
存储优势:使用 Reed-Solomon (10,4) 编码技术,仅需 1.4 倍存储开销(比传统的 3 倍节省 50% 以上)。
适用场景:
冷数据:很少访问的大数据(如历史日志文件、备份数据)。
注意事项:
数据重建过程会消耗更多的 CPU 和网络资源。
因此,不适合用于频繁访问的数据。
支持多于两个 NameNode
背景:HDFS 的高可用性(HA)问题
在 Hadoop 中,NameNode 是 HDFS 的核心节点,负责管理文件系统的元数据(即哪些文件存在哪些数据块)。
传统上,HDFS 的高可用性依赖于 1 个活跃(Active)NameNode 和 1 个备用(Standby)NameNode。
多 NameNode 的好处
Hadoop 3 支持多个 Standby NameNode(如 2 个备用节点),提高了容错能力。
例子:使用 3 个 NameNode 和 5 个 JournalNode,可以在 2 个节点故障的情况下仍然保持集群运行。
数据节点内置平衡器(Intra-Datanode Balancer)
背景:数据分布不均问题
每个 DataNode(存储数据块的节点)通常会有多个磁盘存储数据。
如果你在 DataNode 中添加或替换磁盘,可能导致新磁盘上的数据很少,而旧磁盘的数据几乎满了。
问题:DataNode 内部磁盘不平衡,可能导致性能问题。
新特性:内置平衡器
Hadoop 3 引入了 DataNode 内部平衡器,可以在 DataNode 内部重新分配数据,确保各磁盘数据均衡。
使用方式:通过 hdfs diskbalancer 命令调用。
基于路由器的 HDFS 联邦(Router-Based Federation)
背景:多命名空间管理问题
在大规模 Hadoop 集群中,可能有多个独立的 HDFS 命名空间,每个命名空间是一个独立的文件系统。
问题:客户端需要单独管理如何访问这些命名空间。
新特性:Router-Based Federation
引入了一个基于路由器的 RPC 层,提供统一的视图,隐藏了多个命名空间的复杂性。
好处:
客户端可以像访问单一 HDFS 一样访问多个命名空间。
简化管理,操作由服务端完成。
YARN(资源管理框架)的新特性
YARN 是 Hadoop 的资源调度系统,负责管理 Hadoop 集群中的计算资源(如内存、CPU 等),并分配给不同的应用程序或任务。
YARN Timeline Service v.2
背景:时间线服务问题
Timeline Service 是 YARN 用来跟踪应用程序运行历史数据的工具(例如任务运行的时间、状态等)。
问题:v.1.x 的时间线服务在大规模集群中易出现性能瓶颈。
新特性:v.2
提高了时间线服务的 可扩展性 和 可靠性。
新增功能:
流(Flow):可以组织和管理应用程序之间的工作流。
聚合(Aggregation):可以从多个来源汇总数据。
资源类型的扩展
背景:传统资源模型的局限
Hadoop 2.x 的资源模型只支持 CPU 和内存。
问题:在异构集群中(如 GPU 服务器、本地存储服务器),无法根据其他资源类型进行任务调度。
新特性:支持自定义资源类型
集群管理员可以定义新的资源类型(如 GPU 数量、存储容量等)。
好处:YARN 的任务可以针对 GPU 或其他资源进行调度,适应更多样化的硬件环境。
支持 Opportunistic Containers 和分布式调度
背景: 资源调度效率
在资源不足的情况下,任务可能需要等待较长时间才能执行。
Opportunistic Containers
工作机制:
在资源不足时,任务会进入 NodeManager 的队列,等待资源释放后再执行。
优先级低于 Guaranteed Containers。
好处:即使在高负载时,任务也不会被拒绝,提高了集群的利用率。
分布式调度
由 NodeManager 直接进行任务调度,减少了中心化调度的延迟。
Guaranteed Containers 与 Opportunistic Containers 的对比
特性 | Guaranteed Containers | Opportunistic Containers |
---|---|---|
资源分配 | 即时分配,任务启动时资源已准备好 | 等待资源可用时才开始执行 |
优先级 | 高 | 低 |
适用场景 | 关键任务,需要稳定资源支持 | 非关键任务,资源紧张时可延迟执行 |
资源抢占 | 不会被抢占,可抢占 Opportunistic | 可被 Guaranteed 容器抢占 |
资源利用率 | 可能导致资源碎片化 | 更高的集群利用率 |
基于 API 的 Capacity Scheduler 队列配置
背景:队列配置管理问题
YARN 的队列配置通常通过手动编辑配置文件完成。
问题:手动管理队列配置复杂且容易出错。
新特性:API 管理队列配置
提供 REST API 接口,支持动态修改队列配置。
好处:
管理员可以通过脚本或工具自动化队列管理。
更加灵活,避免手动配置文件的复杂操作。
MapReduce 优化
任务级本地优化
背景:什么是 MapReduce?
MapReduce 是 Hadoop 中用于处理大规模数据的核心计算框架。
Map 阶段 将数据分成多个小部分并进行初步处理。
Reduce 阶段 汇总和整理来自 Map 阶段的输出。
Shuffle 操作 是指 Map 阶段的输出数据被传递到 Reduce 阶段,这需要进行排序和网络传输。
问题:Shuffle 操作的性能瓶颈
Shuffle 是 MapReduce 的关键步骤,但由于需要大量的数据传输和排序,性能往往成为瓶颈。
优化:本地化映射输出收集器
本地化处理:Hadoop 3 支持将 Shuffle 操作部分在本地完成,而非全部通过网络传输。
性能提升:对于需要大量 Shuffle 操作的任务,可提升 30% 的性能。
适用场景:特别适用于需要频繁数据交换的大型任务。
堆管理机制改进
背景:什么是堆(Heap)?
堆是 JVM(Java 虚拟机)运行时分配内存的区域,用于存储程序中需要动态分配的数据。
Hadoop 中的每个任务和守护进程(如 NameNode、DataNode)都会使用堆内存。
问题:手动配置堆大小的局限
在 Hadoop 2.x 中,堆大小由 HADOOP_HEAPSIZE 手动设置。
手动配置可能导致以下问题:
配置不合理会导致任务失败或资源浪费。
不同机器的内存大小不同,无法灵活调整。
改进:自动堆管理
Hadoop 3 弃用了 HADOOP_HEAPSIZE,引入了 自动堆大小调整机制:
根据每台机器的内存大小自动分配适当的堆大小。
减少人为干预,提升资源利用效率。
客户端和开发者支持
覆盖客户端的 Jar(Shaded Client Jars)
背景:依赖冲突问题
在 Hadoop 2.x 中,客户端程序(如用户开发的应用程序)需要使用 Hadoop 的类库。
问题:
客户端程序必须加载 Hadoop 的依赖项。
如果 Hadoop 的依赖版本与客户端程序的依赖版本冲突,会导致程序错误。
改进:单一 Jar 包隔离依赖
Hadoop 3 引入了 hadoop-client-api 和 hadoop-client-runtime。
优势:
将 Hadoop 的依赖项隔离到单一 Jar 包中。
避免了 Hadoop 依赖污染客户端程序的类路径,减少冲突。
重写 Shell 脚本
背景:Hadoop 的 Shell 脚本
Hadoop 提供了一系列 Shell 脚本,用于启动、停止和管理集群服务。
问题:旧版脚本的局限
脚本中存在许多长期未修复的 bug。
功能较为有限,难以适应复杂的部署环境。
改进:重写 Shell 脚本
修复了许多历史 bug,并增加了新功能。
优势:
提高了脚本的稳定性和兼容性。
更适合现代化的集群管理需求。
云存储支持
文件系统连接器
功能
Hadoop 3 新增了对以下云存储的支持:
Microsoft Azure Data Lake。
阿里云对象存储(Aliyun OSS)。
通过这些连接器,Hadoop 可以将云存储视为普通的分布式文件系统使用。
意义
用户无需额外开发即可直接将云存储集成到 Hadoop 中。
特别适合混合云或多云环境。
S3Guard
功能
为 Amazon S3 的文件系统客户端(S3A)提供 一致性保证 和 元数据缓存。
一致性问题:
S3 的存储系统是最终一致性的,这意味着在文件更新后,可能需要一段时间才能对外部可见。
实现方式
使用 Amazon DynamoDB 存储文件和目录的元数据。
提供一致性视图,确保文件更新能够立即可见。
其他优化
修改多服务的默认端口
问题
在 Hadoop 2.x 中,某些服务的默认端口与 Linux 系统的临时端口范围(32768-61000)重叠。
影响:端口冲突可能导致服务启动失败。
解决方案
调整了多个服务的默认端口号,涉及:
- NameNode
- Secondary NameNode
- DataNode
- KMS(Key Management Service)
提高了服务的可靠性。
Hadoop 3 的总体提升
最低要求
Hadoop 3 需要 Java 8 作为最低版本支持。
所有 Jar 包均基于 Java 8 编译。
稳定性与可用性
提供了更稳定的 API,适合生产环境使用。
性能与资源利用率
引入纠删码、多 NameNode、任务本地优化等功能,大幅提升了性能和资源利用效率。