복붙노트

[HADOOP] 하둡-값없이 텍스트 출력을 수집하는 방법

HADOOP

하둡-값없이 텍스트 출력을 수집하는 방법

나는 맵 감소 작업을하고 있는데 출력 파일에 사용자 정의 문자열을 생성 할 수 있는지 궁금합니다. 숫자도없고 다른 수량도없고 한 방울의 텍스트 만 있습니다.

Im이 생각하고있는 기본 아이디어는 다음과 같습니다.

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        // this map doesn't do very much
        String line = value.toString();
        word.set(line);
        // emit to map output
        output.collect(word,one);

        // but how to i do something like output.collect(word)
        // because in my output file I want to control the text 
        // this is intended to be a map only job
    }
}

이런 종류의 일이 가능합니까? 이것은 병렬 처리를 위해 hadoop을 사용하여 데이터를 변환하는 맵 전용 작업을 작성하지만 반드시 전체 MR 프레임 워크는 아닙니다. 이 작업을 실행할 때 각 매퍼마다 hdfs로 출력 파일을 얻습니다.

$ hadoop fs -ls /Users/dwilliams/output
2013-09-15 09:54:23.875 java[3902:1703] Unable to load realm info from SCDynamicStore
Found 12 items
-rw-r--r--   1 dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_SUCCESS
drwxr-xr-x   - dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_logs
-rw-r--r--   1 dwilliams supergroup    7223469 2013-09-15 09:52 /Users/dwilliams/output/part-00000
-rw-r--r--   1 dwilliams supergroup    7225393 2013-09-15 09:52 /Users/dwilliams/output/part-00001
-rw-r--r--   1 dwilliams supergroup    7223560 2013-09-15 09:52 /Users/dwilliams/output/part-00002
-rw-r--r--   1 dwilliams supergroup    7222830 2013-09-15 09:52 /Users/dwilliams/output/part-00003
-rw-r--r--   1 dwilliams supergroup    7224602 2013-09-15 09:52 /Users/dwilliams/output/part-00004
-rw-r--r--   1 dwilliams supergroup    7225045 2013-09-15 09:52 /Users/dwilliams/output/part-00005
-rw-r--r--   1 dwilliams supergroup    7222759 2013-09-15 09:52 /Users/dwilliams/output/part-00006
-rw-r--r--   1 dwilliams supergroup    7223617 2013-09-15 09:52 /Users/dwilliams/output/part-00007
-rw-r--r--   1 dwilliams supergroup    7223181 2013-09-15 09:52 /Users/dwilliams/output/part-00008
-rw-r--r--   1 dwilliams supergroup    7223078 2013-09-15 09:52 /Users/dwilliams/output/part-00009

1 파일로 결과를 얻으려면 어떻게합니까? 신원 감쇄기를 사용해야합니까?

해결법

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

    1.1. output.collect (word)를 달성하기 위해 NullWritable 클래스를 사용할 수 있습니다. 그렇게하려면 Mapper에서 output.collect (word, NullWritable.get ())을 사용해야합니다. NullWritable은 싱글 톤입니다.

    1. output.collect (word)를 달성하기 위해 NullWritable 클래스를 사용할 수 있습니다. 그렇게하려면 Mapper에서 output.collect (word, NullWritable.get ())을 사용해야합니다. NullWritable은 싱글 톤입니다.

    2. 여러 파일을 원하지 않는 경우 리듀서 수를 1로 설정할 수 있습니다. 그러나 네트워크를 통해 많은 양의 데이터가 뒤섞여 추가 오버 헤드가 발생합니다. 이유는 Reducer가 Mappers가 실행되는 다른 시스템에서 입력을 가져와야한다는 것입니다. 또한 모든 부하는 하나의 기계에만 전달됩니다. 그러나 하나의 출력 파일을 원할 경우 하나의 mReducer를 사용할 수 있습니다. conf.setNumReduceTasks (1)이이를 달성하기에 충분해야합니다.

    몇 가지 작은 제안 :

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

    2.맵 전용 작업 인 경우 출력 파일 수는 매퍼 수와 같습니다. 감속기가 필요한 경우 감속기의 수와 같습니다. 그러나 항상 hadoop dfs -getmerge 을 수행하여 출력 디렉토리의 모든 출력을 하나의 파일로 병합 할 수 있습니다.

    맵 전용 작업 인 경우 출력 파일 수는 매퍼 수와 같습니다. 감속기가 필요한 경우 감속기의 수와 같습니다. 그러나 항상 hadoop dfs -getmerge 을 수행하여 출력 디렉토리의 모든 출력을 하나의 파일로 병합 할 수 있습니다.

    job.setOutputFormat (TextOutputFormat.class)와 같이 TextOutputFormat을 사용하여 일반 텍스트 파일을 출력 할 수 있습니다. 그런 다음 OutputCollector 및 output.collect (null, "some text")를 사용하도록 위의 맵 메소드를 변경하십시오. 모든 레코드에 대한 텍스트를 작성합니다. 탭으로 구분 된 키-값을 원하는 경우이를 OutputCollector 및 output.collect ( "key", "일부 텍스트")로 변경할 수 있습니다. 이것은 출력에 키 일부 텍스트를 인쇄합니다.

  3. from https://stackoverflow.com/questions/18814359/hadoop-how-to-collect-text-output-without-values by cc-by-sa and MIT license