복붙노트

[HADOOP] 두 개의 동일한 결합 키는 동일한 감속기에 도달하지 않습니다

HADOOP

두 개의 동일한 결합 키는 동일한 감속기에 도달하지 않습니다

MapReduce 프레임 워크를 사용하여 Java로 Hadoop 응용 프로그램을 만들고 있습니다.

입력 및 출력 모두에 텍스트 키와 값만 사용합니다. 최종 출력으로 줄이기 전에 결합기를 사용하여 추가 계산 단계를 수행합니다.

그러나 키가 동일한 감속기로 이동하지 않는다는 문제가 있습니다. 결합기에서 다음과 같이 키 / 값 쌍을 만들고 추가합니다.

public static class Step4Combiner extends Reducer<Text,Text,Text,Text> {
    private static Text key0 = new Text();
    private static Text key1 = new Text();

        public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
                key0.set("KeyOne");
                key1.set("KeyTwo");
                context.write(key0, new Text("some value"));
                context.write(key1, new Text("some other value"));
        }

}   

public static class Step4Reducer extends Reducer<Text,Text,Text,Text> {

            public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
                System.out.print("Key:" + key.toString() + " Value: ");
                String theOutput = "";
                for (Text val : values) {
                    System.out.print("," + val);
                }
                System.out.print("\n");

                context.write(key, new Text(theOutput));
            }

}

기본적으로 나는 다음과 같은 작업을 만듭니다.

Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

Job job4 = new Job(conf, "Step 4");
job4.setJarByClass(Step4.class);

job4.setMapperClass(Step4.Step4Mapper.class);
job4.setCombinerClass(Step4.Step4Combiner.class);
job4.setReducerClass(Step4.Step4Reducer.class);

job4.setInputFormatClass(TextInputFormat.class);
job4.setOutputKeyClass(Text.class);
job4.setOutputValueClass(Text.class);

FileInputFormat.addInputPath(job4, new Path(outputPath));
FileOutputFormat.setOutputPath(job4, new Path(finalOutputPath));            

System.exit(job4.waitForCompletion(true) ? 0 : 1);

감속기에서 인쇄 된 stdout의 출력은 다음과 같습니다.

Key:KeyOne Value: ,some value
Key:KeyTwo Value: ,some other value
Key:KeyOne Value: ,some value
Key:KeyTwo Value: ,some other value
Key:KeyOne Value: ,some value
Key:KeyTwo Value: ,some other value

키가 동일하기 때문에 의미가 없으므로 Iterable에 동일한 값을 가진 3 개의 감속기가 있어야합니다.

당신이 내가 이것의 바닥에 도달하도록 도울 수 있기를 바랍니다 :)

해결법

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

    1.이는 아마도 컴 바이 너가 맵과 축소 단계 (약간의 '기능')에서 실행되고 있기 때문일 것입니다.

    이는 아마도 컴 바이 너가 맵과 축소 단계 (약간의 '기능')에서 실행되고 있기 때문일 것입니다.

    기본적으로 컴 바이 너에서 키를 수정하고 있습니다.이 키는 맵 출력이 리듀서에 병합 될 때 실행되거나 실행되지 않을 수 있습니다. 결합기가 실행 된 후 (감소면) 키가 그룹화 비교기를 통해 공급되어 Iterable이 환원 방법으로 전달 된 값을 결정합니다 (여기서 감소 단계의 스트리밍 측면을 둘러싸고 있습니다-반복 가능은 백업되지 않습니다) 집합 또는 값 목록에 의해 iterator (). next ()에 대한 더 많은 호출은 그룹화 비교기가 현재 키를 결정하고 마지막 키가 동일한 경우 true를 반환합니다)

    Context (Context.getTaskAttempt (). isMap () 메소드가 있는지 검사하여 현재 결합기 위상 측 (지도 또는 축소)을 시도하고 감지 할 수 있지만이 문제가있는 메모리도 있습니다. 어딘가에 대한 JIRA 티켓).

    결론적으로, 컴바인 더가 감속면을 실행중인 경우이 동작을 무시할 수 없다면 컴 바이 너의 키를 수정하지 마십시오.

    편집하다 @Amar의 의견을 조사하면서 일부 비교기, 결합기, 감속기 등을 추가하는 코드 (pastebin link)를 결합했습니다. 단일 맵 작업을 실행하면 축소 단계에서 결합기가 실행되지 않고지도 출력이되지 않습니다. 이미 정렬되어 있다고 가정하여 다시 정렬했습니다.

    그것은 컴 바이 너 클래스로 전송되기 전에 정렬 될 때 정렬되는 것으로 가정되며, 키는 그대로 유지된다고 가정하므로 여전히 정렬되어 있습니다. 결합기는 주어진 키에 대한 값을 결합하기위한 것임을 기억하십시오.

    따라서 단일 맵과 지정된 결합기를 사용하면 감속기는 KeyOne, KeyTwo, KeyOne, KeyTwo, KeyOne 순서로 키를 봅니다. 그룹화 비교기는 그들 사이의 전환을보고 따라서 감소 함수에 대한 6 번의 호출을 얻습니다

    두 개의 매퍼를 사용하는 경우 리듀서는 두 개의 정렬 된 세그먼트 (각 맵에서 하나씩)가 있다는 것을 알고 있으므로 감소하기 전에이를 분류해야합니다. 그러나 세그먼트 수가 임계 값 아래이므로 정렬은 인라인 스트림 정렬 (다시 세그먼트가 정렬 된 것으로 가정). 두 개의 매퍼 (감소 단계에서 10 개의 레코드 출력)로 여전히 잘못된 출력입니다.

    다시 한번, 컴 바이 너의 키를 수정하지 마십시오. 이것은 컴 바이 너가 의도 한 것이 아닙니다.

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

    2.대신 결합기에서 시도하십시오.

    대신 결합기에서 시도하십시오.

    context.write(new Text("KeyOne"), new Text("some value"));
    context.write(new Text("KeyTwo"), new Text("some other value"));
    

    내가 그런 일이 일어나는 것을 보는 유일한 방법은 한 결합기의 key0이 다른 것의 key0과 같지 않은 경우입니다. 키가 정확히 동일한 인스턴스를 가리키는 경우 어떻게 작동하는지 잘 모르겠습니다 (키를 정적으로 만들면 어떻게 될까요).

  3. from https://stackoverflow.com/questions/14126964/two-equal-combine-keys-do-not-get-to-the-same-reducer by cc-by-sa and MIT license