복붙노트

[HADOOP] 하둡 버퍼링 vs 스트리밍

HADOOP

하둡 버퍼링 vs 스트리밍

누군가 Hadoop Streaming과 Buffering의 차이점이 무엇인지 설명해 주시겠습니까?

Hive에서 읽은 컨텍스트는 다음과 같습니다.

조인의 모든 맵 / 감소 단계에서 시퀀스의 마지막 테이블은 리듀서를 통해 스트리밍되고 다른 테이블은 버퍼링됩니다. 따라서 가장 큰 테이블이 시퀀스의 마지막에 표시되도록 테이블을 구성하여 특정 조인 키 값에 대해 행을 버퍼링하기 위해 리듀서에 필요한 메모리를 줄이는 데 도움이됩니다. 예 : 에서:

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

해결법

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

    1.리 듀스 사이드 조인에서 여러 테이블의 값은 종종 오는 테이블의 리듀서 단계에서 값을 식별하기 위해 태그가 지정됩니다.

    리 듀스 사이드 조인에서 여러 테이블의 값은 종종 오는 테이블의 리듀서 단계에서 값을 식별하기 위해 태그가 지정됩니다.

    두 테이블의 경우를 고려하십시오.

    호출을 줄이면 두 테이블과 연관된 혼합 값이 반복됩니다.

    반복하는 동안 태그 / 테이블 중 하나의 값이 로컬로 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 a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

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

    2.하둡 스트리밍은 일반적으로 사용자 정의 파이썬 또는 셸 스크립트를 사용하여 맵 감소 논리를 수행하는 것을 말합니다. (예 : Hive TRANSFORM 키워드 사용)

    하둡 스트리밍은 일반적으로 사용자 정의 파이썬 또는 셸 스크립트를 사용하여 맵 감소 논리를 수행하는 것을 말합니다. (예 : Hive TRANSFORM 키워드 사용)

    이러한 맥락에서 하둡 버퍼링은 매퍼에서 정렬 및 그룹화 한 후 레코드가 리듀서로 읽혀질 때 조인이있는 Hive 쿼리의 맵 감소 작업의 단계를 나타냅니다. 저자는 가장 큰 테이블이 마지막이되도록 Hive 쿼리에서 조인 절을 정렬해야하는 이유를 설명합니다. Hive에서 조인 구현을 최적화하는 데 도움이되기 때문입니다.

    그것들은 완전히 다른 개념입니다.

    귀하의 의견에 대한 답변 :

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

  3. from https://stackoverflow.com/questions/24265846/hadoop-buffering-vs-streaming by cc-by-sa and MIT license