하이브를 다운로드한다.
압축을 푼다.
tar -xzf hive-x.y.z.tar.gz
하둡 경로를 설정한다.
hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directory HADOOP_HOME=/home/hadoop/hadoop
하이브 쉘을 실행한다.
bin/hive
하이브 쉘
- 하이브 쉘은 HiveQL의 명령어를 수행하기 위해 하이브와 상호작용하는 기본 방식이다.
- HiveQL은 하이브의 쿼리 언어로, MySQL의 SQL과 유사하다.
- SQL과 마찬가지로, HiveQL은 대소문자를 구분하지 않는다.
show tables ;하이브를 처음 설치한 후, 위 명령어를 실행하면 수행하는데 몇 초 정도가 걸린다.
그 이유는 바로 그 시점에 메타스토어 데이터베이스가 로컬 머신에 생성되기 때문이다.
메타스토어 데이터베이스는 hive 명령어를 실행한 위치에 metastore_db 라는 이름의 디렉토리를 만들어서, 필요한 파일을 저장한다.
비대화식 모드로 실행하기
-f 옵션: HiveQL 명령어가 저장된 파일을 실행하기
hive -f script.q
-e 옵션: 명령어가 짧다면, 인라인 형태로 실행하기
hive -e 'select * from dummy'
dummy 테이블 만들기
% echo 'X' > /tmp/dummy.txt % hive -e "create table dummy (value string) ; \ load data local inpath '/tmp/dummy.txt' \ overwrite into table dummy"
-S 옵션: 대화형과 비대화명 모두에서 하이브는 실행 과정에서 부수적으로 발생하는 정보(쿼리를 수행하기 위해 거린 시간 같은)을 표준 에러로 출력한다.
쿼리에 대한 출력 결과만을 보려면, -S 옵션을 붙여 불필요한 메시지의 출력을 막을 수 있다.
hive -S -e 'select * from dummy'
우선 하둡을 로컬 모드로 실행한 상태에서, 예제를 따라해보자.
create table records (year string, temperature int, quality int)
row format delimited
fields terminated by '\t' ;
load data local inpath 'input/ncdc/micro-tab/sample.txt'
overwrite into table records ;
% ls /user/hive/wareouse/records/select year, max(temperature)
from records
where temperature !=9999
and (quality = 0 or quality = 1 or quality = 4 or quality = 5 or quality = 9 )
group by year ;
이제 하둡을 의사 분산 모드로 실행한 상태에서, 예제를 따라해보자.
테이블은 이미 생성된 상태이며, 스토리지만 변경하면 되므로 하이브의 유연함을 확인해볼 수 있다.
의사분산 모드로 하둡을 실행한다.
앞에서 만든 테이블 정보는, 메타스토어에 저장되므로 따로 생성할 필요가 없다.
load data local inpath 'input/ncdc/micro-tab/sample.txt'
overwrite into table records ;
% bin/hadoop fs -ls /user/hive/wareouse/records/
하둡 파일 시스템 디렉토리 생성
만일 하둡 클러스터 하나를 공유하는 하나 이상의 하이브 사용자를 지원하려면, 모든 사용자들이 파일 쓰기가 가능한 디렉토리를 만들 필요가 있다.
bin/hadoop fs -mkdir /tmp
bin/hadoop fs -chmod a+w /tmp
bin/hadoop fs -mkdir /user/hive/warehouse
bin/hadoop fs -chmod a+w /user/hive/warehouse
select year, max(temperature)
from records
where temperature !=9999
and (quality = 0 or quality = 1 or quality = 4 or quality = 5 or quality = 9 )
group by year ;
메타스토어는 서비스와 데이터 백업 저장소로 나뉜다.
하이브로 작업할 때, 메타스토어를 사용자의 로컬 머신에서 실행하면 간편하다.
하지만 이러한 로컬 메타스토어 방식은 하이브 테이블 정의가 로컬 머신에 위치하므로, 다른 사용자와 정의를 공유해서 사용할 수 없다.
하이브에서는 총 3가지의 메타스토어 설정방식을 제공한다. 지금까지 사용한 방식은 임베디드 메타스토어 설정이다.
484쪽, 그림 12-2. 메타스토어 설정 참고
Failed to start database 'metastore_db'
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://lmdev002:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
HiveQL로 명명된 하이브의 SQL 표현 방식은 SQL-92 표준 명세서를 완벽하게 지원하지는 않는다.
참고) 488쪽, 표 12-2. SQL과 HiveQL 비교
하이브는 기본형과 복합형 데이터 타입 모두를 지원한다.
하이브는 관계형 연산자, 산술 연산자, 논리 연산자 등을 제공한다.
또한 하이브넨 다양한 함수를 내장하고 있다.
show functionsdescribe function [function name]하이브 테이블은 논리적으로 저장된 데이터 와, 테이블의 레이아웃을 기술하는 관련 메타데이터 로 구성된다.
데이터는 로컬 파일 시스템이나 S3를 포함해서, 어떠한 파일 시스템에도 저장할 수 있으나, 일반적으로 HDFS를 사용한다.
메타데이터는 HDFS가 아니라 RDBMS에 저장한다.
다중 데이터베이스
현재 0.9 버전에서는 다중 데이터베이스를 지원한다.
테이블을 생성할 때 하이브는 기본적으로 데이터를 직접 관리하게 되는데, 이는 데이터가 하이브가 관리하고 있는 웨어하우스 디렉토리로 이동한다는 뜻이다.
반대로 사용자는 외부 테이블을 생성해서, 웨어하우스 디렉터리 위부에서 데이터를 참조할 수 도 있다.
관리 테이블과 외부 테이블은 아래와 같은 차이가 있다.
create table managed_table (dummy string) ;
load data inpath 'user/tom/data.txt' into table managed_table ;create external table external_table (dummy string)
location '/user/tom/external_table' ;
load data inpath 'user/tom/data.txt' into table managed_table ;driop table managed_table ;driop table external_table ;하이브는 2차원으로 테이블 저장소를 관리한다.
각각 행 포맷과 파일 포맷이다.
행포맷은 행과 특정 행의 필드가 저장된 방법을 보여준다.
행포맷은 직렬자-역질렬자(Serializer-Deserializer)의 혼성어인 SerDe라고 부른다.
SerDe는 테이블을 쿼리하는 경우와 같은 역직렬자의 역할을 수행할 때, 파일 내 바이트로부터 데이터의 행을 하이브가 내부적으로 사용 중인 객체로 역직렬화하여 그 데이터에 대한 연산을 수행한다.
INSERT나 CTAS(Create Table As Select)를 수행하는 경우와 같은 직렬자의 역할을 수행할 때, 하이브의 내부 표현에 해당되는 데이터 한 행을 추력 파일에 적합한 바이트로 직렬화한다.
파일 포맷은 행 안에 있는 필드가 포장된 방법을 말한다.
기본 저장 포맷: 구분자-텍스트
기본적인 행 구분자는 탭 문자가 아니라 아스키 제어코드의 집합 중 Ctrl-A 문자(\001)다.
ARRAY나 STRUCT의 항목이나, MAP의 키/값 쌍을 구분하기 위해 사용되는 기본적인 컬렉션 항목 구분자는 Ctrl-B(\002)다. MAP에서 키와 값을 구분하기 위해 사용되는 기본적인 키/값 구분자는 Ctrl-C 문자(\003)이다.
테이블의 행은 개행문자로 구분된다.
기본적으로 하이브는 LazySimpleSerDe를 사용한다. Lazy가 접두사로 붙은 이유는, 필드가 실제 사용되는 시점에서만 역직렬화되기 때문이다.
쪽, 표 12-4. 하이브 SerDe
RegexSerde : 파일에서 각 필드가 특정 구분자로 분리되지 않는 경우, 정규식을 활용....
create table records (year string, temperature int, quality int)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
with serdeproperties (
"input.regex" = ""
) ;
load data local inpath 'input/ncdc/micro-tab/sample_raw.txt'
overwrite into table records ;
input.regex는 행을 형성하는 한 라인의 텍스트를 열의 집합으로 전환시키는 역직렬화 과정에서 사용할 수 있는 정규표현식 패턴이다.
데이터 적재 연산에서는 SerDe가 사용되지 않으며, 테이블에서 데이터를 검색할 때, SerDe가 역직렬화를 위해 호출된다.
개발 시점에서는 테스트용으로 활용할 수 있으나, 성능이 좋지 않으므로 운영 시점에서는 사용하지 않는 것이 좋다.
insert overwrite table
insert overwrite table target
select col1, col2
from source ;
from source
insert overwrite table target
select col1, col2 ;
from records2
insert overwrite table stations_by_year
select year, count(distinct station)
group by year
insert overwrite table stations_by_year
select year, count(1)
group by year;
create table target
as
select col1, col2
from source ;
altr table source rename to target ;
alter table target add columns (col3 string) ;
drop table target ;
bin/hadoop fs -rmr /user/hive/warehouse/target/* ;
create table target like source ;
from records2
select year, temperature
distribute by year
sort by year asc, temperature desc ;