축소 측 결합에서는 여러 테이블의 값에 종종 감속기 단계에서 해당 테이블을 식별하는 태그가 지정됩니다. 전화를 줄이기에
이 두 테이블과 관련된 혼합 값이 반복됩니다
두 테이블의 경우를 생각해 보자.
반복하는 동안 태그/테이블 중 하나의 값이 arraylist에 로컬로 저장됩니다. (이것은 버퍼링입니다).
나머지 값은 스트리밍되고 다른 태그/테이블 값은 감지되지만 첫 번째 태그의 값은 저장된 arraylist에서 가져옵니다. 두 개의 태그 값이 결합되어 출력 수집기에 기록됩니다.
큰 테이블 값을 arraylist에 보관하면 arraylist가 컨테이너 JVM의 메모리를 압도하게되면 OOM이 발생할 수 있습니다.
void reduce(TextPair key , Iterator <TextPair> values ,OutputCollector <Text,Text> output ,Reporter reporter) throws IOException {
//buffer for table1
ArrayList <Text> table1Values = new ArrayList <Text>() ;
//table1 tag
Text table1Tag = key . getSecond();
TextPair value = null;
while(values . hasNext()){
value = values . next() ;
if(value.getSecond().equals(table1Tag)){
table1Values.add (value.getFirst());
}
else{
for(Text val : table1Values){
output.collect (key.getFirst() ,new Text(val.toString() + "\t"+ value.getFirst().toString()));
}
}
}
}
당신은 측면을 감소에 스트리밍 할 것 조인 된 테이블의 지정하려면 아래의 힌트를 사용할 수 있습니다
SELECT/* + STREAMTABLE (A) */a.val, b.val, c.val JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
HQL을 실행하는 동안 사용자 정의 파이썬 스크립트를 작성하지 않으므로 마지막 테이블을 조인에 얼마나 정확하게 스트리밍하고 있는가? – HadoopEvangelist
좋아요, 그래서 당신이 정말로 묻는 것은 하이브의 조인 구현에 대해 이야기 할 때 스트리밍과 버퍼링이 무엇을 의미하는지, 그리고이를 최적화하는 방법입니다. 나는이 용어들이 상당히 오버로드되어 있다고 생각한다. –
하이브의 조인 구현에서 여러 테이블의 레코드를 가져 와서 조인 키로 정렬 한 다음 적절한 순서로 함께 조합해야합니다. 다른 테이블로 그룹화 된 것을 읽어야하기 때문에 다른 테이블의 그룹을보고 모든 테이블을 보았 으면이를 처리하기 시작해야합니다. 첫 번째 테이블의 첫 번째 그룹은 마지막 테이블이 표시 될 때까지 처리 할 수 없기 때문에 버퍼링해야합니다 (메모리에 유지). 마지막 테이블은 다른 테이블 그룹이 메모리에 있고 연결이 시작될 수 있기 때문에 스트리밍 될 수 있습니다 (각 행은 읽혀지면서 처리됩니다). –