복붙노트

[HADOOP] 어떻게 하둡 맵에서 브로 출력이 감소 쓰기?

HADOOP

어떻게 하둡 맵에서 브로 출력이 감소 쓰기?

나는 TextInputFormat 입력을 받아, 브로 형식으로 출력 단어 개수로 생각 하나 개 하둡 단어 수 프로그램을 썼습니다.

지도 - 절감 작업이 잘 실행되고 있지만,이 작업의 출력은 유닉스가 더 많거나 VI와 같은 명령을 사용하여 읽을 수 있습니다. 나는 아 브로 출력이 바이너리 형식에서와 같이이 출력이 읽을 수 기다리고 있었다.

나는 감속기가 존재하지 만 매퍼를 사용했다. 난 그냥 아 브로 실험 할 그래서 메모리 또는 스택 오버 플로우에 대해 걱정하지입니다. 매퍼의 코드를 다음

public class WordCountMapper extends Mapper<LongWritable, Text, AvroKey<String>, AvroValue<Integer>> {

    private Map<String, Integer> wordCountMap = new HashMap<String, Integer>();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] keys = value.toString().split("[\\s-*,\":]");
        for (String currentKey : keys) {
            int currentCount = 1;
            String currentToken = currentKey.trim().toLowerCase();
            if(wordCountMap.containsKey(currentToken)) {
                currentCount = wordCountMap.get(currentToken);
                currentCount++;
            }
            wordCountMap.put(currentToken, currentCount);
        }
        System.out.println("DEBUG : total number of unique words = " + wordCountMap.size());
    }

    @Override
    protected void cleanup(Context context) throws IOException, InterruptedException {
        for (Map.Entry<String, Integer> currentKeyValue : wordCountMap.entrySet()) {
            AvroKey<String> currentKey = new AvroKey<String>(currentKeyValue.getKey());
            AvroValue<Integer> currentValue = new AvroValue<Integer>(currentKeyValue.getValue());
            context.write(currentKey, currentValue);
        }
    }
}

다음과 같이 및 드라이버 코드는 다음과 같습니다

public int run(String[] args) throws Exception {

    Job avroJob = new Job(getConf());
    avroJob.setJarByClass(AvroWordCount.class);
    avroJob.setJobName("Avro word count");

    avroJob.setInputFormatClass(TextInputFormat.class);
    avroJob.setMapperClass(WordCountMapper.class);

    AvroJob.setInputKeySchema(avroJob, Schema.create(Type.INT));
    AvroJob.setInputValueSchema(avroJob, Schema.create(Type.STRING));

    AvroJob.setMapOutputKeySchema(avroJob, Schema.create(Type.STRING));
    AvroJob.setMapOutputValueSchema(avroJob, Schema.create(Type.INT));

    AvroJob.setOutputKeySchema(avroJob, Schema.create(Type.STRING));
    AvroJob.setOutputValueSchema(avroJob, Schema.create(Type.INT));


    FileInputFormat.addInputPath(avroJob, new Path(args[0]));
    FileOutputFormat.setOutputPath(avroJob, new Path(args[1]));

    return avroJob.waitForCompletion(true) ? 0 : 1;
}

나는 아 브로 출력의 모습과 내가이 프로그램에 잘못을하고있는 중이 야 무엇을 수행하는 방법을 알고 싶습니다.

해결법

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

    1.아 브로 라이브러리의 최신 버전은 MRv2 채택 자신의 ColorCount 예제의 업데이트 된 예제를 포함하고 있습니다. 나는 당신이 그것을보고 그들이 클래스를 줄이거 나 단지 AvroMapper을 확장에서 사용하는 것과 동일한 패턴을 사용하는 것이 좋습니다. 대신 AvroKey + AvroValue의 쌍 클래스를 사용하는 것도 하둡에 브로를 실행하기위한 필수적인 있습니다.

    아 브로 라이브러리의 최신 버전은 MRv2 채택 자신의 ColorCount 예제의 업데이트 된 예제를 포함하고 있습니다. 나는 당신이 그것을보고 그들이 클래스를 줄이거 나 단지 AvroMapper을 확장에서 사용하는 것과 동일한 패턴을 사용하는 것이 좋습니다. 대신 AvroKey + AvroValue의 쌍 클래스를 사용하는 것도 하둡에 브로를 실행하기위한 필수적인 있습니다.

  2. from https://stackoverflow.com/questions/21876062/how-to-write-avro-output-in-hadoop-map-reduce by cc-by-sa and MIT license