1. hive 의 작동
hive 란 놈이 hdfs에 있는 파일을 SQL을 이용해서 조회 할 수 있도록 하는 녀석인데
mapreduce generator 정도로 보면 될 것 같다. 결국 잡은 mr 로 돈다.
이놈을 조회 하기 위해서는 RDB같은 테이블을 생성해야한다, 보통 mysql과 연동하여 테이블 관련 메타정보들을 갖고 있게 한다.
2. table 만들기 , 관리
hive 테이블을 만들때는 두종류가 되는데 external, managed 테이블로 할 수 있다.
external로 하게 되면 테이블 형태만 만들고 hdfs의 위치를 location으로 잡아 줄 수 있다. 그럼 해당 위치(hdfs)에서 데이터를 직접 부른다. 테이블에 저장되는 데이터는 hdfs에 파일 형식(시퀀스, 텍스트)을 따른다. 해당 파일 형식을 stored as 로 지정 할 수 있다.
파일 구분자를 따로 특문(multi character)등을 이용할 경우 따로 serializer,desirializer 를 구현해야 하는데
row format serde 'org.apache.com.serde' 로 해당 클래스를 선언해서 사용 할 수 있다.
ex)
create EXTERNAL table test_data (
userid STRING,
csinfo map<string, string>)
partitioned by(type string, yyyy string, mm string, dd string, hh string)
row format serde 'org.apache.com.serde'
WITH SERDEPROPERTIES ("field.delimited"="", "collection.delimited"="&","mapkey.delimited"="=")
stored as textfile;
3. 데이터 타입
data_type : primitive_type, array_type, map_type, struct_type
하이브에서는 컬렉션 타입을 지원한다. 이부분이 장점인듯.
위에 생성한 테이블처럼 타입을 선언하면 사용할 수 있다.
4. 데이터 조회
일반적인 sql과 같이 이용할 수 있으며, 하지만 mr잡이라는 특수성을 이해해야 클러스터 노드들및 하이브에 무리를 주지 않을 수 있다.
예를 들면 특정조건없이 너무 많은 데이터를 select 할 경우 coudera 및 hive 서버가 다운될 위험도 있더라.
row format delimited
fields terminated by " " 로 delimeter 를 조절 할 수 있다.
insert overwrite local directory '/tmp' 로 select 결과 파일을 출력 할 수 있다. local을 빼개 되면 hdfs의 위치로 기본한다.)
4. 하이브 파티션
hive에는 partition이란 개념이 있는데 테이블을 만들때 partition by (yyyy string, mm string) 식으로 설정 할 수 있다.
파일(row단위로) 읽어서 처리하는것의 단점으로 모든 데이터를 다 불러들여 처리하면 많은 mapper가 돌게 되고 reduce 작업 또한 많아 지게 된다.
그래서 파일을 파티셔닝해서 읽어들이는 데이터를 적게 하는 전략인것이다. hdfs상에 파티션으로 사용할 필드?별로 파일을 저장하여 파티션으로 사용할 수 있다. 보통 일별, 월별, 년별 로 데이터를 조회하는 경우가 많으니 해당 조건(년,월,일)로 디렉토리를 생성하고 데이터를 적재한다. 그리고 이것을 파티션을 하여 hive 데이터 조회시에 이용한다.
테이블 선언시에 이처럼 선언하여 할 수 도 있고,
partitioned by(yyyy string, mm string, dd string)
테이블 생성 후에 alter 해서 사용 할 수 있다.
alter table test_table Add IF NOT EXISTS partition( yyyy='2015',mm='01',dd='15') location '/tmp/test/2015/01/15'
아마도 해당 파티션 필드만 이용하여 조회할 경우 데이터 사이즈를 아직 측정하지는 않았지만 mr을 돌지 않고 바로 나오는 듯 하다.