Hive?

MapReduce 코드를 HiveQl을 이용하여 간편화 시킨 쿼리 엔진

  • 배치성 작업을 실행시킬 때 주로 사용
    • MapReduce,Tez, Spark등을 Engine으로 사용 가능
  • HiveQl
    • SQL과 유사한 Query 제공
    • 0.14.0 이후 버전부터 Update/Delete 지원
    • Insert는 덮어쓰기, 빈 테이블에만 사용 가능
    • Select문에서 Having절은 사용 불가하다

버전별 차이

  1. Hive 1.X
    • SQL을 이용하여 MapReduce 가능
    • 파일 데이터를 논리적 표현
  2. Hive 2.X
    • LLAP구조 추가
      • LLAP : 작업을 실행한 데몬을 유지하여 핫 데이터 케싱을 통해 빠른 데이터 처리
    • HPLSQL 추가
      • HPL/SQL를 보면 사용법이 나온다.
      • Hive의 PL/SQL이라고 보면 된다.
    • 기본 실행엔진 MapReduce -> TEZ
  3. Hive 3.X
    • MapReduce엔진, Hive CLI,Hcat CLI, WebHCat삭제
      • TEZ엔진, BeeLine 사용

요소

Pasted image 20230925110547.png

Metastore

  • Hive 테이블 및 파티션의 모든 Meta 정보 및 HDFS 맵핑 정보 저장
    • Hive는 RDB처럼 Schema에 맞춰 데이터를 적재하는 것이 아닌 데이터를 적재 후 Schema를 입히는 방식
      Pasted image 20230925112308.png

DataBase

  • Embedded
    • Derby를 이용하여 사용
    • 1번에 1개의 프로세스만 접근가능
      • 단위 테스트 용도로만 사용!
  • Local / Remote
    • Mysql과 같은 외부 RDBMS를 사용

Server

  • Embeded / Local
    • Hive Client내에 Library처럼 사용되는 서버
    • 주로 HiveServer2와 함께 사용
  • Remote
    • Metastore가 독립 Server로 구동
      • Client는 Thrift 통신을 이용하여 접근
        • Thrift : 서버에  있는 서로 다른 언어로 작성된 함수 혹은 프로시저를 호출해서 사용
      • 위와 같이 구동되는 서버를 Hcat 서버라 부름

HCatalog

  • Grid Computing 상에서 다양한 Processing tools를 이용하여 Read/Write를 보다 쉽게 할 수 있게 만들어주는 관리 계층
    • Grid Computing : 원격 병렬 컴퓨팅. Cluster Compung을 WAN으로 연결시킨 상태
    • Hive 0.11.0부터 Hcatalog와 Hive가 통합됨
  • SerDe( Serializer-Deserializer )할 수 있는 모든 Read/Write를 지원
    • e.g csv, Json …
    • SerDe : Hive가 데이터를 해석하는 방법 row data -> hdfs , hdfs-> row data
  • WebHCat
    • HCataLog를 REST API로 제공하는 것

HiveServer2

  • Client가 HiveQl을 수행할 수 있게 해주는 서비스
  • Thrift ,JDBC,ODBC등의 API 제공
  • Thrift 기반으로 동작하여 Thrift Server라고도 부름

Beeline

  • JDBC를 사용하여 HiveServer2에 접근하는 SQLline 기반도구
    • SQLLine : Java기반으로 DB와 연결하여 SQL을 실행하는 명령줄 유틸리티
  • Thrift통신으로 접속하고 , Comman Line을 이용
  • XML, CSV, TSV로 출력할 수 있다.

Table

Hive에는 크게 2종류의 Table 형식이 있다.

  1. Managed Table( Internal Table )
    1. Location을 따로 설정하지 않은 Table
    2. 외부 위치가 아닌 서버 내에 Table저장
    3. Drop table/partition시 메타스토어 정보 및 데이터가 삭제됨
    4. 주로 임시테이블, 생명 주기 관리에 사용
  2. External Table
    1. Location을 따로 설정하는 Table
    2. 외부 위치에 정의하는 테이블
    3. 파일이 이미 존재 혹은 원격 위치에 사용 시 적용
      1. HDFS, S3…
    4. Drop table/partition시 메타스토어 정보 만 제거됨

Partition

  • Hive의 Partition은 HDFS에 Tree구조로 적재된다.
  • Partition은 순서에 따라 디렉토리가 구성되기 때문에 cardinality에 따라 순서를 잘 정해야함.
  • 테이블의 크기가 너무 커지면 모든 것을 Row를 읽는 것과 같이 불필요한 I/O가 발생할 수 있어 필수적으로 넣는 것을 추천
  1. 동적 Partition
    • 내부 Column을 기준으로 자동 생성하는 Partition
    • 기본값 : 200개, 최대값 : 10000+ 가능 참조
      • 너무 많은 동적 Partition은 성능 저하 야기
        • 2K이상이면 30초 쿼리가 발생 할 수 있다함.
    • e.g. : insert into table tb_sample2 partition ( year,month,day ) select userid,viewtime,year,month,day from tb_sample;
  2. 정적 Partition
    • Partition 정보를 직접 삽입
    • eg. insert into table tb_sample partition(year = 2021, month = 05, day =04) values(555,444);
-- 테이블 생성 ( 정적 파티선 )
Create table tb_sample(
	userid bigint ,
	viewtime int
)
partition by ( year int , month int , date int)

-- 레코드 삽입 < 정적 Partition >
insert into table tb_sample
partition(year = 2021, month = 05, day =07)
values(123,456);

-- 레코드 삽입 < 동적 Partition >
insert into table tb_sample2
partition ( year,month,day )
select userid,viewtime,year,month,day from tb_sample;

Pasted image 20230925125709.png

  • HDFS에서 위와 같은 형태로 생성된다.
  • Partition의 위치 정보는 Metastore 에 적재됨
  • PARTITIONS
    • 파티션 기본 정보
    • Pasted image 20230925125840.png
  • PARTITION_KEYS
    • Partition에서 사용된 Column리스트
    • Pasted image 20230925130003.png
  • PART_KEY_VALS
    • partition의 필드값
    • Pasted image 20230925130124.png
  • PART_PARAMS
    • partition의 속성 정보
    • Pasted image 20230925130214.png

Bucketing

  • Partition처럼 테이블의 데이터를 분할하는 방식
  • N개의 파일로 나누어 저장하는 것.
  • Bucketing을 하면 Join시 SMB Join으로 수행되어 속도 향상을 야기
    • SMB Join(Sort Merge Bucket Join): Bucketing된 키의 정보를 이용한 Join
CREATE TABLE tbl1(
  col1 STRING,
  col2 STRING
) CLUSTERED BY (col2) INTO 5 BUCKETS  
stored as orc  
location 'Path'  
tblproperties('orc.compress' = 'SNAPPY')

CREATE TABLE tbl2(
  col1 STRING,
  col2 STRING
) CLUSTERED BY (col2) SORTED BY (col1) INTO 5 BUCKETS
  • 위와 같이 CLUSTERED BY (칼럼) [SORTED BY (칼럼)] INTO 버켓수 BUCKETS 을 추가하여 설정

Skew

  • Hive에서 Skew는 데이터 쏠림 현상이라고 볼 수 있다.
    • Partition을 나눠놨는데, 특정 Partition에만 데이터가 몰려 있으면 특정 Partition만 비약적으로 커지는 현상이라고 보면 된다.
  • Skew는 Partition과 유사한 기능을 하지만, 특정 데이터만 나눠주는 효과를 낼 수 있다.
    • e.g 알파벳을 적재하는 테이블이 존재
      1. a,b가 다른 알파벳에 비해 많이 유입됨
      2. a,b를 Skew로 등록
      3. 테이블은 a , b , c-z로 적재 시작
CREATE TABLE tbl (
	col1 STRING,
	col2 STRING
) SKEWED BY (col1)on ('a', 'b' )
[ STORED as DIRECTORIES ]
location 'Path'  
;
  • 위와 같은 형식으로 사용 가능
    • STORED as DIRECTORIES : 디렉토리 구분 여부

개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

'프로그래밍 및 IT > Hive' 카테고리의 다른 글

Hive 레코드 HDFS 이전  (0) 2023.08.09

데이터 이전 후 설명 없는 NullPointerException

 ERROR TaskSetManager: Task 0 in stage 5.0 failed 4 times; aborting job
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 5.0 failed 4 times, most recent failure: Lost task 0.3 in stage 5.0  : java.lang.NullPointerException
    at org.apache.spark.sql.execution.datasources.orc.OrcColumnVector.getUTF8String(OrcColumnVector.java:167)
    ...

데이터 이전을 잘 하고 나머지 집계도 잘 동작하는지 확인하기 위해 검증하는 도중 원인 설명이 제대로 되지 않은 문제가 발생했다.

원인

이전 이전의 Table에 필요한 columns을 추가하였고, 생성문은 관련된 columns끼리 묶어 관리하기 위해 순서를 변경함

그로 인하여 기존 테이블 스키마 순서와 이전할 테이블의 순서가 다르기 때문에 문제가 발생함.

간단 설명

  1. 아래와 같은 테이블이 존재했다 가정하고 시작해보자

    id passwd name
    id1 passwd1 nane1
    id2 passwd2 nane2
    id3 passwd3 nane3
  2. email칼럼을 추가하기위해 데이터를 추가하였다.

    id passwd name email
    id1 passwd1 nane1 email1
    id2 passwd2 nane2 email2
    id3 passwd3 nane3 email3
  3. 이전한 테이블은 id,passwd,email,name 순으로 테이블 스키마를 정의했다.

  4. create external table if not exists db명.tb명 ( id string , passwd string , email string , name string ) ;

  5. 복제할때 기존 테이블의 스키마 순서인 id,passwd,name,email 가아닌 id,passwd,email,name 로 스키마 순서가 바뀌어 데어터 순서가 뒤섞여 복제가 되었다.

    id passwd email name
    id1 passwd1 nane1 email1
    id2 passwd2 nane2 email2
    id3 passwd3 nane3 email3

해결책

1번 해결책

생성문을 기존 칼럼 순서와 동일하게 만든다.

create external table if not exists db명.tb명 (
      id      string
    , passwd  string
    , name    string
    , email   string
)
;
  • 위에 설명한 원인을 예시로 보면 위와 같이 기존 테이블 순서에 맞게 변경한 후 이관시킨다
  • 하지만 이 방법은 columns끼리 묶으려고 순서를 변경하였기에 썩 좋지 않은 방법이라고 생각한다.

2번 해결책 ( 실패 )

ALTER TABLE test_change CHANGE [ col_name ] [col_new_name] [type] [location] 을 이용하여 순서변경

alter table db명.tb명 change id     id      string first         ;
alter table db명.tb명 change passwd passwd  string after  id     ;
alter table db명.tb명 change name   name    string after  passwd ;
alter table db명.tb명 change email  email   string after  name   ;
  • 실 구동은 해보지 않음 hive cwiki

  • 아래 테이블의 차이처럼 metadata 까지 변경 되는것으로 보이기 때문에 기각

    id passwd email name
    id1 passwd1 nane1 email1
    id2 passwd2 nane2 email2
    id3 passwd3 nane3 email3
    id passwd name email
    id1 passwd1 email1 nane1
    id2 passwd2 email2 nane2
    id3 passwd3 email3 nane3

3번 해결책 ( 성공 )

select a.CD_ID, a.COLUMN_NAME, a.INTEGER_IDX
from hive.COLUMNS_V2 a
inner join hive.SDS b
    on  b.CD_ID = a.CD_ID
inner join hive.TBLS c
    on  c.SD_ID = b.SD_ID
    and c.TBL_NAME = 'table_name'
order by INTEGER_IDX
;
  • 출력 예시

    CD_ID COLUMN_NAME INTEGER_IDX
    504 member_id 0
    504 char_id 1
    504 first_time 2
    504 last_time 3
    504 reg_time 4
  • 위와 같이 metastore 정보를 확인해보면 COLUMN_NAME,integer_idx을 확인할 수 있다.

  • 해당 COLUMN_NAME과 INTEGER_IDX의 값과 순서를 기존 테이블과 동일하게 만들어주면된다.

  • 따로 외래키등이 걸려있지 않아서 해당 CD_ID의 값을 insert overwrite로 해결하였다.

추정되는 원인

기존에 hive.metastore.schema.verification=false로 처리가 되어 있어 schema 검증을 제대로 안 되서 그런 것으로 추정됨

hive --orcfiledump /File_Path 이 명령어를 이용하여 orc 파일의 schema를 확인해보니, 아래와 같다.

  1. hive.metastore.schema.verification=true

    Structure for /File_Path
    File Version: 0.12 with HIVE_8732
    Rows: 1151
    Compression: SNAPPY
    Compression size: 262144
    Type: struct<member_id:string,char_id:string,first_time:timestamp,last_time:timestamp,reg_time:timestamp>
    
    Stripe Statistics:
    Stripe 1:
        ...
    
    File Statistics:
    ...
    
    Stripes:
    ...
  2. hive.metastore.schema.verification=false

    Structure for /File_Path
    File Version: 0.12 with HIVE_13083
    Rows: 1095
    Compression: SNAPPY
    Compression size: 262144
    Type: struct<_col0:string,_col1:string,_col2:timestamp,_col3:timestamp,_col6:timestamp>
    
    Stripe Statistics:
    Stripe 1:
        ...
    
    File Statistics:
    ...
    
    Stripes:
    ...

위 결과를 보면 hive.metastore.schema.verification=true를 해야 orc의 schema값이 Hive의 스키마로 잘 생성된다.

  1. true

    • Type: struct<member_id:string,char_id:string,first_time:timestamp,last_time:timestamp,reg_time:timestamp>
  2. false

    • Type: struct<_col0:string,_col1:string,_col2:timestamp,_col3:timestamp,_col6:timestamp>

데이터 이전 전의 테이블이 false로 되어있던 것 이기 때문에 테스트는 하지 못 하였으나, 겪은 문제처럼 칼럼 순서가 뒤바뀐 이유는 이것으로 추정된다.

이전 사유

HDP 라이센스 문제로 Hadoop-EchoSystem 재구축함에 따라 HDFS, Hive의 버전을 변경하게 됬다

  • HDFS 2.7.3 -> 3.1.1
  • Hive 1.6.3 -> 3.1.2

이전 방법

데이터 복사

# hdfs dfs -cp -f -p src dist
hdfs dfs -cp -f -p hdfs://기존HDFS 주소/기존 테이블 경로/*  hdfs://이전될 HDFS 주소/기존 테이블 경로  
  • (hdfs://이전될 HDFS 주소) 은 명령어 실행위치가 loacal이면 생략해도 된다.
  • option ( 필요 없다면 생략 가능 )
    • f : 덮어쓰기
    • p : 파일정보 그대로 가져가기 e.g 생성일자, 생성 user, group.. 등

복사(전송) 확인

# hdfs dfs -ls path
hdfs dfs -ls /apps/hive/dbName/tbName
drwxr-xr-x   - hive hadoop          0 2022-09-15 19:38 /apps/hive/dbName/tbName
.....
  • 위와 같이 기존과 동일한 hive partition 구조로 디렉토리 및 파일이 잘 전송됬으면 된다.
  • (hdfs://이전될 HDFS 주소) 은 명령어 실행위치가 loacal이면 생략해도 된다.

테이블 인식

msck repair table bd명.tb명;
  • 위와 같이 테이블 복구(msck repair)를 해주면 끝이다.
    • hdfs에는 옮겨졌지만, metastore은 인식하고 있지 않으니 msck repair을 해줘야한다
    • 궁금하다면 msck를 하기전에 조회를 해보고, msck를 한 후 조회를 해보면 msck를 한 기점으로 조회가 되는 것을 확인할 수 있을 것 이다.

결론

우연치 않은 기회로 Hive Records 이전 작업을 수행했다.

처음에는 cp 명령어로 간단하게 될까 했는데 진짜 되서 당황스러웠다,

그래도 막히는 부분이 있어서 여러 문제에 봉착할 줄 알았지만, 기존 테이블과 동일한 조건으로 생성한 후 진행해서 그런지 첫 시도에 해결을 했고 시간을 많이 안 잡아먹어서 다행이다.

이제 저것을 기반으로 shell script만 만들고 성공하면 운영 서버 데이터 이전할 때 편안하게 사용해야겠다.

작성 후 작업중 추가로 발생한 에러

데이터 이전 후 추가로 발생한 에러

'프로그래밍 및 IT > Hive' 카테고리의 다른 글

Hive  (0) 2023.10.24

+ Recent posts