MapReducer中获取输入文件路径

正常情况:

在社区版的hadoop版本0.19/0.20中,当使用普通的输入的时候,比如:

job.setInputFormatClass(TextInputFormat.class);

在mapper运行的时候,可以用如下的方法得到对应的filesplit,也就能拿到对应的"输入路径"等信息

FileSplit fileSplit = (FileSplit)(reporter.getInputSplit()); 	// 版本:0.19

FileSplit fileSplit = (FileSplit)(context.getInputSplit());		// 版本:0.20
String fileName = fileSplit.getPath().toUri().getPath();

遇到问题:

但是如果是使用:

MultipleInputs.addInputPath(job, new Path(path),
	SequenceFileInputFormat.class, ProfileMapper.class);

在mapper中再使用上面的那种方式,就会报出一个类型转换错误:
java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit cannot be cast to org.apache.hadoop.mapreduce.lib.input.FileSplit

解决办法及原理:

问题原因:

我们需要的filesplit实际上就是TaggedInputSplit中的成员变量inputSplit
然而TaggedInputSplit这个类在社区版中并不是public的,所以我们并不能直接直接拿到对应的信息了;不知道后续的社区版是怎么做的?可能已经修改了吧

解决办法:

通过反射来获得TaggedInputSplit中的inputSplit:

import java.io.IOException;
import java.lang.reflect.Method;

import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

public class MapperUtils {
	/**
	 * 获得输入文件路径
	 * */
	public static String getFilePath(Context context) throws IOException {
		InputSplit split = context.getInputSplit();
		Class<? extends InputSplit> splitClass = split.getClass();
		FileSplit fileSplit = null;
		if (splitClass.equals(FileSplit.class)) {
			fileSplit = (FileSplit) split;
		} else if(splitClass.getName().equals("org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit")){
			try{
				Method getInputSplitMethod = splitClass.getDeclaredMethod("getInputSplit");
				//设置访问权限  true:不需要访问权限检测直接使用  false:需要访问权限检测
				getInputSplitMethod.setAccessible(true);
				fileSplit = (FileSplit) getInputSplitMethod.invoke(split);
			} catch (Exception e) {
				throw new IOException(e);
			}
		}
		return fileSplit.getPath().toUri().getPath();
	}
}

此时,通过:
String filePath = MapperUtils.getFilePath(context);
即可获取输入文件路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值