전체 글 1383

Hive Mapper, Reduce 개수 최적화

Hive Mapper, Reduce 개수 최적화 · Version : Hive 하이브는 쿼리를 한 개 이상의 맵리듀스 잡으로 나누어 병렬로 처리한다. 맵리듀스는 다수의 맵퍼와 리듀서 태스크로 실행되는데 맵퍼와 리듀서의 수는 입력하는 데이터 크기, 데이터 수행 연산 종류 등 다양한 변수에 의존적이다. 너무 많은 맵퍼와 리듀서 태스크는 잡을 초기화 하고, 스케줄링하고 실행하기 위해 많은 오버헤드를 유발한다. 반대로 너무 적은 태스크는 클러스터가 가진 병렬처리의 장점을 잘 활용하지 못하게 된다. 리듀스 단계가 있는 하이브 쿼리를 실행하면 리듀서 수를 출력한다. GROUP BY는 항상 리듀서 단계가 필요하기 때문에 해당 구문이 포함한스크립트를 실행하면 사용된 맵퍼와 리듀서의 개수를 확인할 수 있다. INFO :..

HDFS Cluster Balancing(데이터 블록 분포의 불균형 해소)

HDFS Cluster Balancing(데이터 블록 분포의 불균형 해소) · Version : HDFS HDFS 시스템은 여러대의 노드가 클러스터로 동작하기 때문에 시간이 지날수록 데이터 노드의 블록 분포에 대한 불균형이 발생할 수 있다. 불균형 상태의 클러스터는 맵리듀스의 로컬리티에 영향을 주기 때문에 자주 사용되는 데이터노드에 더 많은 부하를 주게 된다. 따라서 이러한 블록의 불균형 분포를 해결하기 위해 밸런서 작업으로 블록을 재분배 하여 전체적으로 블록을 고르게 유지할 수 있도록 다른 노드로 블록을 이동한다. 이때 데이터 유실을 방지하기 위해 데이터 블록 복제본의 배치전략은 유지된다. 밸런서를 실행하는 명령은 아래와 같다. sudo -u hdfs hdfs balancer 각 노드의 균형은 노드들의..

Hive LIMIT 튜닝 (데이터 샘플링으로 빠르게 응답하기)

Hive LIMIT 튜닝 (데이터 샘플링으로 빠르게 응답하기) · Version : Hive 하이브에서 현재 저장되어 있는 데이터의 일부분을 확인하려고 LIMIT 절을 자주 사용한다. RDB의 경우 데이터를 ROW단위로 읽기때문에(정확히는 페이지 단위) ROW단위로 처리하면서LIMIT 의 결과를 (Sort, Group 등 연산을 하지 않았을 경우) 빠르게 응답할 수 있다. 하지만 하이브의 경우 데이터 전체에 대해 쿼리를 수행하고 일부 결과만을 반환하기 때문에 불필요한 리소스 낭비가 크다. 그래서 최대한 LIMIT 명령을 피하는 것이 좋다. 만약 limit를 자주 사용할 경우 hive-site.xml 파일에서 hive.limit.optimize.enable설정을 통해서 LIMIT를 사용할 경우 원본 데이터..

HDFS 데이터노드 블록 스캐너 (손상된 블록을 검색하여 수정)

HDFS 데이터노드 블록 스캐너 (손상된 블록을 검색하여 수정) · Version : HDFS HDFS 에서 데이터를 쓰거나 읽을때 체크섬을 사용하여 데이터 손상을 확인하고 수정한다. 이러한 작업으로 데이터 손상을 감지 할 수 있지만 해당 작업은 데이터를 쓰거나 읽을때만 발생하므로 클라이언트가 데이터를 요청하기 전에는 손상된 부분을 찾는것이 쉽지 않다. 이러한 손상된 부분을 찾기 위해 모든 데이터노드는 블록스캐너를 실행하여 데이터노드에 저장된 모든 블록을 주기적으로 점검한다. 이 작업으로 문제 있는 블록은 클라이언트가 읽기 전에 삭제하거나 수정한다. 데이터 블록 스캐너는 점검할 블록 리스트를 관리하며 체크섬 오류를 찾기 위해 모든 블록들을 점검한다. 스캐너는 데이터노드의 디스크 대역폭을 보존하기 위한 조..

Hive EXPLAIN (실행계획) 사용

Hive EXPLAIN (실행계획) 사용 · Version : Hive 하이브에서 EXPLAIN 명령을 사용하면 실행계획을 확인할 수 있다. 즉, 쿼리를 어떻게 맵리듀스 잡으로 변환하지를 살펴 볼 수 있다. 실행계획을 사용하는 방법은 아래 스크립트 처럼 쿼리문 앞에 EXPLAIN 명령을 함께 실행한다. EXPLAIN SELECT col_1, date_local, count(*) as cnt FROM tbl_a where col_1 = 'aaa.com' group by date_local, col_1; 아래 실행 계획은 위 쿼리를 실행하였을때 반환된 결과이다. 1 STAGE DEPENDENCIES: 2 Stage-1 is a root stage 3 Stage-0 depends on stages: Stage..

Hive 인덱스(index)

Hive 인덱스(index) · Version : Hive 하이브 인덱스는 연산 속도를 향상시키기 위해 컬럼에 인덱스를 생성할 수 있으나, RDBMS의 인덱스랑 다르게 기능이 많이 제한적이다. 하이브는 인덱스 데이터를 원본 테이블이 아닌 별도 테이블에 저장한다. 그래서 인덱스 생성시 별도의 디스크 공간이 필요하고 생성에 따른 비용이 발생한다. 그래서 인덱스를 생성할때 사용 유무 및 효율을 잘 고려해서 생성해야 한다. 하지만 하이브에서 인덱스는 논리적 파티션의 크기가 작고 개수가 많은 경우 파티셔닝을 대신해서 사용할 수 있으며, 맵리듀스의 잡의 입력으로 사용할 테이블 블록을 푸루닝(pruning)하는데 도움을 줄 수 있다. 위에서 언급했듯이 모든 쿼리가 인덱스로 효율적인 것은 아니므로 실행계획을 분석하여 ..

Hive View

Hive View · Version : Hive 하이브에서 뷰(View)는 일반 RDBMS 뷰와 동일하게 데이터를 저장하지 않는 논리적 테이블 구조이다. 뷰는 테이블과 같은 데이터베이스에 저장되기 때문에 뷰 이름은 데이터베이스 내에서 유니크해야한다. 아래 스크립트는 하이브에서 뷰를 생성하는 예제이다. create view vw_a as select col_1, col_2, col_3 from tbl_a where col_1 = 'a'; 뷰를 생성할때 새로운 컬럼 이름 전체나 일부분에 COMMENT를 추가할 수도 있다. 뷰는 원본 테이블로 부터 주석을 상속받지 않는다. 뷰는 INSERT나 LOAD 명령의 대상으로 사용할 수 없으며 읽기 전용이다. 하이브는 뷰를 먼저 수행한 후에 쿼리를 수행한다. 그러나 옵..

Hive에서 샘플 데이터 추출

Hive에서 샘플 데이터 추출 · Version : Hive 하이브에서 큰 데이터 테이블이 있을때, 일부 데이터 샘플을 추출하는 방법에 대해서 알아본다. 하이브는 테이블을 버킷으로 구성하여 샘플을 만드는 쿼리로 아래와 같은 방식으로 사용할 있으며, 예제 스크립트는 1에서 10까지 값을 가진 컬럼에서 난수를 발생시키는 rand() 함수를 사용하여 샘플 데이터를 추출한다. select * from tbl TABLESAMPLE (BUCKET 3 OUT OF 10 ON rand()); BUCKET절에서 분모는 데이터가 해시될 수 있는 버킷 개수를 표현하며, 분자는 선택되는 버킷 숫자이다. 아래 스크립트는 PERCENT 함수를 사용하여 테이블 블록의 백분율로 샘플 데이터를 추출한다. select * from tb..

Hive ORDER BY, SORT BY, DISTRIBUTE BY, CLUSTER BY

Hive ORDER BY, SORT BY, DISTRIBUTE BY, CLUSTER BY · Version : Hive 하이브 또는 RDBMS에서 ORDER BY는 쿼리 결과 집합에 대해서 전체 정렬을 수행한다. 하이브에서 ORDER BY는 모든 데이터가 하나의 리듀서로 처리되기 때문에 데이터 셋이 클수록 시간이 오래 걸린다. ORDER BY에 오랜 시간을 수행될 수 있기 때문에 하이브는 hive.mapred.node가 strict로 설정되었을 경우 ORDER BY절에 대해서 LIMIT 를 요구한다. 기본값은 nonstrict 이다. 하이브에서 ORDER BY 대신 SORT BY를 사용하면 각 리듀서에서 지역 정렬하여 출력한다. ORDER와SORT를 사용할 경우 어떠한 컬럼이라도 지정할 수도 있고 ASC..

Hive Map-Side-Join, Bucket-Map-Join, Sort-Merge-Join

Hive Map-Side-Join, Bucket-Map-Join, Sort-Merge-Join · Version : Hive Hive에서 조인 명령을 실행할때, 크기가 작은 테이블은 메모리에 캐시하고 크기가 큰 테이블은 맵퍼로 흘려 보낼 수 있다. 하이브는 메모리에 캐시한 작은 테이블로 부터 일치하는 모든 것을 찾아 낼 수 있기 때문에 맵에서 모든 조인을 할 수 있다. 이렇게 하면 일반 조인 시나리오에서 필요한 리듀스 단계를 제거할 수 있다. 데이터가 작을 수록 맵 사이드 조인은 일반 조인보다 효율이 좋다. 리듀스 단계를 제거할 뿐만 아니라 맵 단계 역시 줄어들기 때문이다.맵 사이드 조인을 활성화 하기 위해서는 hive.auto.convert.join 속성을 true로 설정해야한다. 기본값은 false ..