Transcript 하이브
12. 하이브
12.1 하이브 설치하기
1. http://mirror.apache-kr.org/hive/hive-1.2.1/
2. /usr/local로 파일 위치 옮김
3. tar xzvf hive-1.2.1.tar.gz
4. Ln –s apache-hive-1.2.1-bin hive
5. 환경 변수 설정
6. Export HIVE_HOME=/usr/local/hive
7. Export PATH=$PATH:$HIVE_HOME/bin:$PATH
8. Hadoop fs –chmod 777 /tmp/hive
9.
http://wiki.gurubee.net/pages/viewpage.action?pageId=28116102
12.1 하이브 설치하기
하이브는 사용자의 워크스테이션에서 수행되고 SQL쿼리가 하둡 클
러스터에서 구동되도록 일련의 맵리듀스 작업으로 변경된다.
하이브는 데이터를 테이블로 표현하여 구조체와 HDFS에 저장된 데
이터가 연결되는 수단을 제공한다.
테이블 스키마 같은 메타데이터는 메타스토어라는 데이터베이스에
저장된다.
12.1 하이브 쉘
하이브 셀은 HiveQl의 명령어를 수행하여 하이브와 상호작용하는 기
본적인 도구이다.
HiveQl은 SQL 같은 하이브의 쿼리 언어다. 하이브는 MySQL에 많은
영향을 받았다.
SQL처럼 일반적으로 대소문자를 구분하지 않는다.
12.2 예제
기상 데이터셋을 하이브로 다뤄 보겠다.
먼저 하이브의 관리 저장소로 데이터를 옮겨야 하는데 하이브의 저
장소로 로컬 파일시스템을 사용할 것이다.
RDBMS처럼 하이브는 데이터를 테이블로 관리한다.
12.2 예제
Create table 구문을 사용하여 기상 데이터를 저장하기 위한 테이블을 생성
->CREATE TABLE records (year STRING, temperature INT, quality INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
-> year, temperature, qulity 컬럼으로 구성된 records테이블 선언
->ROW FORMAT구문은 HiveQL에서 특별히 사용됨
이 선언문은 데이터파일의 각 로우는 탭으로 분리된 텍스트임을 의미
->하이브는 탭과 개행문자로 필드와 로우를 구분하고, 각로우는 세 개의 필
드(테이블의 컬럼에 상응하는)로 인식한다.
12.2 예제
데이터 적재
->LOAD DATA LOCAL INPATH ‘input/ncdc/micro-tab/sample.txt’
OVERWRITE INTO TABLE records;
(sample.txt데이터를 hive디렉터리에 넣어야함)
->지정된 로컬 파일을 하이브의 웨어하우스 디렉터리에 적재하라는 의미
->/user/hive/warehouser/records 디렉터리에 sample.txt 적재됨
->LOAD DATA 구문의 OVER WRITE키워드는 하이브가 테이블 생성을 위해
디렉터리에 있는 모든 파일을 삭제하도록 지시 의미
12.2 예제
하이브에 데이터 존재, 쿼리 실행
->select year,MAX(tempearature)
->from records
->Where temperature !=9999
->and(quality=0 or quality=1 or quality=4 or quality=5 or quality=9)
->group by year;
->연도별 최고 기온을 찾기 위해 MAX집계 함수를 사용하고, year를 기준으
로 그룹핑을 하기 위해 group by와 함께 select문을 사용함.
->하이브가 이 쿼리를 사용자 대신에 맵리듀스 잡으로 바꿔 실행하고 그 결
과를 콘솔로 출력한다는 사실에 주목.
12.2 예제
12.3 하이브 실행하기
<하이브 실행>
환경설정
->하둡에서와 같이 XML 설정파일
->conf 디렉터리에 있는 hive-site.xml 설정
로깅
->하이브의 로그 파일 : /tmp/$USER(root)/hive.log
->로깅 설정은 conf/hive-log4;.properties
->디버그 메시지를 콘솔로 보내는 명령어
hive –hiveconf hive.root.logger=DEBUG,console
12.3 하이브 실행하기
<하이브 서비스>
Hive –service help
Cli
-하이브(셀)에 대한 명령행 인터페이스. 가장 기본적인 서비스다.
Hiveserver
-쓰리프트,JDBC,ODBC 연결자를 사용하는 응용프로그램은 하이브와 통신하
기 위해 하이브 서버를 실행팔 필요가 있음.
Hwi
-하이브 웹 인터페이스
Jar
-classpath에 하둡과 하이브 클래스 모두를 사용하는 자바 응용프로그램을
실행하기 위한 방법
Metastore
-메타스토어를 독립형 프로세스로 실행
12.3 하이브 실행하기
<하이브 서비스>
하이브 서버(hive –service hiveserver)를 행하고 나면 응용프로그램은
다양한 방법으로 하이브에 연결할 수 있다.
쓰리프트 클라이언트
-하이브 명령을 다양한 프로그래밍 언어로 수행할 수 있도록 지원한다.
(C++,자바,PHP,파이썬 루비를 지원)
JDBC / ODBC 드라이버
-하이브 서버와 통신하려고 쓰리프트를 사용.
12.3 하이브 실행하기
<메타스토어>
메타스토어는 하이브 메타데이터에서 가장 중요한 저장소이다.
메타스토어는 서비스와 데이터백업 저장소로 나뉜다.
메타데이터 서비스는 하이브 서비스와 동일한 JVM에서 실행되고
로컬 디스크에 백업되는 임데비드 더비 데이터베이스를 포함한다.
이를 임베디드 메타스토어 설정이라 함.
12.3 하이브 실행하기
<메타스토어>
임베디드 메타스토어
-하이브를 설치하면 기본적으로 사용한다. 메타스토어가
로컬에 파일로 생성되므로 한번에 하나의 프로세스만 메타
스토어ㅔ 접근할 수 있다.
로컬 메타스토어
-메타데이터가 모두 원격(또는 로컬)의 데이터베이스에 저
장된다.
원격 메타스토어
-메타데이터가 모두 원격(또는 로컬)의 데이터베이스에 저
장된다. 하지만 로컬 메타스토어와는 달리 메타스토어를
서비스하는 별도의 서버가 기동되며, 클라이언트는 데이터
베이스에 집적 쿼리문을 날리는 대신 메타스토어 서버의
중개는 받게 된다.
12.4 전통적인 데이터베이스와의 비교
<읽기 스키마와 쓰기 스키마>
전통적인 데이터베이스에서 테이블의 스키마는 데이터를 적재하는 시점에
검증.
만일 적재중인 데이터가 스키마에 부합되지 않으면 해당 데이터를 거부한다.
이쓰기 스키마라고 함.
반대로, 하이브는 적재 시가 아니라 쿼리가 발행될 때 데이터를 검증.
이를 읽기 스키마라고 함.
12.4 전통적인 데이터베이스와의 비교
갱신
-하이브는 갱신을 지원하지 않음
-실제 테이블 갱신의 경우는 아예 새로운 테이블을 만들어 데이터를 변환
-insert into를 통하여 테이블에 새로운 로우를 추가할 수 있음.
색인
-하이브0.7.0부터 쿼리를 빠르게 처리해야 하는 특별한 경우를 위한
색인 기능을 지원
-HDFS 블록 넘버로 저장.
12.5 HiveQL
12.5 HiveQL
<데이터형>
하이브는 기본형과 복합형 데이터형 모두를 지원.
-기본형은 숫자형, 불린, 문자열, 타임스탬프 타입을 포함
-복합형은 배열, 맵, 구조체를 포함
12.5 HiveQL
<연산자와 함수>
하이브는 관계형(동등성 검증을 위한 x=‘a’, 무효성 검증을 위한 x IS NULL,
패턴 매칭을 위한 x LIKE ‘a%’와 같은), 산술 연산자, 논리 연산자와 같은 일반
적인 집합의 SQL 연산자를 제공
하이브는 다수의 내장 함수를 포함
- hive>how functions;
암묵적 형변환
-모든 정수 숫자형, FLOAT, STRING은 DOUBLE로 암묵적 형변환이 가능.
-TINYINT, SMALLINT, INT는 모두 FLOAT로 형변환 가능.
-BOOLEAN은 변환될 수 없음.
명시적 형변환
-CAST를 사용
12.6 테이블
하이브 테이블은 논리적으 저장된 데이터와 테이블에서 뎅디터의 배치를 기
술하는 관련 메타데이터로 구성.
하이브는 HDFS가 아닌 관계형 데이터베이스에 메타데이터를 저장.
12.6 테이블
<관리 테이블과 외부 테이블>
테이블 생성 시,
하이브는 기본적으로 데이터를 직접 관리
-데이터를 웨어하우스 디렉터리로 이동한다는 의미
사용자는 외부 테이블을 생성
-웨어하우스 디렉터리 외부에서 데이터를 참조
12.6 테이블
<관리 테이블과 외부 테이블>
관리테이블
-사용자가 데이터를 관리 테이블에 적재할 때,
데이터는 하이브의 웨어하우스 디렉토리로 이동.
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 ;
- 외부 테이블은 external 키워드를 사용한다.
-하이브는 데이터를 직접 관리할 필요가 없기 때문에 EXTERNAL키워드를 써
서 데이터를 웨어하우스 디렉터리로 이동시키지 않는다.
12.6 테이블
<파티션과 버킷>
파티션이란?
-테이블을 날짜와 같은 파티션 컬럼의 값을 기반으로 크게 나눠놓은 방식을
일컫는다.
예)날짜와 국가 코드로 파티셔닝
CREATE TABLE logs ( ts BIGINT , line STRING )
PARTITIONED BY ( dt STRING , country STRING )
/user/hive/warehouse/logs
├------ dt = 2001-01-01/
|
|------country = GB/
|
|
|--------file1
LOAD DATA LOCAL INPATH ‘input/hive/partitions/file1’ |
|
└-------file2
INTO TABLE logs
|
└-----country = US/
PARTITION ( dt = ‘2001-01-01’ , country = ‘GB’ );
|
└-------file3
└------- dt = 2001-01-02/
└-----country = GB/
|
└-------file4
└------country = US/
└-------file5
└-------file6
12.6 테이블
<파티션과 버킷>
버킷이란?
-어떤 종류의 레코드를 몇 개씩 묶은 것을 기억하는 장소
테이블을 버킷으로 구성하려는 이유
-더욱 효율적인 쿼리가 가능
-샘플링을 더욱 효율적으로 할 수 있음
버킷은 테이블 디렉터리 안에 파일 하나로 표현
CREATE TABLE bucketed_user(id INT, name STRING)
CLUSTERED BY (id) INTO 4 BUCKETS;
CREATE TABLE bucketed_users(id INT,name STRING)
CLUSTERED BY (id) SORTED BY(id ASC) INTO 4 BUCKETS
버킷개수와 버킷팅할 컬럼을 지정하기 위해 CLUSTERED BY절 사용
SORTED BY-정렬된 버킷을 가졌음을 선언
12.6 테이블
<파티션과 버킷>
버킷팅되지 않은 Users테이블 생성
-create table users(id int,name string)
-load data local inpath ‘input/hive/tables/users.txt’ int table users;
버킷팅된 테이블로 유치하기
Insert overwrite table bucketed_users
Select * from users;
Bucketed-user테이블 배치 살펴보기
hive>dfs –ls /user/hive/warehouse/bucketed_users;
12.6 테이블
<데이터 임포트하기>
삽입
-INSERT OVERWRITE TABLE target
SELECT col1, col2 FROM source ;
-INSERT OVERWRITE TABLE target
PARTITION (dt=‘2001-01-01’)
SELECT col1, col2 FROM source ;
다중 테이블 삽입
-FROM records2
INSERT OVERWRITE TABLE records_by_year
SELECT year, count(1)
GROUP BY year
INSERT OVERWRITE TABLE good_records_by_year
SELECT year, count(1)
WHERE temperature != 9999
AND (quality=0 OR quality=1 OR quality=4 OR quality=5 OR
quality=9)GROUP BY year;
하나의 원본 테이블(record2)과 세 개의 다른 쿼리에 대한 결과를 담고 있는
세 개의 테이블이 존재
12.6 테이블
<테이블 변경/삭제하기>
새로운 테이블에 하이브 쿼리의 결과를 저장
-CREATE TABLE targer
AS
SELECT col1, col2
FROM source;
테이블 변경
-ALTER TABLE문 사용
-ALTER TABLE source RENAME TO target <-테이블 이름 변경
-ALTER TABLE target ADD COLUMNS (col3 STRING) <- 속성 변경
테이블 삭제
-DROP TABLE문 사용
12.7 데이터 쿼리하기
<정렬과 집계>
ORDER BY
-전체적으로 정렬된 결과를 생성하기 위해 리듀서 개수를 하나로 설정
-대규모 데이터셋 정렬엔 비효율적
SORT BY
-리듀서당 정렬된 파일 생성
DISTRIBUTE BY
-특정 로우가 특정 리듀서로 가도록 설계하여 집계연산을 사용하는 것
FROM records2
SELECT year, temperature
DISTRIBUTE BY year
SORT BY year ASC, temperature DESC;
// year와 temperature정렬 후 연도에 따라 모든 로우가 동일 리듀서에 모임
12.7 데이터 쿼리하기
<맵리듀스 스크립트>
하둡 스트리밍과 같은 방식을 사용하면
TRANSFORM, MAP, REDUCE절을 통해 외부 스크립트나 프로그램을 하이브
에서 호출할 수 있다.
FROM records2
SELECT TRANSFORM(year,
temperature, quality)
USING ‘is_good_quality.py’
AS year,temperature;
12.7 데이터 쿼리하기
<조인>
내부조인
-입력 테이블에서 일치한 바를 로우별로 출력하는 가장 단순한 종류의 조인
외부조인
-조인할 테이블 간 일치하지 않는 데이터를 찾도록 지원
(왼쪽외부조인/오른쪽외부조인)
세미조인
-하이브는 IN서브쿼리를 지원하지 않음
-하지만 LEFT SEMI JOIN을 사용할 수 있음
Select * from things where things.id IN(select
id from sales);
Select * from things
LEFT SEMI JOIN sales
ON(sales.id=things.id)
맵조인
-테이블 하나가 메모리에 적재될 만큼 충분히 작다면 하이브는 각 매퍼 단위
로 조인을 수행할 수 있도록 그 작은 테이블을 메모리로 적재시킬 수 있음.
12.7 데이터 쿼리하기
<서브쿼리>
서브쿼리
-또 다른 SQL문에 포함된 select문.
-select문의 from절에서만 서브쿼리를 지원.
SELECT station, year, AVG(max_temperature)
FROM (
SELECT sation, year, MAX(temperature) AS
max_temperature FROM records2
WHERE temperature != 9999
AND (quality = 0 OR quality | OR quality = 4 OR quality = 5 OR quality = 9)
GROUP BY station.year ) mt;
GROUP BY station.year;
뷰
-select문에서 정의된 가상 테이블
CREATE VIEW valid_records AS
SELECT *
FROM records2
WHERE temperature != 9999
AND (quality = 0 OR quality | OR quality = 4 OR quality = 5 OR quality = 9)
12.8 사용자 정의함수
하이브가 지원하는 내장된 함수로 원하는 쿼리를 작성할 수 없는 경우가 있
음
-> 하이브는 사용자 정의 함수(UDF)를 통해 사용자 자신의 데이터 처리 코
드를 플러그인하고 하이브 쿼리에서 그 함수를 호출할 수 있는 방식을 제공.
UDF는 하이브가 개발된 언어인 자바로 작성되어야함.
12.8 사용자 정의함수
<UDF 작성하기>
- UDF 는 org.apache.hadoop.hive.ql.exec.UDF의 서브 클래스여야 한다.
- UDF는 최소한 하나의 evaluate()메소드를 구현해야 한다.
문자열 끝에서 문자를 잘라내는 UDF
1. evaluate()는
후행 공백을
2. Evaluate()는
주어진 문자
입력에서 선행과
잘라냄.
문자열의 끝에서
집합을 잘라냄.
12.8 사용자 정의함수
<UDAF 작성하기>
정수의 집합에서 최대값을 계산하기 위한 UDAF
Init()-평가자를 초기화하고 내부
상태를 리셋한다.
Iterate()-집계할 새로운 값이 나올
때마다 호출됨. 평가자는 집계 연
산을 수행 중인 결과와 함께 내부
상태를 갱신해야한다.
terminatePartial()-하이브가 부분
적인 집계에 대한 결과를 요구할
때마다 호출된다.
Merge()-하이브가 부분적인 집계
를 또 다른 부분적인 집계와 병합
할지 결정할 때 호출된다.
Terminate()-집계의 최종 결과가
요구될 때 호출됨.