我有很大的不.对于小文件,我想使用CombineFileInputFormat合并文件,以便每个文件数据作为我的MR作业中的单个记录.我已经关注了http://yaseminavcular.blogspot.in/2011/03/many-small-input-files.html并尝试将其转换为新的api
我面临两个问题:
a)我只是用2个小文件测试它,仍然有2个映射器被激活.我期待1
b)每一行都是单个记录,我希望整个文件作为单个记录.
这可能会很痛苦,但请查看下面的代码.我在hadoop中仍然很天真
司机班
public class MRDriver extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
FileSystem fs = new Path(".").getFileSystem(getConf());
fs.printStatistics();
Job job = new Job(getConf());
job.setJobName("Enron MR");
job.setMapperClass(EnronMailReadMapper.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setNumReduceTasks(0);
job.setJarByClass(EnronMailReadMapper.class);
RawCombineFileInputFormat.addInputPath(job, new Path(args[0]));
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path(args[1]));
return job.waitForCompletion(true) ? 0 :1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new MRDriver(), args);
System.exit(exitCode);
}
Run Code Online (Sandbox Code Playgroud)
}
下面的类主要是LineRecordReader的复制粘贴,修改了initialize()和nextKeyValue()函数
public class SingleFileRecordReader extends RecordReader<LongWritable, Text> { …Run Code Online (Sandbox Code Playgroud) 在火花中,我理解如何使用wholeTextFiles和textFiles,但我不知道何时使用.这是我目前所知道的:
wholeTextFiles,否则使用textFiles. 我会在默认情况下,想wholeTextFiles和textFiles按文件内容的分区,并通过线,分别.但是,它们都允许您更改参数minPartitions.
那么,更改分区如何影响这些处理的方式呢?
例如,假设我有一个包含100行的非常大的文件.处理它wholeTextFiles与100个parti 之间的区别,并textFile使用默认的parition 100将其处理为(逐行分区).
这些有什么区别?