为分区器输出单个文件

5ktev3wc  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(338)

试着得到尽可能多的钥匙

public class CustomPartitioner extends Partitioner<Text, Text>
{
    public int getPartition(Text key, Text value,int numReduceTasks)
   {
        System.out.println("In CustomP");
       return (key.toString().hashCode()) % numReduceTasks;
   }
}

驾驶员等级

job6.setMapOutputKeyClass(Text.class);
job6.setMapOutputValueClass(Text.class);
job6.setOutputKeyClass(NullWritable.class);
job6.setOutputValueClass(Text.class);
job6.setMapperClass(LastMapper.class);
job6.setReducerClass(LastReducer.class);
job6.setPartitionerClass(CustomPartitioner.class);
job6.setInputFormatClass(TextInputFormat.class);
job6.setOutputFormatClass(TextOutputFormat.class);

但我在一个文件里得到了出口。
我做错什么了吗

kcwpcxri

kcwpcxri1#

维尼,你需要按照下面的步骤来完成任务

Mapper1 --> Reducer --> Mapper2 (Post Processing Mapper which creates
file for Each key)

mapper2是inputformat应该是nlineinputformat,所以reducer的输出就是每个键都会有相应的mapper,而mapper的输出将是每个键的一个单独的文件。
mapper 1和reducer是您现有的mr工作。
希望这有帮助。
干杯
抱怨

nfg76nw0

nfg76nw02#

您需要指定reduce任务的数量,该数量等于键的数量,并且还需要基于键的in partitioner类返回分区。例如,如果您的输入有4个键(这里是木头、砖石、钢筋混凝土等),那么getpartition方法如下所示。。

public int getPartition(Text key, PairWritable value, int numReduceTasks) {
        // TODO Auto-generated method stub

        String s = value.getone();

        if (numReduceTasks ==0){
            return 0;
        }

        if(s.equalsIgnoreCase("wood")){

            return 0;
        }

        if(s.equalsIgnoreCase("Masonry")){
            return 1%numReduceTasks;
        }

        if(s.equalsIgnoreCase("Reinforced Concrete")){
            return 2%numReduceTasks;
        }
        if(s.equalsIgnoreCase("Reinforced Masonry")){
            return 3%numReduceTasks;
        }

        else
            return 4%numReduceTasks;

    }   

}

相应的输出将被收集到相应的减速器中..请尝试在cli中运行,而不是在eclipse中运行

wwtsj6pe

wwtsj6pe3#

您尚未配置要运行的减速器的数量。
您可以使用下面的api配置它
作业集(10)//根据您的群集更改号码
另外,可以在从命令行执行时设置
-d mapred.reduce.tasks=10
希望这有帮助。

tpgth1q7

tpgth1q74#

如果不指定减速机的编号,则无法控制减速机的编号:-)。但是仍然不能保证在不同的reducer上获得所有的键,因为您不确定在输入数据中会得到多少不同的键,并且哈希分区函数可能会为两个不同的键返回相同的数字。如果您想实现您的解决方案,那么您必须事先知道不同键的数量,然后相应地修改分区函数。

相关问题