복붙노트

[HADOOP] 새 Hadoop API를 사용하여 MultipleTextOutputFormat을 사용하려면 어떻게해야합니까?

HADOOP

새 Hadoop API를 사용하여 MultipleTextOutputFormat을 사용하려면 어떻게해야합니까?

여러 개의 출력 파일을 작성하고 싶습니다. JobConf 대신 Job을 사용하여이 작업을 수행하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.키 기반 출력 파일 이름을 만드는 쉬운 방법

    키 기반 출력 파일 이름을 만드는 쉬운 방법

     input data type
    
      //key        //value
     cupertino   apple
     sunnyvale   banana
     cupertino   pear
    

    MultipleTextOutputFormat 클래스

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

    작업 구성

     job.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);
    

    이 코드를 실행하면 / output이 작업 출력 디렉토리 인 HDFS에 다음 파일이 표시됩니다.

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

    도움이되기를 바랍니다.

  2. ==============================

    2.문서는 대신 org.apache.hadoop.mapreduce.lib.output.MultipleOutputs를 사용한다고 말합니다.

    문서는 대신 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();
            }
        }
    }
    

    편집 : MultipleOutputs에 대한 링크를 추가했습니다.

  3. from https://stackoverflow.com/questions/6272307/how-do-i-use-the-multipletextoutputformat-using-the-new-hadoop-api by cc-by-sa and MIT license