hive begins

22
HIVE Begins springloops@지메일.1385월요일 그럼 지금부터 Hive대해서 간략하게 소개해드리도록 하겠습니다. 발표를 한시간 안에 끝내야 해서 질문은 마지막에 받도록 하겠고, 발표에 부족한 부분이 있을수 있습니다만, 발표 이후에라도 부족한 부분에 대해서 답변드리도록 노력하겠습니다.

Upload: sungmin-oh

Post on 28-Nov-2014

2.377 views

Category:

Documents


4 download

DESCRIPTION

hive 소개

TRANSCRIPT

Page 1: Hive begins

HIVE����������� ������������������  Begins

오 성 민 springloops@지메일.컴

13년 8월 5일 월요일

그럼 지금부터 Hive에 대해서 간략하게 소개해드리도록 하겠습니다.발표를 한시간 안에 끝내야 해서 질문은 맨 마지막에 받도록 하겠고, 발표에 부족한 부분이 있을수 있습니다만, 발표 이후에라도 부족한 부분에 대해서 답변드리도록 노력하겠습니다.

Page 2: Hive begins

목차

1. Hive����������� ������������������  소개2. Hive����������� ������������������  architecture3. Hive����������� ������������������  데이터����������� ������������������  단위����������� ������������������  구성4. HiveQL5. User����������� ������������������  Defined����������� ������������������  Function6. HiveQL����������� ������������������  과����������� ������������������  M/R����������� ������������������  비교7. Demo

13년 8월 5일 월요일

발표 순서는 hive에 대한 간략한 소개,hive의 아키텍처, 데이터 단위 구성, hive QL, 사용자 정의 함수그리고 hive QL과 map reduce의 비교를 해드리고간략한 데모시연을 순서로 진행하겠습니다.

Page 3: Hive begins

Hive����������� ������������������  ??

•Hadoop����������� ������������������  Eco����������� ������������������  system

•데이터����������� ������������������  웨어하우스����������� ������������������  프레임웍

•데이터����������� ������������������  요약을����������� ������������������  좀더����������� ������������������  쉽게

•페이스북에서����������� ������������������  개발����������� ������������������  (2007년)

•현재����������� ������������������  Apache����������� ������������������  오픈소스로����������� ������������������  공개

13년 8월 5일 월요일

hive란 Hadoop 에코 시스템으로 하둡 기반의 데이터 웨어하우징 프레임웍입니다.하둡에 있는 데이터를 관리 하기 위해 ,하이브가 있기 전에는 프로그래머들이 map reduce 프로그램을 작성하여 데이터를 관리하였는데페이스북에서 조금 더 쉽고 명확하게 데이터를 관리하고 학습하기 위해 2007년도에 개발하였고 현재는 아파지 제단에 오픈소스로 공개되어있습니다.

Page 4: Hive begins

Hive����������� ������������������  ??

•HiveQL

•실시간����������� ������������������  쿼리����������� ������������������  불가

•Row����������� ������������������  단위����������� ������������������  수정/삭제����������� ������������������  불가

•트랜잭션����������� ������������������  제공����������� ������������������  X

13년 8월 5일 월요일

하이브는 Hive QL이라는 SQL 베이스의 쿼리를 제공해서  사용자가 쿼리를 통해 데이터 분석과 요약을 좀더 쉽게 할수 있도록 하는 클라이언트 툴입니다.동시에 Hive QL은 전통적인 맵-리듀스 프로그래머들이 그들의 맵과 리듀스를 좀 더 쉽게 추가할 수 있도록 지원하여Hive QL의 기본 기능에서 제공하지 않는 좀 더 복잡한 데이터를 분석할 수 있게 끔 한다.

기본적으로 하둡은 배치 프로세스를 위한 시스템이고 하둡 잡을 실행하고 스케쥴링 하는데 부가적인 오버헤드가 발생한다. 결과적으로 하이브를 통해 약간의 데이터를 가지고 온다고 해도 하이브의 쿼리는 실시간으로 결과를 반영할 수 없습니다.하이브는 쿼리 시에 적절히 인내할 수 있는 시간을 제공하는 것을 목표로 한다.

하이브에서 사용하는 데이터는 HDFS 에 저장 되는데, HDFS 는 한번 저장한 파일은 수정할 수 없기 때문에 행 단위 update, delete가 불가능 하고트랜잭션을 제공하지 않습니다.

Page 5: Hive begins

Architecture

13년 8월 5일 월요일

하이브의 아키텍쳐는 크게 하이브 클라이언트, 메타스토어, 드라이버 로 구분이 됩니다.하이브 클라이언트는 사용자로 부터 쿼리 명령어를 받고 드라이버로 전달 합니다.드라이버는 클라이언트로 부터 전달 받은 쿼리를 파싱하고 최적화 한뒤에 실행계획을 만들고하둡의 잡트래커로 잡을 요청 합니다.하이브는 테이블 스키마와 시스템 메타 데이터를 HDFS에 저장하지 않고별도의 저장소에 저장 하도록 구현 되어 있습니다.이를 메타스토어라고 부릅니다.기본적으로 아파치 더비 디비를 포함하고 있으며, 일반적인 상용 구성에서는 mysql을 활용한다고 합니다.

Page 6: Hive begins

Hive����������� ������������������  데이터����������� ������������������  단위����������� ������������������  구성

•Database

•Table

•partition

•Row

•Column

13년 8월 5일 월요일

하이브의 데이터 단위 구성은 다음과 같이 RDBMS 의 개념을 재사용 하고 있습니다.

Page 7: Hive begins

Hive����������� ������������������  데이터����������� ������������������  단위����������� ������������������  구성

Hive����������� ������������������  단위 예

Database myDB

Table docs

Partition year=2013

Row 1����������� ������������������  ROW

Column col1

∴����������� ������������������  {hive_root}����������� ������������������  일반적으로����������� ������������������  hive의����������� ������������������  root����������� ������������������  는����������� ������������������  /user/hive/warehouse

{hive_root}/myDb

{hive_root}/myDb/docs

{hive_root}/myDb/docs/year=2013

Hadoop HDFS

files000000_0000000_1000000_2

foo1, bar1, 2013foo2, bar2, 2013foo3, foo3, 2013

13년 8월 5일 월요일

RDBMS 의 단위 개념이 HDFS에서 어떻게 적용 되는지 예를 들어 설명해드리겠습니다.데이타베이스, 테이블, 파티션, 로우, 컬럼이 다음의 예와 같이 존재 할 경우HDFS에는 데이타베이스 부터 파티션까지 디렉토리 수직 구조로 정의 됩니다.로우는 파티션 하위에 존재하는 파일 내용중 각 라인을 표현하고,컬럼은 각 라인을 구분자로 구분한 각 필드의 값이 됩니다.여기서는 foo1, bar1, 2013이 각 row가 되고foo1이 column이 됩니다.

Page 8: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Create����������� ������������������  table

CREATE [EXTERNAL] TABLE page_view(viewTime INT , userid BIGINT                     , ip STRING COMMENT 'IP Address of the User')    PARTITIONED BY(dt STRING, country STRING)    ROW FORMAT DELIMITED    FIELDS TERMINATED BY '\t'    STORED AS TEXTFILE;

13년 8월 5일 월요일

이제 실제 HIVE를 사용하기 위한 명령어인 HIVEQL에 대해서 말씀드리겠습니다.여기 다홍빛 글자는 HIVE의 예약어이고, 하얀 글자는 사용자 정의 구문, 회색 글자는 해당 명령문의 옵션 값들입니다.앞으로 설명할 페이지 모두 동일 하니 참고해 주시기 바랍니다.

여기 있는 예시는 예상하셨겠지만, 테이블을 만드는 명령문입니다.SQL과 비슷합니다.기본 적으로 create table 테이블 명, 컬럼명, 데이터 타입을 정의 하면 됩니다.옵션으로는 커멘트를 정의 할수 있는데 테이블과 , 각 컬럼 별로 정의 할수 있고파티션을 정의 해서 검색에 효율적으로 대처 할수 있습니다.ROW FORMAT DELIMITED 명령어 부터는 파일의 포멧에 대해 설명하는 부분으로FIELDS TERMINATED BY 명령어를 추가 함으로서 파일의 필드를 구분 짓기 위해 명시해주는 명령어입니다.예에서는 탭 문자로 필드를 구분짓고 있습니다.스토어 명령어는 저장될 파일 포멧을 정의 합니다. 기본적으로 TEXTFILE 포멧이 있고, sequenceFile, RCFile 포멧이 있습니다.

마지막으로 external 키워드는 데이터의 관리를 하이브가 하지 않겠다는 의미 입니다.이말은 테이블 스키마가 삭제되어도 데이터는 삭제 되지않는 다는 것을 말합니다.HDFS에 있는 데이터를 하이브만 사용하는게 아니라다른 하둡의 에코시스템에서도 사용하는 경우 유용합니다.

Page 9: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Load����������� ������������������  data

LOAD DATA [LOCAL] INPATH 'filepath' INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

INSERT (OVERWRITE|INTO) TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] SELECT columns.. FROM from table;

13년 8월 5일 월요일

이제 만들어 놓은 테이블에 데이터를 넣는 방법에 대해 설명하겠습니다.데이터를 테이블에 적재 시키기 위해 HiveQL은 LOAD DATA와 INSERT TABEL 키워드를 제공합니다.LOAD DATA는 HDFS에 존재하는 파일을 불러와 테이블에 넣는 방법이고LOAD DATA INPATH 파일 패스 INTO TABLE 형태로 표현합니다.

INSERT TABLE은 SELECT 쿼리와 조합하여, SELECT 쿼리의 결과를 테이블에 넣는 방법입니다.OVERWRITE 의 경우 테이블에 데이터가 존재 할경우 덮어쓰게 되고, INTO는 뒤로 추가하게 됩니다.파티션이 존재 하는 테이블일 경우 옵션 처럼 파티션 정의 값을 함께 정의 해 주어야 합니다.

Page 10: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Query����������� ������������������  Data1 Select Syntaxe.g) SELECT * FROM t1

2 WHERE Clausee.g) SELECT * FROM sales WHERE amount > 10 AND region = "US”

3 DISTINCT Clausese.g) SELECT DISTINCT col1 FROM t1

4 Partition Based Queries e.g) partition(region string)e.g) SELECT * FROM sales WHERE region = "US” AND amount > 10

5 HAVING Clausee.g) SELECT col1 FROM t1 GROUP BY col1 HAVING SUM(col2) > 10

6 LIMIT Clausee.g) SELECT * FROM sales ORDER BY amount DESC LIMIT 5

13년 8월 5일 월요일

SELECT 구문입니다.SELECT, FROM, WHERE 절로 구성이 되있고 알고 계시는 SQL과 동일합니다.차이가 있다면 HIVEQL은 서브 쿼리가 FROM 절에서만 가능합니다.다음으로 넘어가겠습니다.

Page 11: Hive begins

HiveQL����������� ������������������  -����������� ������������������  JoinSELECT p.user, p.post, l.count

FROM posts p JOIN likes l ON (p.user = l.user);

SELECT p.*, l.*FROM posts p LEFT OUTER JOIN likes l ON (p.user = l.user)

SELECT p.*, l.*FROM posts p RIGHT OUTER JOIN likes l ON (p.user = l.user)

SELECT p.*, l.*

FROM posts p FULL OUTER JOIN likes l ON (p.user = l.user)

13년 8월 5일 월요일

보시는 쿼리는 JOIN 쿼리인데요.HIVEQL은 INNER JOIN, LEFT OUTER, RIGHT OUTER, FULL OUTER JOIN 만 제공합니다.

Page 12: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Group����������� ������������������  by

SELECT pv_users.gender , count(*) , count(DISTINCT pv_users.userid) , sum(DISTINCT pv_users.userid)   FROM pv_usersGROUP BY pv_users.gender;

13년 8월 5일 월요일

GROUP BY 역시 SQL과 동일 합니다.

Page 13: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Alter����������� ������������������  table

ALTER TABLE old_table_name RENAME TO new_table_name;

ALTER TABLE old_table_name REPLACE COLUMNS (col1 TYPE, ...);

ALTER TABLE table_name ADD COLUMNS ( c1 INT COMMENT 'a new int column' , c2 STRING DEFAULT 'def val');

ALTER TABLE table_name ADD PARTITION (ds='2008-08-08') LOCATION ‘/logs/2011/01/01’

ALTER TABLE table_name DROP PARTITION (ds='2008-08-08')

13년 8월 5일 월요일

테이블을 수정하는 명령어인 alter table 입니다.- rename to 로 기존 테이블 이름을 변경할 수 있고,- replace columns 로 컬럼의 속성을 변경할 수 있습니다. replace columns 경우 기존의 모든 컬럼을 삭제하고 다시 등록하게 됩니다.- add columns 로 새로운 컬럼을 추가 하고,- add partition, drop partition으로 파티션 데이터를 추가/삭제 할수 있습니다.

Page 14: Hive begins

HiveQL����������� ������������������  -����������� ������������������  Drop����������� ������������������  table

DROP TABLE pv_users;

13년 8월 5일 월요일

마지막으로 DROP table 명령어는 테이블의 스키마와 데이터를 함께 삭제 하는 명령어 입니다.EXTERNAL 테이블이 아닌 경우 데이터까지 삭제 되므로 사용자의 주의가 필요합니다.

하이브는 데이터만 삭제 하는 명령어가 없습니다. 하지만 강제로 데이터만 삭제 하고 싶을 경우HDFS 에서직접 파일을 삭제 하면 스키마는 남고 데이터만 삭제하게 됩니다.

Page 15: Hive begins

User����������� ������������������  Defined����������� ������������������  Function

입력 출력 예

User����������� ������������������  Defined����������� ������������������  Function(UDF)

단일����������� ������������������  행 단일����������� ������������������  행 SUBSTR,����������� ������������������  round

User����������� ������������������  Defined����������� ������������������  Aggregate����������� ������������������  Function

(UDAF)다중����������� ������������������  행 단일����������� ������������������  행 SUM,����������� ������������������  ����������� ������������������  MAX

User����������� ������������������  Defined����������� ������������������  Table����������� ������������������  generating����������� ������������������  Function

(UDTF)단일����������� ������������������  행 다중����������� ������������������  행 explode

13년 8월 5일 월요일

하이브 역시 기본적으로 몇십가지 쿼리 함수를 제공하는데, 그것 이외에 사용자 정의 함수를 만들어 사용할 수 있습니다.UDF, UDAF, UDTF 이렇게 세가지 형태의 방법을 제공 하는데요.- UDF의 경우 SUBSTR, ROUND 와 같은 함수 들 처럼, 단일 행의 입력을 받아 하나의 값을 출력하는 함수를 에 해당 하며,

- UDAF 의 경우 SUM, MAX 함수 등과 같이, 다수 행의 입력을 받아 하나의 값을 출력하는 집계 함수에 해당합니다.

- UDTF 의 경우 특별한 함수를 정의 할 수 있게 지원하는데, 하나의 값을 분할 하여 다중 행의 테이블형태로 출력하는 사용자 정의 함수 입니다. HIve에서 제공하는 explode 함수가 해당됩니다.

Page 16: Hive begins

UDTF����������� ������������������  Example

SELECT explode(myCol) AS myNewCol FROM myTable;

myCol : Array<int>

[1, 2, 3]

[4, 5, 6]

myNewCol : int

1

2

3

4

5

6

myTable

13년 8월 5일 월요일

UDTF 에 대해 조금더 말씀 드리면 보시는 것 처럼 myTable 이라는 테이블이 존재 하고, ARRAY 데이터 형의 컬럼이 있을 경우 다음과 같이 explode 함수를 사용하여 쿼리 하면,오른쪽 하단과 같이 결과값이 하나의 테이블 형태로 출력되게 됩니다.이런식으로 동작하는 사용자 정의 함수를 UDTF 라고 합니다.

Page 17: Hive begins

UDF����������� ������������������  ExampleDependency

- hadoop-core-*.jar- hive-exec-*.jar- jdo2-api-*.jar

ADD jar /path/hive-examples.jar;

CREATE TEMPORARY FUNCTION myLower AS ‘com.springloops.hive.udf.Lower‘;

SELECT myLower(col1) FROM myTable;

13년 8월 5일 월요일

아주 간단한 사용자 정의 함수를 만들고 사용하는 법을 설명 드리겠습니다.우선 UDF 클래스는 hadoop-core, hive-exec, jdo-api 에 대한 디펜던시를 갖습니다.따라서 이 세 라이브러리를 클래스 패스에 추가 해주셔야 하고,새롭게 생성할 사용자 정의 함수 클래스는 UDF 클래스를 상속 받고,하나 이상의 evaluate 메서드를 구현해주어야 합니다.컴파일과 빌드 작업으로 jar 파일을 생성을 하고하이브 클라이언트에서 다음과 같이 add jar 명령으로 해당 jar를 등록합니다.다음으로 create temporary function 키워드로 사용자 정의 함수를 선언합니다.그럼 쿼리문에 다음과 같이 정의한 함수를 사용하실 수 있습니다.

Page 18: Hive begins

HiveQL����������� ������������������  With����������� ������������������  Map/Reduce

pageid age

1 25

1 25

pv_users

pageid age count

1 25 3

pageid age

2 32

1 25

Map

key value

<1,25> 2

key value

<1,25> 1

<2,32> 1

key value

<1,25> 2

<1,25> 1

key value

<2,32> 1

Shuffle Sort

pageid age count

2 32 1

Reduce

Grouping SELECT����������� ������������������  pageid,����������� ������������������  age,����������� ������������������  count(*)����������� ������������������  FROM����������� ������������������  pv_users����������� ������������������  GROUP����������� ������������������  BY����������� ������������������  pageid,����������� ������������������  age

1

1

2

2

3

3

13년 8월 5일 월요일

마지막으로 하이브와 map/reduce 의 작업을 비교해 보겠습니다.Grouping의 경우 Map/reducec가 만들어진 목적과 부합하는 예인데요.데이터 셋에서 그룹해서 출력해야할 필드를 키로 묶고,데이터를 순회 하며 키에 해당 하는 값을 1로 채웁니다.리듀스는 키를 기반으로 값을 합하고, 구분자로 묶인 키를 분리 하여 출력하는 형태로 진행됩니다.

Page 19: Hive begins

HiveQL����������� ������������������  With����������� ������������������  Map/Reduce

key value

111 <1,1>

111 <1,2>

222 <1,1>

pageid userid time

1 111 9:08:01

2 111 9:08:13

1 222 9:08:14

userid age gender

111 25 female

222 32 male

page_view

user

pv_users

key value

111 <2,25>

222 <2,32>

Map

key value

111 <1,1>

111 <1,2>

111 <2,25>

key value

222 <1,1>

222 <2,32>

Shuffle Sort

Pageid age

1 25

2 25

pageid age

1 32

Reduce

Join SELECT����������� ������������������  pageid,����������� ������������������  age����������� ������������������  FROM����������� ������������������  page_view����������� ������������������  p����������� ������������������  JOIN����������� ������������������  user����������� ������������������  u����������� ������������������  ON����������� ������������������  p.userid����������� ������������������  =����������� ������������������  u.userid

1

1

2

2

13년 8월 5일 월요일

다음으로 JOIN 쿼리의 경우에 대해서 말씀드리면,위와 같이 페이지 뷰 테이블과 유저 테이블을 유저아이디로 조인을 하여 쿼리를 할경우HIVEQL은 위에 보시는 것처럼 간단하게 뽑을 수 있습니다.쿼리 아래 그림은 맵리듀스로 조인하는 디자인 패턴을 표현한 것입니다.첫번째로 매퍼는 각 데이터 셋에서 입력 레코드를 가져 오고, 다음으로 레코드에서 외래 키를 추출 하여 조인 연산을 준비 합니다.두 개 이상의 데이터 셋이므로 각 데이터 셋에 대한 식별자를 포함합니다.리듀서는 동일한 키에 대한 값을 전달 받고 값을 순회 하면서 레코드를 조인합니다.

Page 20: Hive begins

����������� ������������������  ����������� ������������������  DEMO1.����������� ������������������  테이블����������� ������������������  생성2.����������� ������������������  데이터����������� ������������������  인서트3.����������� ������������������  셀렉트4.����������� ������������������  join5.����������� ������������������  UDF����������� ������������������  사용

13년 8월 5일 월요일

마지막으로 데모를 할텐데요말씀 드린대로 HIVE QL은 SQL 과 많이 유사 하므로 간단하게 실행해보는 것으로 마무리 하겠습니다.

Page 21: Hive begins

Hive����������� ������������������  Information

• 한글

• http://pizzastudio.tistory.com/8

• http://www.jopenbusiness.com/mediawiki/index.php/Hive

• 영문

• https://cwiki.apache.org/confluence/display/Hive/LanguageManual

• https://cwiki.apache.org/confluence/display/Hive/Home

• http://courses.coreservlets.com/Course-Materials/pdf/hadoop/07-Hive-01.pdf

13년 8월 5일 월요일

다음은 추천 페이지 입니다.

Page 22: Hive begins

감사합니다.Q����������� ������������������  &����������� ������������������  A

13년 8월 5일 월요일