MapReducer中获取输入文件路径 朴灿烈づ我的快乐病毒、 2022-05-09 14:24 159阅读 0赞 ### 正常情况: ### 在社区版的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); 即可获取输入文件路径
还没有评论,来说两句吧...