【源码解析】Hadoop之InputForma切片机制及其默认实现类TextInputFormat

InputFormat默认实现类——TextInputFormat源码解析

以MapReduce程序中的Diver类调用的waitForCompletion方法为切入点,进行源码的剖析,这里以JDK8为例。

  1. Diver.class:
// 按住ctrl键并点击waitForCompletion()进入Job.class类
job.waitForCompletion(true);
  1. Job.class:
    方法1:waitForCompletion()
/*
主要关注waitForCompletion()方法中调用的submit()方法,该方法用来提交job
然后继续跟进submit(),仍然是在Job.class
*/
this.submit();

方法2:submit()

/*
关注submit()方法中调用的submitJobInternal()方法,进行内部提交。
继续跟进该方法进入JobSubmitter.class类中。
*/
return submitter.submitJobInternal(Job.this, Job.this.cluster);
  1. JobSubmitter.class:
    方法3:submitJobInternal()
/*
上边大部分代码暂时不用看,直接找到调用writeSplits()方法的代码。
该句代码的作用是计算切片,生成切片规划文件。
接着继续跟进writeSplits()方法,仍然是在JobSubmitter.class中。
*/
int maps = this.writeSplits(job, submitJobDir);

方法4:writeSplits()

//在writeSplits()方法中调用了writeNewSplits()方法,进行切片
//然后继续跟进writeNewSplits()方法,仍然实在JobSubmitter.class中。
maps = this.writeNewSplits(job, jobSubmitDir);

方法5:writeNewSplits()

/*
在该方法中终于可以看到了InputFormat抽象类获取实例,参数传入一个实现类。
再通过反射机制获取类的实例化,从而达到实例化的过程。
因此只需要确定参数中getInputFormatClass()方法返回的具体是谁就可以确定具体实现类。
继续跟进getInputFormatClass()方法,进入JobContext.class。
*/
InputFormat<?, ?> input = (InputFormat)ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
  1. JobContext.class
/*
JobContext.class中的getInputFormatClass()是一个抽象类方法,其具体的实现类包括五个:
ChainMapContextImpl.class
ChainReduceContextImpl.class
Context in WrappedMapper.class
Context in WrappedReducer.class
JobContextImpl.class
但是通过一个一个跟进,只有JobContextImpl.class类中的重写方法具有真实业务逻辑。
*/
Class<? extends InputFormat<?, ?>> getInputFormatClass() throws ClassNotFoundException;
  1. JobContextImpl.class
/*
首先会去默认配置文件中查找标签"mapreduce.job.inputformat.class"的对应值
但是mapred-default.xml默认配置文件中没有配置,因此会返回显示声明的参数TextInputFormat.class
*/
public Class<? extends InputFormat<?, ?>> getInputFormatClass() throws ClassNotFoundException {
        return this.conf.getClass("mapreduce.job.inputformat.class", TextInputFormat.class);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值