Hadoop 多个减速器和一个输出文件
在我的hadoop代码中,我有4个reducer,我总是有4个输出文件,这很正常,因为每个reducer将其结果放在一个文件中。 我在这里的问题是:我怎么能有一个且只有一个输出文件Hadoop 多个减速器和一个输出文件,hadoop,mapreduce,Hadoop,Mapreduce,在我的hadoop代码中,我有4个reducer,我总是有4个输出文件,这很正常,因为每个reducer将其结果放在一个文件中。 我在这里的问题是:我怎么能有一个且只有一个输出文件 问题是,我有一个迭代的mapreduce作业,它接受一个输入文件,将其划分为chunck,并将每个chunck交给一个映射器,因此我必须收集所有的约简器结果,并将它们放在一个输出文件中,以便以相同的方式将该输出文件划分为4个部分,然后将每个零件交给一个映射器,依此类推。您可以很好地配置所需的减速器数量。 在定义作业时
问题是,我有一个迭代的mapreduce作业,它接受一个输入文件,将其划分为chunck,并将每个chunck交给一个映射器,因此我必须收集所有的约简器结果,并将它们放在一个输出文件中,以便以相同的方式将该输出文件划分为4个部分,然后将每个零件交给一个映射器,依此类推。您可以很好地配置所需的减速器数量。 在定义作业时,请使用此
job.setNumReduceTasks(1)您可以很好地配置所需的减速器数量。 在定义作业时,请使用此
job.setNumReduceTasks(1)您可以尝试
多路输出
,在这里您可以指定每个减速机应该写入的输出文件。
例如,在减速器代码中:
...
public void setup(Context context) {
out = new MultipleOutputs<YourKey,YourValue>(context);
}
public void reduce(YourKey key, Iterable<YourValue> values, Context context)
throws IOException, InterruptedException {
.......
//instead of writing using context, use multipleoutput here
//context.write(key, your-result);
out.write(key, your-result,"path/filename");
}
public void cleanup(Context context) throws IOException,InterruptedException {
out.close();
}
.....
在这种情况下,每个减速机的输出都将写入
输出/path/filename
您可以尝试多路输出
,在这里您可以指定每个减速机应该写入的输出文件。
例如,在减速器代码中:
...
public void setup(Context context) {
out = new MultipleOutputs<YourKey,YourValue>(context);
}
public void reduce(YourKey key, Iterable<YourValue> values, Context context)
throws IOException, InterruptedException {
.......
//instead of writing using context, use multipleoutput here
//context.write(key, your-result);
out.write(key, your-result,"path/filename");
}
public void cleanup(Context context) throws IOException,InterruptedException {
out.close();
}
.....
在这种情况下,每个导出器的输出都将写入
输出/path/filename
我可能错了,但我认为您不能这样做。为什么不只使用一个reducer?使用一个reducer对我的应用程序不好,因为我想从集群和资源(映射器和reducer)中获益!所以这是不可能的?我已经搜索了很长时间,但我不知道如何解决它没有一个工作,聚集所有的输出文件!!也许有一种方法可以从源代码中调用hadoop dfs-getmerge
,在本地将输出作为一个文件,然后hadoop dfs-copyFromLocal
将其放回集群?另一个解决方案可能是在第一次迭代后跳过对你的提议的划分,但是为什么是局部的呢?据我所知,dfs对集群中的所有机器都进行全局操作,对吗?你的第二个建议是什么:跳过划分成块是什么意思?如果我不这样做,那么我可以通过多个映射器处理数据吗?谢谢你回答了一个类似的问题。也许你想检查一下,我可能错了,但我想你做不到。为什么不只使用一个reducer?使用一个reducer对我的应用程序不好,因为我想从集群和资源(映射器和reducer)中获益!所以这是不可能的?我已经搜索了很长时间,但我不知道如何解决它没有一个工作,聚集所有的输出文件!!也许有一种方法可以从源代码中调用hadoop dfs-getmerge
,在本地将输出作为一个文件,然后hadoop dfs-copyFromLocal
将其放回集群?另一个解决方案可能是在第一次迭代后跳过对你的提议的划分,但是为什么是局部的呢?据我所知,dfs对集群中的所有机器都进行全局操作,对吗?你的第二个建议是什么:跳过划分成块是什么意思?如果我不这样做,那么我可以通过多个映射器处理数据吗?谢谢你回答了一个类似的问题。也许你想检查一下,再读一遍问题。他想要不止一个减速机事实上是的,我需要不止一个减速机,但只有一个生成的输出文件!!!你知道怎么做吗?哦!!我的任命。我不知道怎么做。请再读一遍问题。他想要不止一个减速机事实上是的,我需要不止一个减速机,但只有一个生成的输出文件!!!你知道怎么做吗?哦!!我的同位语。我不知道怎么做。谢谢你的这个主意,但是用多个减缩器同时附加文件名怎么样?这会不会引起问题?因为我想这是一个同步的问题,不是吗?谢谢你的这个想法,但是用多个还原器同时附加文件名怎么样?这会不会引起问题?因为我想这是一件大事,不是吗?