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 절을 자바 정규표현식으로 사용할 있는 RLIKE 절로 확장하여 LIKE 조합으로 검색하기 어려운 문자열을 표현할 있다. 아래 스크립트는 RLIKE 예제이다.

select * from tbl_a where col_1 RLIKE '.*(ca|Yo).*';

 

 

예제에서 마침표(.) 어떤 문자와 일치하고 (*) 왼쪽에 있는 것이 0번에서 여러 반복되는 것을 의미한다. 따라서 , 뒤에서 마침표가 반복된다. (x|y)  표현식은 x또는  y 문자열이 일치하는 것을 의미한다.

 

2020-07-21 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브쿼리, Hive SQL, LIKE, RLIKE

HDFS fsimage 에디트 로그

 

·       Version : HDFS

 

HDFS 에서 클라이언트가 파일을 생성하거나 이동할때 에디트 로그에 먼저 기록한다. 네임노드는 파일시스템 메타데이터를 메모리로 로드하여 -메모리 자료구조로 관리하며 에디트 로그가 수정된 업데이트를 진행한다. -메모리 메타데이터는 읽기 요청을 수행하는데 사용되며 디렉터리에 쓰기 동작이 끝나고 나서 성공했다는 결과가 클라이언트로 반환 되기전에 에디트 로그를 플러시하여 동기화한다. 이렇게 함으로서 장애가 발생해도 데이터 유실을 방지할 있다.

 

fsimage 파일시스템 데이터의 영속적인 체크포인트 파일이다. 하지만 개별 쓰기 동작 때마다 갱신되지는 않는다. fsimage 파일 시스템에서 존재하는 모든 디렉터리와 파일 아이노드(inode) 정보를 바이트로 직렬화 한다. 아이노드는 파일의 복제 단위, 변경 접근시간, 접근권한, 블록 크기와 파일을 구성하는 블록 조합들 같은 정보를 가진다. 디렉터리는 변경 시간, 권한 할당, 크기 같은 메타데이터가 저장된다. fsimage 파일은 블록이 저장되는 데이터노드 정보를 기록하지는 않는다. 대신 네임노드는 메모리상에 블록과 데이터 노드 매핑정보를 유지한다. 네임노드는 데이터 노드가 클러스터에 참여할 블록 리스트를 요청하여 매핑정보를 구성하며 주기적으로 정보를 받아 매핑정보를 최신상태로 유지한다.

 

에디트 파일은 크기 제한없이 증가할 있다. 네임노드가 구동 중일 때에는 에디트 파일이 커지더라도 특별한 영향을 주지는 않지만 네임노드가 재시작될 경우, 많은 에디트 로그의 개별 동작들을 메모리에 반영하기 위해 상당한 시간이 소요된다. 시간 동안은 파일 시스템을 사용하지 못하는 상황이 발생한다. 이와 같은 문제를 방지하기 위해 보조 네임노드를 구성한다. 보조 네임노드는 네임노드의 -메모리 메타데이터에 체크포인트를 생성하는 것이다. 체크포인트는 아래와 같은 순서로 진행된다.

1.       보조 네임노드는 네임노드에 edits 파일을 순환 사용하도록 요청하고 네임 노드에서 새로운 edits 로그는 새로운 파일에 저장된다.

2.       보노 네임노드는 HTTP GET 이용해서 네임노드의 fsimage edits 가져온다.

3.       보조 네임노드는 fsimage 메모리에 로드하고 edits 동작을 반영한다. 그리고 나서 새롭게 통합된 fsimage 파일을 생성한다.

4.       보조 네임노드는 HTTP POST 이용하여 새로운 fsimage 파일을 네임노드에 전송한다.

5.       네임노드는 이전 fsimage 보조 네임노드로부터 받은 새로운 이미지로 교체하며, 이전 edits 파일을 1단계에서 시작한 새로운 edits 교체한다. fsimage 파일도 체크포인트가 발생한 시간을 기록하기 위해 변경된다.

 

아래 그림은 체크포인트 과정을 이해하기 쉽도록 그림으로 표현한 것이다.

 

 

2020-07-14 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, edit log, fsimage, 체크포인트, checkpoint, namenode, 네임노드

Hive 무조건 MapReduce 사용할까

 

·       Version : Hive

 

Hive에서 쿼리를 실행할때, 무조건 맵리듀스(MapReduce) 사용할까?  하이브에서 대부분의 쿼리를 실행할 경우 맵리듀스가 사용된다. 하지만 일부 쿼리의 경우 로컬 모드 환경에서 맵리듀스를 사용하지 않고도 쿼리가 동작 할수도 있다. 예를 들어 아래 스크립트 처럼 단순히 테이블을 조회하는 쿼리는 맵리듀스를 사용하지 않는다.

select * from tbl_a;

 

단순히 SELECT 같은 쿼리는 하이브가 테이블로 부터 레코드를 읽고 형식에 맞춰서 콘솔로 출력한다. 경우 맵리듀스 작업대신 파일에서 Fetch Task 전체 데이터를 가져온다. 마치 아래 하둡 명령과 유사하다.

hadoop fs -cat $ file_name

 

일반적으로 min / max / count 같은 모든 종류의 집계에는 맵리듀스 작업이 필요하다.  또한 컬럼을 사용하게 되면 하이브는 파일에서 구문을 분석하여 행에서 컬럼을 추출해야 하므로 맵리듀스 작업이 필요하다.

 

hive.exec.mode.local.auto 속성을 true 설정하면 다른 연산도 로컬 모드로 실행을 시도한다.

hive.exec.mode.local.auto = true;

 

 

 

 

2020-07-14 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 테이블, Hive table, 하이브쿼리, Hive SQL, 맵리듀스, MapReduce

Hive에서 SELECT 결과를 테이블로 INSERT 하기

 

·       Version : Hive

 

Hive에서 쿼리 결과를 테이블에 입력할때, 이미 존재하는 테이블에 데이터를 입력할수도 있으며, 새로운 테이블을 생성하며 데이터를 입력할 수도 있다. 이미 존재하는 테이블에 SELECT 결과를 저장할 때는 INSERT 구문을 사용한다. OVERWRITE 예약어를 사용하여 해당 파티션의 데이터를 교체할 있다. OVERWRITE 예약어를 INTO 변경하면 하이브는 데이터를 교체하지 않고 원래 데이터에 추가한다.

INSERT OVERWRITE TABLE tbl_new PARTITION (month = '1', day = '1')

select * from tbl_origin as origin

where origin.month = '1' and origin.day = '1';

 

만약 여러 파티션 데이터를 만들때, 파티션별로 INSERT 구문을 만들면 반복해서 데이터를 읽어야 하는 비효율적인 부분이 발생한다. 하이브는 입력 데이터를 한번 읽어서 이를 다수의 테이블로 분산하는 문법을 제공한다.

from tbl_origin as origin

INSERT OVERWRITE TABLE tbl_new PARTITION (month = '1', day = '1')

       select * where origin.month = '1' and origin.day = '1'

INSERT OVERWRITE TABLE tbl_new PARTITION (month = '2', day = '1')

       select * where origin.month = '2' and origin.day = '1'

INSERT OVERWRITE TABLE tbl_new PARTITION (month = '3', day = '1')

       select * where origin.month = '3' and origin.day = '1';

 

 

SELECT 결과물을 새로운 테이블을 생성하면서 저장하는 방법은 CREATE 구문을 사용할 있다.

CREATE TABLE tbl_create

AS SELECT col1, col2, col3

from tbl_origin

where month = '1' and day = '1';

 

 

 

2020-07-13 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 테이블, Hive table, 하이브쿼리, Hive SQL, 데이터 저장, INSERT SELECT

+ Recent posts