是否可以将mapreduce作业的输出拆分为多个文件,而不是单个“part-r-00000”文件?我遇到过multipleoutputformat类,但从我所读到的内容来看,它似乎只会根据键将输出分解成文件。多路输出格式我想要的是,以wordcount作业为例,将输出分成多个文件。
y4ekin9u1#
谢谢大家的建议。我的mapreduce工作实际上只是一个简单的搜索工作,map任务提取符合特定条件的输入行。然后简单地输出结果,而不需要执行任何reduce任务。最初我没有设置reduce tasks编号,从输出日志中我可以看到它默认为1。我试图设置一个更高的数字,但不知怎的,它确实产生了多个输出文件(第000xx部分),但只有一个输出文件将携带所有的结果,而其余的只是空文件。当我把它放在下面的时候,它就起作用了。每个reduce任务的输出都是最终的输出文件。我不确定这是否是正确的方法,但我现在就把它作为一个解决办法conf.set(“mapred.reduce.tasks”,“0”)
ffdz8vbo2#
我在字数方面也有类似的问题。在我的情况下,我需要把每个字母开头的单词写进不同的文件中 MultipleOutputs .
MultipleOutputs
public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> {private NameCountTuple result = null;private MultipleOutputs<Text,NameCountTuple> out; public void setup(Context context) { out = new MultipleOutputs<Text,NameCountTuple>(context); }public void reduce(Text key, Iterable<NameCountTuple> values, Context context) throws IOException, InterruptedException { int count = 0; for (HITuple val : values) { count += val.getCount(); } result.setCount(count); out.write(key, result,"outputpath/"+key.getText().charAt(0));}public void cleanup(Context context) throws IOException,InterruptedException { out.close(); }
public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> {
private NameCountTuple result = null;
private MultipleOutputs<Text,NameCountTuple> out;
public void setup(Context context) {
out = new MultipleOutputs<Text,NameCountTuple>(context);
}
public void reduce(Text key, Iterable<NameCountTuple> values, Context context)
throws IOException, InterruptedException {
int count = 0;
for (HITuple val : values) {
count += val.getCount();
result.setCount(count);
out.write(key, result,"outputpath/"+key.getText().charAt(0));
public void cleanup(Context context) throws IOException,InterruptedException {
out.close();
}在这里,它给出以下路径中的输出
outputpath/a /b /c .......
outputpath/a
/b
/c
.......
为此,你应该使用 LazyOutputFormat.setOutputFormatClass() 而不是 FileOutputFormat . 还需要添加作业配置 job.setOutputFormatClass(NullOutputFormat.class)
LazyOutputFormat.setOutputFormatClass()
FileOutputFormat
job.setOutputFormatClass(NullOutputFormat.class)
p3rjfoxz3#
原谅我,但通常你会得到尽可能多的part-r-nnnnn文件。如果字数计算示例只配置了一个reducer,那么您所要做的就是配置多个reducer(mapred.reduce.tasks或hadoop2等效程序)。
3条答案
按热度按时间y4ekin9u1#
谢谢大家的建议。
我的mapreduce工作实际上只是一个简单的搜索工作,map任务提取符合特定条件的输入行。然后简单地输出结果,而不需要执行任何reduce任务。
最初我没有设置reduce tasks编号,从输出日志中我可以看到它默认为1。我试图设置一个更高的数字,但不知怎的,它确实产生了多个输出文件(第000xx部分),但只有一个输出文件将携带所有的结果,而其余的只是空文件。
当我把它放在下面的时候,它就起作用了。每个reduce任务的输出都是最终的输出文件。我不确定这是否是正确的方法,但我现在就把它作为一个解决办法
conf.set(“mapred.reduce.tasks”,“0”)
ffdz8vbo2#
我在字数方面也有类似的问题。在我的情况下,我需要把每个字母开头的单词写进不同的文件中
MultipleOutputs
.}
在这里,它给出以下路径中的输出
为此,你应该使用
LazyOutputFormat.setOutputFormatClass()
而不是FileOutputFormat
. 还需要添加作业配置job.setOutputFormatClass(NullOutputFormat.class)
p3rjfoxz3#
原谅我,但通常你会得到尽可能多的part-r-nnnnn文件。如果字数计算示例只配置了一个reducer,那么您所要做的就是配置多个reducer(mapred.reduce.tasks或hadoop2等效程序)。