如何在一个mapreduce作业中实现多个reducer

ny6fqffe  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(669)

我有一个巨大的数据集,我需要为相同的数据执行不同的功能。我想要四个输出文件。因为四个操作是不同的,所以我可以使用四个分区器和四个还原器来实现相同的操作吗?有没有可能或者我需要写四个作业来完成这个任务?请帮帮我!

5anewei6

5anewei61#

第一种方法
我认为应该用一个独特的reduce方法实现代码,并根据执行的过程发出n个键。例如:实现a、b、c和d技术,然后在Map器中实现以下内容(伪代码):

dataA = ProcessA(key,value)
context.write("A", dataA)
dataB = ProcessB(key,value)
context.write("B", dataB)
dataC = ProcessC(key,value)
context.write("C", dataC)
dataD = ProcessD(key,value)
context.write("D", dataD)

您应该注意输出的数据类型。此外,输出键可能更复杂。
第二种方法
您可以在同一个java项目中生成n个mapreduce应用程序,然后重用map,并开发n个reducer。
job.setReducerClass 在每个主类中设置每个减速机。Map是一样的。

h9vpoimq

h9vpoimq2#

您只需要在mapreduce作业配置中指定reducer的数量。默认的分区器将根据指定的归约器的密钥模数的散列值将数据分发给归约器。
要覆盖默认分区器的行为,您可以实现自己的自定义分区器,指定数据应该如何传递到缩减器。
---编辑以回答评论部分中的问题---
如何在map reduce驱动程序中指定多个reducer类
要设置减速器的数量,在job conf中可以如下所示进行设置-

int numReducers = /*number of reducers you want*/;
job.setNumReduceTasks(numReducers);

我是否应该为此写四份不同的工作。或者我可以用一份工作来完成这个
hadoop mr作业是i/o密集型的,在mr作业设计中,您应该尽可能减少i/o和并行处理。
如果您的减速机需要相同的输入来生成所有4个输出,则最好保持单个作业,但另一个考虑因素可能是任何一个输出的数据偏斜。例如,output1有更多的处理时间+大部分传入数据可能会被output1处理。如果处理output1所花费的时间比处理output2+output3+output4所花费的总时间要高得多,那么您应该考虑将output1的处理分成多个步骤。
但是,如果我们认为所有4个输出都有或多或少相等的处理时间,并且在整个过程中使用相同的数据,那么最好在reducer中使用一些条件处理逻辑,并让您的自定义partioner决定将哪些数据发送到哪个reducer。
您的自定义partioner可以进行一些检查,比如这个传入的数据符合“gc内容”的条件,所以让它进入reducer 3。但如果您的传入数据需要处理多个输出/分发,请使用条件处理,并使用“multipleoutputs”从同一个reducer写入多个输出文件。你可以用谷歌搜索它并找到使用示例,它可以让你在同一时间从一个Map器或缩减器中把输出写到多个文件夹/文件中。

qvtsj1bj

qvtsj1bj3#

hadoop让您指定job driver job.setnumreducetasks(num_reducers);,中reducer任务的数量;。因为需要四个输出,所以可以指定 int num_reducers = 4; 下面是一个示例驱动程序类。

public class run {

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        Job job = new Job(conf, "Run NB Count");

        job.setJarByClass(NB_train_hadoop.class);
        // set mappers, reducers, other stuff
        job.setNumReduceTasks(num_reducers);

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

虽然这很方便,但您必须了解,有一个最佳数量的缩减器可以选择,这取决于集群中节点的数量。
例如,运行4个amazonm3.xlarge示例(一个示例有1个主示例、3个从示例和4个核心示例),在mapreduce作业中使用的reducer任务数和墙时间之间具有以下关系。你可以看到,越多并不一定越好,如果你用太多,那么你不妨用你妈妈的卷发器来处理你的数据,因为那样会更快。

希望这有帮助!!

相关问题