하둡 파일 시스템 23

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

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

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

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

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 ..

Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인)

Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인) · Version : Hive Hive에서 Left Semi Join (왼쪽 세미 조인)은 오른쪽 테이블에서 ON 조건을 만족하는 레코드를 찾을 경우 왼쪽 테이블의 레코드를 반환한다. 일반적인 RDBMS의 SQL은 조건을 만족하기 위해 IN 또는 EXISTS 구문을 지원하지만, 하이브에서는 동작하지 않는다. 하이브는 기본적으로 Right Semi Join (오른쪽 세미 조인) 을 지원하지 않으며 SELECT 와 WHERE절에서 오른쪽 테이블의 컬럼을 참조 할 수 없음에 주의해야 한다. 아래 스크립트는 하이브에서 사용할 수 있는 Left Semi Join의 예시이다. select a.c..

Hive JOIN 및 조인 최적화

Hive JOIN 및 조인 최적화 · Version : Hive Hive는 RDBMS와 같은 JOIN(조인) 구문을 제공하며 기능도 거의 유사하지만 동등조인(EQUI-JOIN)만 제공한다. 내부조인(INNER JOIN)의 경우 조인하는 모든 테이블에서 일치하는 레코드만 반환한다. ON 절은 두 테이블에서 조인할 레코드의 조건을명시한다. select a.col_1, b.col_2 from tbl_a inner join tbl_b on a.col_1 = b.col_1 RDBMS의 표준 SQL의 경우 조인 키에 대해서 비동등 조인(NON-EQUI-JOIN)을 허용하지만 하이브에서는 제공하지 않는다. 또한 하이브에서는 ON절에서 OR 조건의 사용을 허용하지 않는다. 만약 ON 절에 OR를 사용하려고 한다면 아래..

Hive LIKE 와 RLIKE

Hive LIKE 와 RLIKE · Version : Hive Hive에서 LIKE 구문은 RDBMS의 LIKE 구문과 동일한 동작으로, 어떤 서브 문자열(substring)이 문자열의 시작이나 끝, 혹은 문자열 내에서 일치하는지 확인할 수 있다. 아래 스크립트는 LIKE 구문으로 검색한 것이며, OR 절을 사용하여 여러개의 LIKE 구문을 사용하였다. DROP TABLE IF EXISTS TBL_A; CREATE TABLE TBL_A( COL_1 STRING ); INSERT INTO TBL_A(COL_1) VALUES ('CHICAGO'), ('NEWYORK'); SELECT * FROM TBL_A WHERE COL_1 LIKE '%CA%' OR COL_1 LIKE '%YO%'; 하이브는 LIKE 절..