Writeable 데이터 유형을 변경해야하는 이유는 무엇입니까? Map, Combine, Shuffle 또는 Reduce 프로세스의 Key/Value에 대한 데이터 유형으로 Text (vs String)을 사용하면 어떤 이점이 있습니까?Writeable 데이터 유형이 왜 변경 가능해야합니까?
감사 & 안부, 라자는
Writeable 데이터 유형을 변경해야하는 이유는 무엇입니까? Map, Combine, Shuffle 또는 Reduce 프로세스의 Key/Value에 대한 데이터 유형으로 Text (vs String)을 사용하면 어떤 이점이 있습니까?Writeable 데이터 유형이 왜 변경 가능해야합니까?
감사 & 안부, 라자는
당신은 선택할 수 없습니다, 이러한 데이터 유형 는 변경할 수 있어야합니다.
이유는 직렬화 메커니즘입니다. 코드를 살펴 보겠습니다.
// version 1.x MapRunner#run()
K1 key = input.createKey();
V1 value = input.createValue();
while (input.next(key, value)) {
// map pair to output
mapper.map(key, value, output, reporter);
...
그래서 키/값 쌍의 동일한 인스턴스를 다시 사용하고 있습니다. 왜? 그 당시의 디자인 결정에 대해서는 알지 못합니다.하지만 가비지 오브젝트의 양을 줄이는 것으로 가정합니다. Hadoop은 꽤 오래된 것이었고 가비지 컬렉터는 오늘날과 같이 효율적이지 못했습니다. 그러나 오늘날에도 수십억 개의 오브젝트를 매핑하여 직접 쓰레기로 버리면 런타임에 큰 차이가납니다.
형식을 실제로 변경할 수없는 진짜 이유는 필드를 final
으로 선언 할 수 없다는 것입니다. 의는 IntWritable
와 간단한 예제를 만들어 보자 :
public class IntWritable implements WritableComparable {
private int value;
public IntWritable() {}
public IntWritable(int value) { set(value); }
...
당신이 value
마지막을 정의 할 필요가 있기 때문에 불변이 확실히 더 이상 직렬화 프로세스 작동하지 않을 것입니다 만들 것입니다 경우. 리플렉션을 통해 런타임에 키와 값이 인스턴스화되기 때문에 이는 작동하지 않습니다. 이 경우 기본 생성자가 필요하므로 InputFormat
은 최종 데이터 필드를 채우기 위해 필요한 매개 변수를 추측 할 수 없습니다. 따라서 인스턴스 재사용의 모든 개념은 분명히 불변성의 개념과 모순됩니다.
그러나 Map/Reduce에서 변경할 수없는 키/값이 어떤 이점을 가져야하는지 스스로 자문해야합니다. Joshua Bloch의 Effective Java 항목 15에서는 불변 클래스가 설계, 구현 및 사용하기가 더 쉽다고 말합니다.
void reduce(IntWritable key, Iterable<Text> values, Context context) ...
반복자의 모든 값이 same
공유 객체를 참조 : 하둡의 감속기는 가변성에 대한 최악의 예입니다 때문에 그는 권리입니다. 따라서 많은 사람들은 자신의 가치를 정상적인 컬렉션에 저장하고 왜 항상 같은 가치를 유지하는지 자신에게 물으면 혼란 스럽습니다.
결국 단순성과 비교하여 성능 (CPU 및 메모리 - 단일 키에 대한 수십억 개의 가치 객체가 RAM에 있어야 함)을 상쇄합니다.
간단히 말해서 Writable
에 Immutable
일 수없는 이유는 Writable
에 readFields(DataInput)
방법입니다. Hadoop
에서 인스턴스를 비 직렬화하여 기본 (인수 없음) 생성자를 사용하여 인스턴스를 만들고 readFields
을 호출하여 값을 구문 분석하는 방법. 값은 구성시 할당되지 않으므로 객체는 변경 가능해야합니다.
감사합니다. 직렬화/비 연속화 프로세스에 참여하기 위해 변경할 수있는 데이터 유형의 필요성을 명확히합니다. Hadoop은 어떤 단계에서 데 실링 처리 중에 어떤 단계에서 객체의 인스턴스를 만듭니다. 작업 당 하나의 개체가 실행됩니까? Mapper가 다중 스레드 인 경우 동일한 InputSplit의 필드를 병렬로 읽도록 여러 객체를 만들 수 있습니까? – Raja
나는 그것이 하나의 작업 당 하나라고 생각한다. deserialization 전에 Comparable 조회를 수행하기 위해 인스턴스를 작성합니다. 내가 아는 한, Hadoop은 단일 JVM 내에서 Mappers를 다중 쓰지 않습니다. 이것이 틀리면 알려주십시오. –
감사합니다. Thomas. Writable 데이터 유형이 변경 가능하도록 설계된 이유에 대한 설명이 나와 있습니다. 당신이 제공 한 Reduce 예제에 대해 자세히 설명 할 수 있습니까? Reduce가 항상 컬렉션 객체의 인스턴스 하나만 사용하고 값이 수정되지 않는다는 것을 의미합니까? – Raja
@Raja 콜렉션 객체가 없다면, 'Iterable'은 디스크상의 데이터에 대한 직접 프록시이며, 직렬화되고 항상 하나의 값 객체 만 리필됩니다. –