hdfs 27

HDFS fsimage와 에디트 로그

HDFS fsimage와 에디트 로그 · Version : HDFS HDFS 에서 클라이언트가 파일을 생성하거나 이동할때 에디트 로그에 먼저 기록한다. 네임노드는 파일시스템 메타데이터를 메모리로 로드하여 인-메모리 자료구조로 관리하며 에디트 로그가 수정된 후 업데이트를 진행한다. 인-메모리 메타데이터는 읽기 요청을 수행하는데 사용되며 각 디렉터리에 쓰기 동작이 끝나고 나서 성공했다는 결과가 클라이언트로 반환 되기전에 에디트 로그를 플러시하여 동기화한다. 이렇게 함으로서 장애가 발생해도 데이터 유실을 방지할 수 있다. fsimage는 파일시스템 데이터의 영속적인 체크포인트 파일이다. 하지만 개별 쓰기 동작 때마다 갱신되지는 않는다. fsimage는 파일 시스템에서 존재하는 모든 디렉터리와 파일 아이노드(i..

Hive는 무조건 MapReduce를 사용할까?

Hive는 무조건 MapReduce를 사용할까 · Version : Hive Hive에서 쿼리를 실행할때, 무조건 맵리듀스(MapReduce)를 사용할까? 하이브에서 대부분의 쿼리를 실행할 경우 맵리듀스가 사용된다. 하지만 일부 쿼리의 경우 로컬 모드 환경에서 맵리듀스를 사용하지 않고도 쿼리가 동작 할수도 있다. 예를 들어 아래 스크립트 처럼 단순히 테이블을 조회하는 쿼리는 맵리듀스를 사용하지 않는다. select * from tbl_a; 단순히 SELECT와 같은 쿼리는 하이브가 테이블로 부터 레코드를 읽고 형식에 맞춰서 콘솔로 출력한다. 이 경우 맵리듀스 작업대신 파일에서 Fetch Task로 전체 데이터를 가져온다. 마치 아래 하둡 명령과 유사하다. hadoop fs -cat $ file_name ..

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

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

Hive 테이블 삭제, 수정

Hive 테이블 삭제, 수정 · Version : Hive 하이브에서 테이블을 삭제하는 명령은 DROP TABLE 명령어를 사용한다. DROP TABLE IF EXISTS table_name; 테이블을 삭제할때, 하둡의 휴지통기능이 활성화되어 있으면 데이터는 분산 파일 시스템의 .Trash 디렉터리로 이동된다. 휴지통 기능에 설정된 시간이후 데이터가 완전히 삭제 된다. 휴지통 기능이 비활성화 되어 있는 경우 즉시 삭제된다. 또한 삭제하려는 테이블이 외부 테이블인경우, 테이블의 메타데이터만 삭제되며 데이터는 그대로 남아있다. 테이블 수정은 ALTER TABLE 명령을 사용하여 변경한다. 테이블 수정은 메타데이터만 변경할 뿐 데이터 자체는 변경시키지 않는다. [테이블명 변경] Table_name 테이블명을 ..

Hive 파티션 테이블에서 where 없는 쿼리 실행 방지

Hive 파티션 테이블에서 where 없는 쿼리 실행 방지 · Version : Hive 하이브에서 테이블 파티셔닝을 하는 가장 큰 이유는 빠르게 데이터를 검색하기 위해서이다. 아주 큰 데이터가 있더라도 파티션 스키마가 검색하려는 범위 필터링을 반영한다면 파티셔닝 테이블은 쿼리의 성능을 극적으로 올려준다. 그래서 특정값을 필터하는 WHERE 절에 파티션 조건을 포함하는데 이러한 조건을 “파티션 필터”라고 부른다. 그러나 파티셔닝이 잘 되어 있다고 하더라도, 테이블 데이터가 많거나 파티션 개수가 많다면 거대한 맵리듀스 작업을 유발할 수 있다. 이러한 맵리듀스의 부하를 방지하기 위해 WHERE 절에 파티션 필터가 없는경우 쿼리 실행이 되지 않도록 옵션을 설정할 수 있다. 아래 스크립트는 WHERE절에 파티션..

Hive 매니지드 테이블 및 외부 테이블

Hive 매니지드 테이블 및 외부 테이블 · Version : Hive 하이브에는 매니지드 테이블과 외부 테이블이라고 불리는 테이블 저장 방식이 있다. 이 둘의 차이점은 데이터 소유자가 하이브이냐, 아니냐로 크게 구분할 수 있다. 매지니드 테이블 (Managed Table)은 내부 테이블이라고도 불리며 하이브 속성(hive.metastore.warehouse.dir)에서 정의한 디렉터리의 하위 디렉터리를 만들어서 데이터를 저장한다. 하이브에서 매니지드 테이블을 삭제할때 테이블내의 데이터가 삭제된다. 외부 테이블은 테이블을 생성할때, EXTERNAL 키워드를 사용하며, LOCATION절에서 지정한 위치에 데이터가 존재한다는것을 하이브에게 알려준다. 하이브에서 외부 테이블을 삭제하면, 하이브 내에서 스키마만..

HDFS 저장소에 데이터를 압축해서 저장하면 더 좋을까?

HDFS 저장소에 데이터를 압축해서 저장하면 더 좋을까? · Version : HDFS HDFS 클러스터에서 데이터를 저장할때, 압축을 해서 보관하는것이 더 좋을까? 그냥 저장하는 것이 좋을까? 결론부터 말하면 반은 맞고 반은 틀리다. 즉, 압축의 특성을 잘 이해하고 사용하면 좋지만, 그렇지 못할경우 오히려 HDFS의 장점을 활용하지 못할 수도 있다. 맵리듀스가 처리할 데이터를 압축하는 방법을 고려할때, 압축 포맷이 분할을 지원하는지 여부를 이해하는것이 중요하다. 예를들어 HDFS에 1GB의 데이터 파일을 저장한다고 가정한다. 64MB 블록으로 처리할 경우 16개의 블록으로 나뉘어 HDFS에 저장된다. 맵 리듀스에서 이 파일을 입력 데이터로 사용할 경우 16개의 독립적으로 처리되는 입력 분할을 생성할 것..

Hive 테이블

Hive 테이블 · Version : Hive 하이브에서 테이블을 생성 할때에는 SQL 규칙을 따르지만 테이블의 데이터 파일 생성 위치나 사용할 포맷등 확장기능을 사용하여 유연성을 제공한다. CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later) [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])] [COMMENT table_comment] [PARTITIONED BY (col_name d..

HiveQL과 Hive 데이터베이스

HiveQL과 Hive 데이터베이스 · Version : Hive HiveQL은 Hive에서 사용하는 쿼리 언어이다. SQL과 유사하지만 SQL과 다르며 표준 ANSI SQL을 지원하지 않는다. 하이브는 로우(ROW) 레벨의 삽입과 변경, 삭제를 지원하지 않으며, 트랜잭션 또한 지원하지 않는다. 하지만 하둡이 지원하는 범위 안에서 성능 확장을 위해 다양한 기능을 제공하며, 사용자가 정의한 확장과 외부 프로그램을 하이브와 연동할 수도 있다. 하이브에서 데이터베이스 개념은 단지 테이블의 카탈로그 또는 네임스페이스이다. 데이터베이스는 논리적인 그룹을 구성할 수 있으며 대규모 작업시 동일한 테이블명의 충돌을 방지할수도 있다. 데이터베이스를 별도로 지정하지 않으면 기본 데이터베이스(default)를 사용한다. 아..

Hive 텍스트파일 인코딩

Hive 텍스트파일 인코딩 · Version : Hive 텍스트 데이터의 필드를 구분할때, 탭(TAB) 또는 콤마(,)를 많이 사용한다. 이러한 일반적인 구분 기호는 데이터안에 콤마나 탭이 포함되어 있을 경우 전체 데이터 필드가 맞지 않는문제가 발생할 수 있어 주의해야 한다. 하이브도 탭 또는 콤마 같은 필드 구분자를 지원하지만 앞에서 말한 이유 때문에 일반적으로 잘 사용하지 않는 여러 제어 문자를 기본 구분 기호로 사용한다. 아래표는 하이브에서 제공하는 구분기호이다. 만약 필드에서 탭으로 분리하려면 ‘\t’를 사용하고, 콤마의 경우 ‘,’를 사용한다. 구분기호 설명 \n 레코드 줄 바꿈 ^A 모든 컬럼을 분리한다. CREATE TABLE 문에서 명시적으로 지정할때는 8진수 코드 ‘\001’을 사용한다...