Как использовать MultipleTextOutputFormat с использованием нового API Hadoop? - PullRequest
4 голосов
/ 08 июня 2011

Я хотел бы написать несколько выходных файлов. Как мне сделать это, используя Job вместо JobConf?

Ответы [ 2 ]

1 голос
/ 05 ноября 2014

простой способ создания имен выходных файлов на основе ключей

 input data type

  //key        //value
 cupertino   apple
 sunnyvale   banana
 cupertino   pear

MultipleTextOutputFormat class

static class KeyBasedMultipleTextOutputForma extends MultipleTextOutputFormat<Text, Text> {
    @Override
    protected String generateFileNameForKeyValue(Text key, Text value, String name) {
        return key.toString() + "/" + name;
    }
} 

job config

 job.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);

Запустите этот код и выВы увидите следующие файлы в HDFS, где / output - каталог вывода задания:

 $ hadoop fs -ls /output
 /output/cupertino/part-00000
 /output/sunnyvale/part-00000

надеется, что это поможет.

0 голосов
/ 08 июня 2011

В документах сказано использовать org.apache.hadoop.mapreduce.lib.output.MultipleOutputs вместо.

Ниже приведен фрагмент кода, который использует MultipleOutputs. К сожалению, я не писал это и не проводил много времени с этим ... Так что я не знаю точно, почему вещи где. Я разделяю с надеждами, что это помогает. :)

Настройка задания

job.setJobName("Job Name");
job.setJarByClass(ETLManager.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setMapOutputValueClass(MyThing.class);
job.setMapperClass(MyThingMapper.class);
job.setReducerClass(MyThingReducer.class);
MultipleOutputs.addNamedOutput(job, Constants.MyThing_NAMED_OUTPUT, TextOutputFormat.class, NullWritable.class, Text.class);
job.setInputFormatClass(MyInputFormat.class);
FileInputFormat.addInputPath(job, new Path(conf.get("input")));
FileOutputFormat.setOutputPath(job, new Path(String.format("%s/%s", conf.get("output"), Constants.MyThing_NAMED_OUTPUT)));

Настройка редуктора

public class MyThingReducer extends
    Reducer<Text, MyThing, NullWritable, NullWritable> {
    private MultipleOutputs     m_multipleOutputs;

     @Override
    public void setup(Context context) {
        m_multipleOutputs = new MultipleOutputs(context);
    }
    @Override
    public void cleanup(Context context) throws IOException,
            InterruptedException {
        if (m_multipleOutputs != null) {
            m_multipleOutputs.close();
        }
    }

    @Override
    public void reduce(Text key, Iterable<MyThing> values, Context context)throws IOException, InterruptedException {
        for (MyThing myThing : values) {
            m_multipleOutputs.write(Constants.MyThing_NAMED_OUTPUT, EMPTY_KEY, generateData(context, myThing), generateFileName(context, myThing));
            context.progress();
        }
    }
}

РЕДАКТИРОВАТЬ: Добавлена ​​ссылка на несколько выходов.

...