2014-06-17 2 views
1

하둡 스트리밍 대 버퍼링의 차이점은 누군가 나에게 설명해 주시겠습니까? 여기 하둡 버퍼링 vs 스트리밍

내가 하이브에서 읽은 맥락이다 : 다른 버퍼링 반면

모든지도에서/감속기를 통해 조인 시퀀스의 마지막 테이블 스트리밍의 단계를 줄일 수 있습니다. 따라서 가장 큰 테이블이 시퀀스의 맨 마지막에 나타나도록 테이블을 구성하여 조인 키의 특정 값에 대한 행을 버퍼링하기 위해 감속기에 필요한 메모리를 줄이는 것이 좋습니다. 예 : in :

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 

답변

2

하둡 스트리밍은 일반적으로 맞춤형 파이썬 또는 쉘 스크립트를 사용하여지도 - 감소 논리를 수행하는 것을 말합니다. (예 : Hive TRANSFORM 키워드 사용)

이 컨텍스트에서 Hadoop 버퍼링은 레코드가 감속기로 읽혀질 때 조인이있는 하이브 쿼리의 맵 축소 작업의 단계를 말합니다. 정렬되고 그룹화되어 매퍼에서 나옵니다. 저자는 하이브 쿼리에서 조인 절을 순서 지정해야하는 이유를 설명하므로 가장 큰 테이블이 마지막입니다. Hive에서 조인의 구현을 최적화하는 데 도움이되기 때문입니다.

완전히 다른 개념입니다. 귀하의 의견에

응답에서

: 하이브의 가입 구현에서

, 그것은 여러 테이블에서 기록을 조인 키별로 정렬 한 다음 적절한 순서로 둘을 대조해야합니다. 다른 테이블로 그룹화 된 것을 읽어야하기 때문에 다른 테이블의 그룹을보고 모든 테이블을 보았 으면이를 처리하기 시작해야합니다. 첫 번째 테이블의 첫 번째 그룹은 마지막 테이블이 표시 될 때까지 처리 할 수 ​​없기 때문에 버퍼링해야합니다 (메모리에 유지). 마지막 테이블은 다른 테이블 그룹이 메모리에 있고 연결이 시작될 수 있기 때문에 스트리밍 될 수 있습니다 (각 행은 읽혀지면서 처리됩니다).

+0

HQL을 실행하는 동안 사용자 정의 파이썬 스크립트를 작성하지 않으므로 마지막 테이블을 조인에 얼마나 정확하게 스트리밍하고 있는가? – HadoopEvangelist

+0

좋아요, 그래서 당신이 정말로 묻는 것은 하이브의 조인 구현에 대해 이야기 할 때 스트리밍과 버퍼링이 무엇을 의미하는지, 그리고이를 최적화하는 방법입니다. 나는이 용어들이 상당히 오버로드되어 있다고 생각한다. –

+0

하이브의 조인 구현에서 여러 테이블의 레코드를 가져 와서 조인 키로 정렬 한 다음 적절한 순서로 함께 조합해야합니다. 다른 테이블로 그룹화 된 것을 읽어야하기 때문에 다른 테이블의 그룹을보고 모든 테이블을 보았 으면이를 처리하기 시작해야합니다. 첫 번째 테이블의 첫 번째 그룹은 마지막 테이블이 표시 될 때까지 처리 할 수 ​​없기 때문에 버퍼링해야합니다 (메모리에 유지). 마지막 테이블은 다른 테이블 그룹이 메모리에 있고 연결이 시작될 수 있기 때문에 스트리밍 될 수 있습니다 (각 행은 읽혀지면서 처리됩니다). –

3

축소 측 결합에서는 여러 테이블의 값에 종종 감속기 단계에서 해당 테이블을 식별하는 태그가 지정됩니다. 전화를 줄이기에

이 두 테이블과 관련된 혼합 값이 반복됩니다

두 테이블의 경우를 생각해 보자.

반복하는 동안 태그/테이블 중 하나의 값이 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)

관련 문제