Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 多个减速器和一个输出文件_Hadoop_Mapreduce - Fatal编程技术网

Hadoop 多个减速器和一个输出文件

Hadoop 多个减速器和一个输出文件,hadoop,mapreduce,Hadoop,Mapreduce,在我的hadoop代码中,我有4个reducer,我总是有4个输出文件,这很正常,因为每个reducer将其结果放在一个文件中。 我在这里的问题是:我怎么能有一个且只有一个输出文件 问题是,我有一个迭代的mapreduce作业,它接受一个输入文件,将其划分为chunck,并将每个chunck交给一个映射器,因此我必须收集所有的约简器结果,并将它们放在一个输出文件中,以便以相同的方式将该输出文件划分为4个部分,然后将每个零件交给一个映射器,依此类推。您可以很好地配置所需的减速器数量。 在定义作业时

在我的hadoop代码中,我有4个reducer,我总是有4个输出文件,这很正常,因为每个reducer将其结果放在一个文件中。 我在这里的问题是:我怎么能有一个且只有一个输出文件


问题是,我有一个迭代的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对集群中的所有机器都进行全局操作,对吗?你的第二个建议是什么:跳过划分成块是什么意思?如果我不这样做,那么我可以通过多个映射器处理数据吗?谢谢你回答了一个类似的问题。也许你想检查一下,再读一遍问题。他想要不止一个减速机事实上是的,我需要不止一个减速机,但只有一个生成的输出文件!!!你知道怎么做吗?哦!!我的任命。我不知道怎么做。请再读一遍问题。他想要不止一个减速机事实上是的,我需要不止一个减速机,但只有一个生成的输出文件!!!你知道怎么做吗?哦!!我的同位语。我不知道怎么做。谢谢你的这个主意,但是用多个减缩器同时附加文件名怎么样?这会不会引起问题?因为我想这是一个同步的问题,不是吗?谢谢你的这个想法,但是用多个还原器同时附加文件名怎么样?这会不会引起问题?因为我想这是一件大事,不是吗?