更新时间:2023-11-07 GMT+08:00

MapReduce开源增强特性

MapReduce开源增强特性:JobHistoryServer HA特性

JobHistoryServer(JHS)是用于查看MapReduce历史任务信息的服务器,当前开源JHS只支持单实例服务。JobHistoryServer HA能够解决JHS单点故障时,应用访问MapReduce接口无效,导致整体应用执行失败的场景,从而大大提升MapReduce服务的高可用性。

图1 JobHistoryServer HA主备倒换的状态转移过程

JobHistoryServer高可用性

  • 采用ZooKeeper实现主备选举和倒换。
  • JobHistoryServer使用浮动IP对外提供服务。
  • 兼容JHS单实例,也支持HA双实例。
  • 同一时刻,只有一个节点启动JHS进程,防止多个JHS操作同一文件冲突。
  • 支持扩容减容、实例迁移、升级、健康检查等。

MapReduce开源增强特性:特定场景优化MapReduce的Merge/Sort流程提升MapReduce性能

下图展示了MapReduce任务的工作流程。

图2 MapReduce 作业
图3 MapReduce作业执行流程

Reduce过程分为三个不同步骤:Copy、Sort(实际应当称为Merge)及Reduce。在Copy过程中,Reducer尝试从NodeManagers获取Maps的输出并存储在内存或硬盘中。紧接着进行Shuffle过程(包含Sort及Reduce),这个过程将获取到的Maps输出进行存储并有序地合并然后提供给Reducer。当Job有大量的Maps输出需要处理的时候,Shuffle过程将变得非常耗时。对于一些特定的任务(例如hash join或hash aggregation类型的SQL任务),Shuffle过程中的排序并非必须的。但是Shuffle却默认必须进行排序,所以需要对此处进行改进。

此特性通过对MapReduce API进行增强,能自动针对此类型任务关闭Sort过程。当Sort被关闭,获取Maps输出数据以后,直接合并后输出给Reduce,避免了由于排序而浪费大量时间。这种方式极大程度地提升了大部分SQL任务的效率。

MapReduce开源增强特性:History Server优化解决日志小文件问题

运行在Yarn上的作业在执行完成后,NodeManager会通过LogAggregationService把产生的日志收集到HDFS上,并从本地文件系统中删除。日志收集到HDFS上以后由HistoryServer来进行统一的日志管理。LogAggregationService在收集日志时会把container产生的本地日志合并成一个日志文件上传到HDFS,在一定程度上可以减少日志文件的数量。但在规模较大且任务繁忙的集群上,经过长时间的运行,HDFS依然会面临存储的日志文件过多的问题。

以一个20节点的计算场景为例,默认清理周期(15日)内将产生约1800万日志文件,占用NameNode近18G内存空间,同时拖慢HDFS的系统响应速度。

由于收集到HDFS上的日志文件只有读取和删除的需求,因此可以利用Hadoop Archives功能对收集的日志文件目录进行定期归档。

日志归档

在HistoryServer中新增AggregatedLogArchiveService模块,定期检查日志目录中的文件数。在文件数达到设定阈值时,启动归档任务进行日志归档,并在归档完成后删除原日志文件,以减少HDFS上的文件数量。

归档日志清理

由于Hadoop Archives不支持在归档文件中进行删除操作,因此日志清理时需要删除整个归档文件包。通过修改AggregatedLogDeletionService模块,获取归档日志中最新的日志生成时间,若所有日志文件均满足清理条件,则清理该归档日志包。

归档日志浏览

Hadoop Archives支持URI直接访问归档包中的文件内容,因此浏览过程中,当History Server发现原日志文件不存在时,直接将URI重定向到归档文件包中即可访问到已归档的日志文件。

  • 本功能通过调用HDFS的Hadoop Archives功能进行日志归档。由于Hadoop Archives归档任务实际上是执行一个MR应用程序,所以在每次执行日志归档任务后,会新增一条MR执行记录。
  • 本功能归档的日志来源于日志收集功能,因此只有在日志收集功能开启状态下本功能才会生效。