복붙노트

[HADOOP] 하둡의 기본 정렬을 무시하는 방법

HADOOP

하둡의 기본 정렬을 무시하는 방법

나는 키가 1-200에서 숫자되는지도-감소 작업을해야합니다. 내 의도 출력은 숫자 순서 (숫자 값)이었다. 하지만 출력을 같이 받고 있어요 :

1    value
10   value
11   value
   :
   : 
2    value
20   value
   :
   :
3    value

나는 이것이의 기본 동작에 의한 알고 오름차순으로 키를 정렬하는지도-줄입니다.

내 키는 숫자 순으로 만 정렬하고 싶습니다. 이걸 어떻게 달성 할 수 있습니까?

해결법

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

    1.키가 IntWritable 인 경우 맵리 듀스 프레임 워크의 기본 WritableComparator은 정상적으로 수치 주문을 처리 할 것입니다. 나는 그것을 따라서 귀하의 경우 사전 편찬 순서의 결과로 텍스트 키를 점점 생각한다. 값을 방출하는 IntWritable 키를 사용하여 샘플 코드에서 참조하시기 바랍니다 :

    키가 IntWritable 인 경우 맵리 듀스 프레임 워크의 기본 WritableComparator은 정상적으로 수치 주문을 처리 할 것입니다. 나는 그것을 따라서 귀하의 경우 사전 편찬 순서의 결과로 텍스트 키를 점점 생각한다. 값을 방출하는 IntWritable 키를 사용하여 샘플 코드에서 참조하시기 바랍니다 :

    1) 매퍼 구현

    package com.stackoverflow.answers.mapreduce;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    public class SourceFileMapper extends Mapper<LongWritable, Text, IntWritable, Text> {
    
        private static final String DEFAULT_DELIMITER = "\t";
    
        private IntWritable keyToEmit = new IntWritable();
        private Text valueToEmit = new Text();
    
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            keyToEmit.set(Integer.parseInt(line.split(DEFAULT_DELIMITER)[0]));
            valueToEmit.set(line.split(DEFAULT_DELIMITER)[1]);
            context.write(keyToEmit, valueToEmit);
        }
    
    }
    

    2) 감속기 구현

    package com.stackoverflow.answers.mapreduce;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    public class SourceFileReducer extends Reducer<IntWritable, Text, IntWritable, Text> {
    
        public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException,
                InterruptedException {
            for (Text value : values) {
                context.write(key, value);
            }
        }
    
    }
    

    3) 드라이버 구현

    package com.stackoverflow.answers.mapreduce;
    
    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    
    public class SourceFileDriver {
    
        public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
    
            Path inputPath = new Path(args[0]);
            Path outputDir = new Path(args[1]);
    
            // Create configuration
            Configuration conf = new Configuration(true);
    
            // Create job
            Job job = new Job(conf, "SourceFileDriver");
            job.setJarByClass(SourceFileDriver.class);
    
            // Setup MapReduce
            job.setMapperClass(SourceFileMapper.class);
            job.setReducerClass(SourceFileReducer.class);
            job.setNumReduceTasks(1);
    
            // Specify key / value
            job.setOutputKeyClass(IntWritable.class);
            job.setOutputValueClass(Text.class);
    
            // Input
            FileInputFormat.addInputPath(job, inputPath);
            job.setInputFormatClass(TextInputFormat.class);
    
            // Output
            FileOutputFormat.setOutputPath(job, outputDir);
            job.setOutputFormatClass(TextOutputFormat.class);
    
            // Delete output if exists
            FileSystem hdfs = FileSystem.get(conf);
            if (hdfs.exists(outputDir))
                hdfs.delete(outputDir, true);
    
            // Execute job
            int code = job.waitForCompletion(true) ? 0 : 1;
            System.exit(code);
    
        }
    
    }
    

    감사합니다!

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

    2.내가 추측을해야한다면, 나는 당신이 IntWritable 객체를 텍스트 객체로 번호를 저장하고 있지 말 것.

    내가 추측을해야한다면, 나는 당신이 IntWritable 객체를 텍스트 객체로 번호를 저장하고 있지 말 것.

    하나 이상의 감속기를 일단 어느 쪽이든은, 감속기 내에서만 항목이 정렬됩니다 있지만 완전히 정렬되지 않습니다.

  3. from https://stackoverflow.com/questions/28898810/how-to-override-the-default-sorting-of-hadoop by cc-by-sa and MIT license