如何在运行Hadoop MapReduce作业时将文件名/文件内容作为MAP的键/值输入?

Chr*_*phe 5 java hadoop mapreduce distributed-system

我正在创建一个分析PDF,DOC和DOCX文件的程序.这些文件存储在HDFS中.

当我启动MapReduce作业时,我希望map函数将Filename作为键,将Binary Contents作为值.然后我想创建一个流阅读器,我可以将其传递给PDF解析器库.如何实现Map Phase的键/值对是filename/filecontents?

我正在使用Hadoop 0.20.2

这是开始工作的旧代码:

public static void main(String[] args) throws Exception {
 JobConf conf = new JobConf(PdfReader.class);
 conf.setJobName("pdfreader");

 conf.setOutputKeyClass(Text.class);
 conf.setOutputValueClass(IntWritable.class);

 conf.setMapperClass(Map.class);
 conf.setReducerClass(Reduce.class);

 conf.setInputFormat(TextInputFormat.class);
 conf.setOutputFormat(TextOutputFormat.class);

 FileInputFormat.setInputPaths(conf, new Path(args[0]));
 FileOutputFormat.setOutputPath(conf, new Path(args[1]));

 JobClient.runJob(conf);
}
Run Code Online (Sandbox Code Playgroud)

我知道还有其他inputformat类型.但有没有一个完全符合我的要求?我觉得文档很模糊.如果有一个可用,那么Map函数输入类型应该如何?

提前致谢!

Nie*_*jes 8

解决方案是创建自己的FileInputFormat类来执行此操作.您可以从此FileInputFormat接收的FileSplit访问输入文件的名称(getPath).请务必否决FileInputformat的isSplitable以始终返回false.

您还需要一个自定义RecordReader,它将整个文件作为单个"Record"值返回.

处理太大的文件时要小心.您将有效地将整个文件加载到RAM中,并且任务跟踪器的默认设置是只有200MB RAM可用.