作者:李呈祥,花名司麟,阿里云智能EMR团队高级技术专家,Apache Hive Committer, Apache Flink Committer,目前主要专注于EMR产品中开源计算引擎的优化工作。
本篇文章相关视频及slides:https://www.slidestalk.com/AliSpark/HadoopJobCommitter24512?video
3月5日JindoFS系列直播【Hadoop Job committer 的演化和发展】
并发地向目标存储系统写数据是分布式任务的一个天然特性,通过在节点/进程/线程等级别的并发写数据,充分利用集群的磁盘和网络带宽,实现高容量吞吐。并发写数据的一个主要需要解决的问题就是如何保证数据一致性的问题,具体来说,需要解决下面列出的各个问题:
在分布式任务写数据的过程中,如何保证中间数据对外不可见。
在分布式任务正常完成后,保证所有的结果数据同时对外可见。
在分布式任务失败时,所有结果数据对外不可见且能正确清理。
开启预测执行时,保证多个执行相同任务的task只有一份结果数据在最终结果中。
此外,还要一些作业的异常情况需要处理,例如task失败重试,作业重启等等。Job Committer是MapReduce用来实现分布式写入一致性的保证,通过Job Committer的各种实现,保证MapReduce任务在各种异常场景中数据写出的一致性。Spark支持MapReduce的JobCommitter,同样也是通过JobCommitter实现Spark作业写出数据的一致性。
JobCommitter接口
MapReduce有V1和V2两套API接口,在包名中以mapred
和mapreduce
区分,v1和v2版本的JobCommitter抽象接口基本一致,下面以org.apache.hadoop.mapreduce.OutputCommitter
为例介绍主要的接口定义:
Modifier and Type | Method and Description |
---|---|
abstract void |
setupJob(JobContext jobContext) For the framework to setup the job output during initialization. |
void |
commitJob(JobContext jobContext) For committing job's output after successful job completion. |
void |
abortJob(JobContext jobContext, org.apache.hadoop.mapreduce.JobStatus.State state) For aborting an unsuccessful job's output. |
boolean |
isCommitJobRepeatable(JobContext jobContext) Re |