Cloudera Impala 1.0 has been released


지난 4월 30일 클라우데라 임팔라 1.0 GA 버전이 릴리즈했다.

2010년에 구글에서 낸 dremel 논문에서 영감을 받아서 시작했다고 한다.

리서치를 하고 있어서 정리가 되면 dremel과 impala에 대해서 다시 포스팅하기로 하고.

릴리즈 관한 내용은 여기서 확인

추가적인 리소스들

여담이지만 Gigaom 리포트(Sector RoadMap: SQL-on-Hadoop platforms in 2013)에서는 impala가 제일 낫다고.

Posted by 김민우 julingks

댓글을 달아 주세요

Voting Apache Hive 0.11.0 Release Candidate 0


아파치 하이브 0.11.0 RC0가 투표중이다.


현재는 호톤웍스에 Ashutosh Chauhan이 빌드매니징을 하고 있다.


후보0은 다음과 같다.


http://people.apache.org/~hashutosh/hive-0.11.0-rc0/


메이븐 artifacts는 여기서 확인할 수 있다


https://repository.apache.org/content/repositories/orgapachehive-154/


이번 릴리즈는 HiveServer2, 윈도우윙과 분석함수, Decimal 데이터 타입, 향상된 쿼리 플래닝, 성능 향상 및 다양한 버그가 수정되었고 총 350개 이슈이다.


수정된 이슈의 목록은 다음에서 확인할 수 있다.


http://s.apache.org/8Fr


72시간 동안 투표를 수행하고 PMC (Project Management Committee)가 투표할 권한을 가진다.


(회사에서 하이브 커미터였던 Navis님께서 이번에 PMC 맴버가 되었다)


암튼 하이브 0.11.0 이 곧 출시 임박. (RC 다운 받아서 미리 써봐야지)




-----


5월 2일 추가


버그 핫픽스 하고 rc1 다시 투표중
https://svn.apache.org/repos/asf/hive/tags/release-0.11.0-rc1


소스 타르 볼과 바이너리 artifacts는 여기 
http://people.apache.org/~hashutosh/hive-0.11.0-rc1/

하이브 메이븐 artifacts는 여기
https://repository.apache.org/content/repositories/orgapachehive-158/

hcatalog 메이븐 artifacts는 여기
https://repository.apache.org/content/repositories/orgapachehcatalog-159/



Posted by 김민우 julingks

댓글을 달아 주세요

Book : Programming Hive

Hive 2013.04.23 17:33

Book : Programming Hive


Programming Hive 번역본이 출간되었다.


하이브 완벽 가이드, O'REILLY, 한빛 미디어 에드워드 카프리올로, 딘 웜플러, 제이슨 러더글렌 지음 (오세봉 외 옮김)


 회사 동료분들이 번역 했고 나는 부록A를 집필했다.

영문판을 미리 받아 봤지만 훝어보기만 하고 방치하다가 교육 자료를 만들려니 번역본을 읽었다.

그래서 출간된지 20일이 넘어서야 책을 다 읽게 되었다. 하이브가 딱히 마땅한 레퍼런스 북이 없어서 하이브 사용자들은 대부분 이 책을 구매할 것으로 예상되긴 하지만 그래도 이 책을 읽어야 되는 이유를 간단히 적고자 한다. (홍보 때문은 아니고 어둠에 경로를 통해서라도.)


 우선 하이브 오픈소스 커뮤니티가 왕성하게 활동하는 결과로 많은 기능이 추가되고 있는데 그에 비해서 문서 보강은 더디다. 그래서 문서가 최신 상태가 아닌 경우가 많은데 이때는 사용자 메일링이나 JIRA에서 이슈를 찾아보게 된다. 그래도 못 찾는 경우에는 아예 코드를 뒤져보는게 맘편하다. 하지만 아무리 이슈와 소스가 공개되어 있다고 하더라도 사용자가 직접 찾아보는 것은 시간과 수고가 드는 일이다. 그나마 이 책은 0.10 버전 기준으로 가장 최신의 하이브의 기능을 설명하고 있다.


 하이브를 사용하면서 소홀히 하게 되는 보안, 잠금, 권한에 대한 내용도 충분하진 않지만 그 어떤 문서보다 쉽게 잘 정리되어 있다.


 기능이 Case by case 동작이 달라서 직접 문제에 부딪혀봐야 알 수 있는 디테일한 정보들도 깨알같이 정리되어 있다. 매번 까먹고 삽질을 반복하던 내용들이 책을 한 번 훝어보니 깔끔하게 정리가 된다.


 물론 이제 곧 출시된 0.11에는 Decimal Type, 분석함수, ORC 파일포맷, HiveServer2, HCatalog 코드 통합 등 많은 변화가 있을 예정이다. 0.11이 출시되자마자 이 책도 outdated 되겠지만 그래도 0.11에 추가된 새로운 기능이 안정화 되려면 0.12는 되어야 할 것 같다.


기능이 많이 추가된 만큼 버그도 속출하고 있어서 하이브 커뮤니티에서 열심히 수정 중이다.

Posted by 김민우 julingks

댓글을 달아 주세요

New Hive Committer

Hive 2013.04.19 11:02

New Hive Committer


하이브 PMC(Project Management Committee)에서 SAP의 Harish Butani와 Hortonworks의 Owen O'Malley가 커미터 voting을 통과했다.


Harish의 기여는 여기서 확인할 수 있다.


http://s.apache.org/n3h


주요 커밋은 이전에 포스트에 올렸다시피 분석함수와 윈도우 함수 추가이다.

Owen의 기여는 여기서 확인할 수 있다.


http://s.apache.org/wQm


RC파일의 몇몇 문제점을 개선한 ORC(Optimized Row Columnar) 파일 포멧을 추가했다.

Hcatalog 개발자들은 서브 모듈 커미터로 등록 되었는데 이 두 명은 기여한 이슈가 중요한 공헌으로 판단이 되었는지 바로 커미터가 되었다.


회사에 있는 커미터(navis)분께 물어보니 수준(실력)을 보는거 같다고?? 믿거나 말거나.

Posted by 김민우 julingks
TAG commiter, hive

댓글을 달아 주세요

Hive 0.11 will support analytic and windowing functions.


하이브 0.11이 곧 릴리즈 할 것 같다. 이미 빌드 메니저가 0.11 branch를 따는 중인 듯. 곧 출시할 0.11에는 분석함수와 윈도우 함수가 추가될 예정이다.

이 이슈도 오래 끌 줄 알았는데 이번에 trunk에 커밋이 되었다.


하둡 서밋 2012에 SAP에서 하이브 분석함수 관련해서 발표를 하고 github에 코드를 공개했던 harish butani가 하이브에 코드를 기여했다.

문서가 없어서 patch를 살펴 보니, 지원되는 함수가 많다. (오라클에서 지원하는 함수 거의 다 지원하는 듯)


rank, dense_rank, lag, lead, sum, count, cume_dist, percent_rank, ntile, avg, stddev, first_value, last_value, min, max, stddev_pop, collect_set, variance, corr, covar_pop, row_number, percentile, histogram_numberic


이야. Harish butani 이 사람 좀 대단하다. 물론 그전에 오랬동안 개발해 온 것이지만 그동안 분석함수 때문에 하이브를 외면했던 사용자는 다시 돌아와야 할 듯. 윈도우윙 절은 하이브 특성상 partition by, order by 구문 대신 distribute by, sort by 구문으로 바뀐 것이 차이점이다.


예제 쿼리를 하나 보자면 다음과 같다.

select p_mfgr, p_name, p_size,
    sum(p_retailprice) over (distribute by p_mfgr sort by p_size range between current row and unbounded following) as s1
from part ;

 분석함수는 MySQL에서는 지원하지 않는다. 오라클에서 8.1x 버전 부터 지원 됐고, 집계 함수(aggregation function)과 차이점 이라면 집계 함수는 그룹 별로 하나의 행을 결과로 내지만 분석 함수는 결과 셋이 줄지 않는다. 쿼리가 간단해지고 실제 수행 시간도 단축된다는 장점 있다.


 흔히 우리가 집계 함수라고 알고 있는 min, max 도 뒤에 윈도우 절이 붙으면 리포팅 집계 함수로서 분석함수로 처리 된다. 윈도우라는 개념은 하나의 파티션에서 각각 행에 대해서 미끄러지는 창(sliding window)라고 할 수 있다. 현재 행(current row)에 대해서 분석 함수를 처리할 파티션의 정의를 윈도우 절에서 하게 된다.

 

분석 함수의 처리순서는 다음과 같다.

  1. 조인, WHERE, GROUP BY, HAVING 절을 수행한 이후에
  2. 분석 함수가 처리할 결과 셋이 만들어지고 계산이 수행된다.
  3. ORDER BY 절이 있다면, 최종 결과의 순서를 정렬한다.


하이브 0.11에는 HiveServer2, Decimal 데이터 타입, 분석함수 등 많은 향상이 있을 예정이다.


Posted by 김민우 julingks

댓글을 달아 주세요

How to delete a remote Git tag

git tag -d 태그이름
git push origin --tags

를 해도 origin의 태그가 지워지지 않는다. 로컬에서만 지워짐.

한참 삽질하다 구글 선생님에게 물어보니,

git tag -d 태그이름
git push origin :refs/tags/태그이름

이라고 가르쳐 주셨다.


Reference


Posted by 김민우 julingks
TAG git, tag

댓글을 달아 주세요

Decimal data type will be supported in Hive 0.11

Hive 하이브 0.11에는 DECIMAL 타입이 추가될 예정이다.

‘칼 스테인바흐’가 수고를 해주셨군요. 지난 2011년 hive user meetup때 봤는데 키도 크고 잘생긴 훈남. 페북에서 일하다 지금은 citus data에서 일하는 듯.


https://issues.apache.org/jira/browse/HIVE-2693


이제 Date 타입만 추가되면 얼추 쓸만한 데이터 타입은 다 갖춰지는 듯.

Posted by 김민우 julingks

댓글을 달아 주세요

Hive query for granting all authorities on default database

하이브에서 authorization 옵션을 enabled 시키고 테이블을 생성하려고 하면..


Authorization failed:No privilege 'Create' found for outputs { database:default}. Use show grant to get more details.


이런 에러 메시지만 나온다. 권한이 없다는 얘기 인데 사용자에게 기본 데이터베이스(default)의 모든 권한을 부여하는 쿼리는 다음과 같다.

set hive.security.authorization.enabled=true;
grant all on database default to user hive_user;

0.10.0 버전 기준.

Posted by 김민우 julingks

댓글을 달아 주세요

Hive Query Examples from test code (2 of 2)


하이브 쿼리 예제들 (0.10.0 기준) hive.ql.src.test.queries.clientpositive 에서 추려냄. 생소한 구문 위주로 정리함. 자세한 사항은 하이브 메뉴얼 참조 https://cwiki.apache.org/confluence/display/Hive/LanguageManual


Hive query for adding jar or script files

set jar=${system:build.ivy.lib.dir}/default/derby-${system:derby.version}.jar;

add file ${hiveconf:jar}; -- 추가
list file;  -- 리스트
delete file ${hiveconf:jar}; -- 삭제


Hive example for creating table using RegexSerDe

CREATE TABLE serde_regex(
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?",
  "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;

아파치 로그 파일

../data/files/apache.access.log

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

아파치 로그 파일2

../data/files/apache.access.2.log

127.0.0.1 - - [26/May/2009:00:00:00 +0000] "GET /someurl/?track=Blabla(Main) HTTP/1.1" 200 5864 - "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19"


Hive query which contains “transform” using specific script.

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
CREATE TABLE dest1(key INT, value STRING);

ADD FILE src/test/scripts/testgrep;

FROM (
  FROM src
  SELECT TRANSFORM(src.key, src.value)
         USING 'testgrep' AS (tkey, tvalue)
  CLUSTER BY tkey
) tmap
INSERT OVERWRITE TABLE dest1 SELECT tmap.tkey, tmap.tvalue;

SELECT dest1.* FROM dest1;

src/test/scripts/testgrep

#!/bin/bash
egrep '10.*'

exit 0;


Hive tablesamples example

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Sampling

-- TABLESAMPLES
CREATE TABLE bucketized_src (key INT, value STRING)
CLUSTERED BY (key) SORTED BY (key) INTO 1 BUCKETS;

INSERT OVERWRITE TABLE bucketized_src
SELECT key, value FROM src WHERE key=66;

SELECT key FROM bucketized_src TABLESAMPLE(BUCKET 1 out of 1);


Hive query for creating table using specific delimiters

create table impressions (imp string, msg string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile;


기본 파티션 이름 설정

create table default_partition_name (key int, value string) partitioned by (ds string);

set hive.exec.default.partition.name='some_other_default_partition_name';

alter table default_partition_name add partition(ds='__HIVE_DEFAULT_PARTITION__');

show partitions default_partition_name;


문자열 상수 처리

SELECT 'face''book', 'face' 'book', 'face'
                                'book',
   "face""book", "face" "book", "face"
                                "book",
   'face' 'bo' 'ok', 'face'"book",
   "face"'book', 'facebook' FROM src LIMIT 1;

결과

facebook    facebook    facebook    facebook    facebook    facebook    facebook    facebook    facebook    facebook


Hive table lock examples

CREATE TABLE tstsrc (col1 STRING) STORED AS TEXTFILE;

SHOW LOCKS;
SHOW LOCKS tstsrc;
SHOW LOCKS tstsrc extended;

LOCK TABLE tstsrc shared;
UNLOCK TABLE tstsrc;


Hive partition lock examples

LOCK TABLE tstsrcpart PARTITION(ds='2008-04-08', hr='11') EXCLUSIVE;

SHOW LOCKS tstsrcpart PARTITION(ds='2008-04-08', hr='11') extended;

UNLOCK TABLE tstsrcpart PARTITION(ds='2008-04-08', hr='11');  


Hive virtual column

0.8.0 부터 INPUT_FILENAME, BLOCKOFFSETINSIDE_FILE 두 개 가상 컬럼 지원함

  • INPUT_FILE_NAME는 맵퍼 테스크의 파일 이름
  • BLOCK_OFFSETINSIDE_FILE는 현재 글로벌 파일 포지션

블락이 압축된 파일인 경운 현재 블락의 파일 오프셋은 현재 블락의 첫번째 바이트의 파일 오프셋이다.

select INPUT__FILE__NAME, key, BLOCK__OFFSET__INSIDE__FILE from src;


로컬 디렉토리에 결과 쓰기

FROM src INSERT OVERWRITE DIRECTORY '../build/contrib/hive/ql/test/data/warehouse/dest4.out' SELECT src.value WHERE src.key >= 300

dfs -cat ../build/contrib/hive/ql/test/data/warehouse/dest4.out/*;


Hive example for comparison of timestamp values

select cast('2011-05-06 07:08:09' as timestamp) > 
  cast('2011-05-06 07:08:09' as timestamp) from src limit 1;


Hive type casting

SELECT IF(false, 1, cast(2 as smallint)) + 3 FROM src LIMIT 1;


Show table properties in Hive

show tblproperties tmpfoo;
show tblproperties tmpfoo("bar");


Display functions in Hive CLI

SHOW FUNCTIONS;

SHOW FUNCTIONS '^c.*';

SHOW FUNCTIONS '.*e$';

SHOW FUNCTIONS 'log.*';

SHOW FUNCTIONS '.*date.*';

SHOW FUNCTIONS '***';


Show colums in Hive

CREATE TABLE shcol_test(KEY STRING, VALUE STRING) PARTITIONED BY(ds STRING) STORED AS TEXTFILE;

SHOW COLUMNS from shcol_test;


Reset hive settings

set hive.skewjoin.key;
set hive.skewjoin.mapjoin.min.split;
set hive.skewjoin.key=300000;
set hive.skewjoin.mapjoin.min.split=256000000;
set hive.skewjoin.key;
set hive.skewjoin.mapjoin.min.split;

reset;

set hive.skewjoin.key;
set hive.skewjoin.mapjoin.min.split;


Print column header in Hive CLI

set hive.cli.print.header=true;


프로그래스 heartbeat 간격

set hive.heartbeat.interval=5; 


DDL 관련 출력 포맷을 json으로 변경

set hive.ddl.output.format=json;

desc extended table_name;

set hive.ddl.output.format=text; -- 기본값


Posted by 김민우 julingks

댓글을 달아 주세요

Hive Query Examples from test code (1 of 2)

하이브 쿼리 예제들 (0.10.0 기준)

hive.ql.src.test.queries.clientpositive 에서 추려냄.

생소한 구문 위주로 정리함.

자세한 사항은 하이브 메뉴얼 참조


Hive query for creating table

CREATE TABLE page_view (
 viewTime INT,
 userid BIGINT,
 page_url STRING,
 ip STRING COMMENT 'IP Address of the User',
 referrer_url STRING
) COMMENT 'This is the page view table'
 PARTITIONED BY (dt STRING, country STRING)
 CLUSTERED BY (userid) SORTED BY (viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
   LINES TERMINATED BY '\n'
 STORED AS SEQUENCEFILE;


Hive query for adding partitions

CREATE TABLE add_part_test (key STRING, value STRING) PARTITIONED BY (ds STRING);

ALTER TABLE add_part_test ADD PARTITION (ds='2010-01-01');

ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01');

ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01') PARTITION (ds='2010-01-02') PARTITION (ds='2010-01-03');

ALTER TABLE alter2 ADD PARTITION (insertdate='2008-01-01') LOCATION '2008/01/01';


Hive query for showing partitions

show partitions alter2;


Hive query for changing table properties

ALTER TABLE alter1 SET TBLPROPERTIES ('a'='1', 'c'='4', 'd'='3');


Hive query for changing SerDe properties

ALTER TABLE alter1 SET SERDEPROPERTIES('s1'='10', 's2' ='20');


Hive query for changing SerDe

ADD JAR ../data/files/TestSerDe.jar;
ALTER TABLE alter1 SET SERDE 'org.apache.hadoop.hive.serde2.TestSerDe' WITH SERDEPROPERTIES ('s1'='9');


Hive query for changing columns

ALTER TABLE alter1 REPLACE COLUMNS (a int, b int, c string);


Hive query for changing table name

ALTER TABLE alter3 RENAME TO alter3_renamed;


Hive queries for loading data

CREATE TABLE alter3_src (col1 STRING) STORED AS TEXTFILE ;
LOAD DATA LOCAL INPATH '../data/files/test.dat' OVERWRITE INTO TABLE alter3_src ;

-

load data local inpath '../data/files/kv1.txt' into table load_overwrite;

load data inpath '${system:test.tmp.dir}/load_overwrite/kv*.txt' overwrite into table load_overwrite2;

load data inpath '${system:test.tmp.dir}/load2_*' overwrite into table load_overwrite;  

LOAD DATA LOCAL INPATH '../data1/files/kv1.txt' INTO TABLE loadpart1 PARTITION(ds='2009-05-05'); -- 파티션 로드


Hive query for overwriting data

INSERT OVERWRITE TABLE alter3_like PARTITION (pCol1='test_part:', pcol2='test_part:') SELECT col1 FROM alter3_src;


Hive query for creating bucketed table

CREATE TABLE set_bucketing_test (key INT, value STRING) CLUSTERED BY (key) INTO 10 BUCKETS;


Hive query for changing bucketed table

ALTER TABLE set_bucketing_test NOT CLUSTERED;


Hive query for creating index

CREATE INDEX src_rc_concatenate_test_index ON TABLE src_rc_concatenate_test(key) AS 'compact' WITH DEFERRED REBUILD IDXPROPERTIES ("prop1"="val1", "prop2"="val2"); 


Hive query for showing index

SHOW     INDEXES ON src_rc_concatenate_test;


Hive query for removing index from specific table

DROP INDEX src_rc_concatenate_test_index ON src_rc_concatenate_test;


Hive query for calculating statistics

analyze table src_rc_merge_test_part_stat partition(ds='2011') compute statistics;
desc extended src_rc_merge_test_part_stat;


Hive query for changing # of buckets from specific table

create table tst1(key string, value string) partitioned by (ds string) clustered by (key) into 10 buckets;

alter table tst1 clustered by (key) into 8 buckets;


Hive query for changing fileformat

alter table alter_partition_format_test set fileformat rcfile;

alter table alter_partition_format_test partition(ds='2010') set fileformat rcfile;


Hive query for changing where the data is located.

alter table alter_partition_format_test set location "file:/test/test/";

alter table alter_partition_format_test partition(ds='2010') set location "file:/test/test/ds=2010";


Hive query for protect mode

alter table alter_part_protect_mode partition (year='1996') enable no_drop;

alter table alter_part_protect_mode partition (year='1995') disable no_drop;

alter table tbl1 enable no_drop cascade;

alter table tbl1 enable no_drop;

alter table tbl1 disable no_drop cascade;


Hive query for changing partition names

CREATE TABLE alter_rename_partition (col1 STRING) PARTITIONED BY (pcol1 STRING, pcol2 STRING) STORED AS SEQUENCEFILE;

ALTER TABLE alter_rename_partition PARTITION (pCol1='old_part1:', pcol2='old_part2:') RENAME TO PARTITION (pCol1='new_part1:', pcol2='new_part2:');


Hive query for authorization

create table authorization_part (key int, value string) partitioned by (ds string);  -- 테이블 생성

ALTER TABLE authorization_part SET TBLPROPERTIES ("PARTITION_LEVEL_PRIVILEGE"="TRUE");  -- 프로퍼티 설정
set hive.security.authorization.enabled=true;  -- 권한 사용

grant select on table src_auth_tmp to user hive_test_user;
grant Create on table authorization_part to user hive_test_user;
grant Update on table authorization_part to user hive_test_user;
grant Drop on table authorization_part to user hive_test_user;

show grant user hive_test_user on table authorization_part;


Hive query for creating a skewed table

set hive.mapred.supports.subdirectories=true;
set hive.internal.ddl.list.bucketing.enable=true;

create table original3 (key STRING, value STRING) SKEWED BY (key, value) ON ((1,1),(5,6)); 

alter table original3 not skewed;


Hive query for changing SerDe’s delimiter

alter table test_table set serde 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe';

alter table test_table set serdeproperties ('field.delim' = ',');


Hive query for changing view name

CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
CREATE VIEW view1 as SELECT * FROM invites;

ALTER VIEW view1 RENAME TO view2;


Hive queries about archive

아카이브에 관한 자세한 내용응 여기를 참고.

If you want to get more information about achive, click this.

set hive.archive.enabled = true;
set hive.enforce.bucketing = true;

create table tstsrcpart (key string, value string) partitioned by (ds string, hr string) clustered by (key) into 10 buckets;

ALTER TABLE tstsrcpart ARCHIVE PARTITION (ds='2008-04-08', hr='12');

ALTER TABLE tstsrcpart UNARCHIVE PARTITION (ds='2008-04-08', hr='12');

CREATE TABLE harbucket(key INT) PARTITIONED by (ds STRING) CLUSTERED BY (key) INTO 10 BUCKETS;
ALTER TABLE tstsrcpart ARCHIVE PARTITION (ds='2008-04-08', hr='12');
ALTER TABLE tstsrcpart UNARCHIVE PARTITION (ds='2008-04-08', hr='12');


Hive queries for authorization (grant, revoke)

권한 부여에 대한 자세한 내용은 여기를 참고.

set hive.security.authorization.enabled=true;

--table grant to user

grant select on table src_autho_test to user hive_test_user;

revoke select on table src_autho_test from user hive_test_user;

--column grant to user

grant select(key) on table src_autho_test to user hive_test_user;

revoke select(key) on table src_autho_test from user hive_test_user;

--table grant to group

grant select on table src_autho_test to group hive_test_group1;

revoke select on table src_autho_test from group hive_test_group1;

--column grant to group

grant select(key) on table src_autho_test to group hive_test_group1;

revoke select(key) on table src_autho_test from group hive_test_group1;


Hive query for creating roles

--role
create role src_role;
grant role src_role to user hive_test_user;
show role grant user hive_test_user;


Hive query for granting authority to specific role

--column grant to role

grant select(key) on table src_autho_test to role src_role;

revoke select(key) on table src_autho_test from role src_role;

--table grant to role

grant select on table src_autho_test to role src_role;

revoke select on table src_autho_test from role src_role;


Hive query for deleting role

drop role src_role;


Hive query for granting all authoritie to specific user

set hive.security.authorization.enabled=true;

grant All on table src_autho_test to user hive_test_user;


Hive examples for granting table authority to specific user or role

CREATE DATABASE IF NOT EXISTS test_db COMMENT 'Hive test database';
SHOW DATABASES;

GRANT drop ON DATABASE test_db TO USER hive_test_user;  -- 사용자에게 drop 권한 부여
GRANT select ON DATABASE test_db TO USER hive_test_user; -- 사용자에게 select 권한 부여

SHOW GRANT USER hive_test_user ON DATABASE test_db;  -- 사용자 권한 보기

CREATE ROLE db_test_role; -- 역할 생성
GRANT ROLE db_test_role TO USER hive_test_user; -- 사용자에게 역할 부여
SHOW ROLE GRANT USER hive_test_user; -- 역할 보기

GRANT drop ON DATABASE test_db TO ROLE db_test_role; -- 역할에 drop 권한 부여
GRANT select ON DATABASE test_db TO ROLE db_test_role; -- 역할에 select 권한 부여

SHOW GRANT ROLE db_test_role ON DATABASE test_db; -- 역할 권한 보기


Hive example for revoking its all authorities for specific user

GRANT ALL TO USER hive_test_user;
SET hive.security.authorization.enabled=true;

CREATE TABLE src_authorization_7 (key int, value string);

REVOKE ALL FROM USER hive_test_user;


Hive example for revoking its all authorities for specific group

GRANT ALL TO GROUP hive_test_group1;
SET hive.security.authorization.enabled=true;

CREATE TABLE src_authorization_7 (key int, value string);

REVOKE ALL FROM GROUP hive_test_group1;


Hive example for setting prehook class

set hive.exec.pre.hooks = org.apache.hadoop.hive.ql.hooks.PreExecutePrinter,org.apache.hadoop.hive.ql.hooks.EnforceReadOnlyTables,org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec;


Hive uniqujoin example

CREATE TABLE T1(key STRING, val STRING) STORED AS TEXTFILE;
CREATE TABLE T2(key STRING, val STRING) STORED AS TEXTFILE;
CREATE TABLE T3(key STRING, val STRING) STORED AS TEXTFILE;

LOAD DATA LOCAL INPATH '../data/files/T1.txt' INTO TABLE T1;
LOAD DATA LOCAL INPATH '../data/files/T2.txt' INTO TABLE T2;
LOAD DATA LOCAL INPATH '../data/files/T3.txt' INTO TABLE T3;

FROM UNIQUEJOIN PRESERVE T1 a (a.key), PRESERVE T2 b (b.key), PRESERVE T3 c (c.key)
SELECT a.key, b.key, c.key;

FROM UNIQUEJOIN T1 a (a.key), T2 b (b.key), T3 c (c.key)
SELECT a.key, b.key, c.key;


Source command in Hive CLI

항이브 퀴리 스크립트 파일을 실행한다.

../data/files/source.txt 에 있는 내용

EXPLAIN
SELECT x.* FROM SRC x;

SELECT x.* FROM SRC x;

실제 source 커맨드

source ../data/files/source.txt;


Hive examples for variable substitution

set hivevar:key1=value1;

EXPLAIN SELECT * FROM src where key="${key1}";
EXPLAIN SELECT * FROM src where key="${hivevar:key1}";

set hivevar:a=1;
set hivevar:b=a;
set hivevar:c=${hivevar:${hivevar:b}};            -- 서브 변수 치환
EXPLAIN SELECT * FROM src where key="${hivevar:c}";

set hivevar:a;
set hivevar:b;
set hivevar:c;
set hivevar:key1;


Posted by 김민우 julingks

댓글을 달아 주세요

The default values when creating a simple table in Hive

하이브에서 기본 테이블 생성시 설정되는 기본 테이블 프로퍼티와 기본 구분자들 정리 (0.10.0 버전 기준)


Hive default table properties


Name Value
inputFormat org.apache.hadoop.mapred.TextInputFormat
outputFormat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
compressed false
numBuckets -1
tableType MANAGED_TABLE
serializationLib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe


Hive default delimiters (separators)


Name Character Java

Remarks

field.delim ‘\001’ (byte)1 LazySimpleSerDe
line.delim ‘\n’ “\n” HiveIgnoreKeyTextOutputFormat
serialization.format ‘\002’ (byte) 1 LazySimpleSerDe
colelction.delim ‘\002’ (byte) 2 LazySimpleSerDe
mapkey.delim ‘\003’ (byte) 3 LazySimpleSerDe
serialization.null.format “\N” “\N” LazySimpleSerDe
escape.delim ‘\’ “\” LazySimpleSerDe

vim에서 \001 문자(hex byte 문자)를 입력하려면 삽입 상태에서 crt+v를 누르고 001 누르면 된다. 화면에서는 ^A라고 표시된다.



Posted by 김민우 julingks

댓글을 달아 주세요

Hcatalog는 하둡 도구들 hive, pig, mapreduce 등의 메타데이터를 관리하는 레이어이다.
소스 분석하기위해서 설치할때 문서를 디테일하게 살펴보려는 스타일이라 설치 섹션을 발번역했다.

Overview

Introduction

HCatalog는 하둡을 위한 테이블과 메터데이터 관리 레이어다. Pig, MapReduce, Hive와 같이 서로 다른 데이터 처리 도구들를 하둡에서 사용할 수 있도록 도와준다. HCatalog는 테이블 추상화를 통해서 사용자에게 HDFS에 있는 데이터의 관계형 뷰 제공한다. 사용자는 더이상 데이터가 어디에 저장되어 있는지, 또 어떤 포맷(RCFile format, text file, sequence file)으로 저장되어 있는지 신경쓰지 않아도 된다. HCatalog는 SerDe로 작성되는 어떤 포맷이든 파일 입출력을 지원한다. 기본적으로 RCFile, CSV, JSON, 시퀀스 파일 포맷을 지원한다. 커스텀 포맷을 사용하기 위해서는 InputFormat, OutputFormat 과 SerDe를 제공한다.

HCatalog Architecture

HCatalog는 하이브의 메타스토어와 Hive DDL의 통합 컴포넌트 기반으로 작성되어 있다. HCatalog는 Pig와 MapReduce를 위한 읽기, 쓰기 인터페이스를 제공하고 하이브 커맨드라인 인터페이스를 사용해서 데이터를 정의하고 메터데이터 탐색한다.

Interfaces

Pig를 위한 HCatalog 인터페이스 HCatLoader 와 HCatStorer 는 Pig의 Load 와 Store interfaces의 구현체다. Pig는 기본적으로 load와 store에 대한 사용자 정의 함수(UDF) 인터페이스를 제공한다. http://pig.apache.org/docs/r0.10.0/udf.html HCatLoader는 데이터를 읽어드릴 테이블을 받아들인다. 사용자는 파티션 필터가 포함된 load 문장으로 어떤 파티션을 스캔해야할지 바로 알 수 있다. HCatStorer는 데이터를 써야할 테이블과 새로운 파티션을 만들기 위한 파티션키들의 스팩을 선택적으로 받아들인다. 사용자는 지정한 파티션 키와 값에 따라서 싱글 파티션에 쓸 수 있다. 이때 STORE 절을 이용한다. 만약 파티션 키들이 저장된 데이터의 컬럼이라면 다중 파티션을 쓸 수 있다 HCatLoader와 HCatStorer는 HCatInputFormat과 HCatOutputFormat 위에 각각 구현되어 있다.

Data Model

HCatalog는 데이터의 관계형 뷰를 제공한다. 데이터는 테이블안에 저장되고 이들 테이블은 데이터베이스에 배치 될 수 있다. 테이블은 또한 하나 이상의 Hash 파티션 될 수 있다. 즉 하나의 키의 값이 주어진다면 모든 row를 포함하는 하나의 파티션이 될 수 있다. 예를 들면, 만약 테이블이 날짜에 대해서 파티션되어 있고 테이블안의 3개의 날짜들의 데이터가 있다면, 테이블에는 3개의 파티션이 있게 된다. 새로운 파티션은 테이블에 추가될 수 있다. 그리고 파티션들은 테이블에서 drop될 수 있다. 파티션된 테이블들은 생성 시점는 파티션이 없다. 파티션 되지 않은 테이블들은 효과적으로 하나의 기본 파티션을 가진다. 이파티션은 테이블 생성 시점에 만들어져야 한다. 파티션이 drop될 때에는 읽기 정합성(read consistency)에 보장은 없다. 파티션은 레코드를 포함한다. 파티션이 한번 생성되면, 레코드은 추가되거나, 지워지거, 업데이터 될 수 없다. 파티션들은 다차원적이고 hierarchical하지 않다. 레코드들은 컬럼으로 나누어 진다. 컬럼들은 이름과 데이터 타입을 가진다. HCatalog는 Hive와 같은 데이터 타입을 지원한다.

Example

다음 간단한 데이터 흐름 예제는 HCatalog가 어떻게 그리드 사용자가 데이터를 공유하고 접근하는 것을 도와주는지 보여줍니다. 첫번째, 데이터 입수 팀에 있는 Joe는 데이터를 그리드로 가져오기 위해서 distcp를 사용합니다.

hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data

hcat "alter table rawevents add partition (ds='20100819') location 'hdfs://data/rawevents/20100819/data'"

두번째, 데이터 처리 팀에 있는 sally는 데이터를 cleaning하고 준비하기 위해서 Pig를 사용합니다. HCatalog가 없다면, Sally는 데이터가 사용가능할 때 수동으로 Joe가 알려줘야 합니다. 또는 HDFS위에 조사를 해야 합니다.

A = load '/data/rawevents/20100819/data' as (alpha:int, beta:chararray, …);
B = filter A by bot_finder(zeta) = 0;
…
store Z into 'data/processedevents/20100819/data';

HCatalog를 사용한다면, HCatalog는 데이터가 사용 가능해졌다는 JMS 메시지를 보낼 것입니다. Pig 잡은 그리고 나서 시작될 수 있을 것입니다.

A = load 'rawevents' using HCatLoader();
B = filter A by date = '20100819' and by bot_finder(zeta) = 0;
…
store Z into 'processedevents' using HCatStorer("date=20100819");

세번째, 고객 관리 팀의 Robert는 고객들의 결과를 분석하기 위해서 Hive를 사용하빈다. HCatalog가 없다면, Robert는 필요한 파티션을 추가하기 위해서 테이블을 변경해야 합니다.

alter table processedevents add partition 20100819 hdfs://data/processedevents/20100819/data

select advertiser_id, count(clicks)
from processedevents
where date = '20100819'
group by advertiser_id;

HCatalog를 사용한다면,Robert는 테이블 구조를 수정할 필요가 없습니다.

select advertiser_id, count(clicks)
from processedevents
where date = ‘20100819’
group by advertiser_id;

Install

Server Installation from Source

Prerequisites

  • 설치 tar가 빌드할 머신
  • 서버가 설치될 수 있는 머신 - Hadoop 클러스터에 접근 할 수 있어야 하고 당신이 잡들을 실행한 머신으로 부터 접근 할 수 있어야 한다.
  • RDBMS - MySQL을 추천한다.
  • 하둡 클러스터
  • 서버를 실행할 유닉스 사용자 , 그리고 실행 중인 클러스터가 안전 모드라면, Kerberos Service Principal과 keytab과 관련된 사용자.

Building a tarball

만약 Apache 또는 다른 소스 릴리즈 사이트에서 HCatalog를 다운로드 했다면, 당신은 우선 설치를 위해서 tarball을 빌드해야 한다. 당신이 당신이 다운로드 파일의 이름을 보면 소스 빌리즈 버전인지를 확인할 수 있다. 만약 Hcatalog-src-0.4.0-incubating.tar.gz(이름에 src가 들어 있으면)라는 이름이면 소스 릴리즈 버전이다. 만약 Apache Ant가 당신의 머신에 설치되어 있지 않다면, 우선 이것을 얻는 것이 필요하다. Apache Ant Website에서 부터 얻을 수 있다. 다룬로드 했다면, 압축을 푼다. 압축을 푼 디렉토리를 ANT_HOME 환경변수를 설정한다. 만약 당신의 머신에 Apache Forrest가 설치되지 않았으면, 우선 이것을 얻는 것이 필요하다. Apache Forrest website에서 얻을 수 있다. 다운로드를 했다면, 이것을 머신에서 압축을 푼다. 압축을 푼 디렉토리를 FORREST_HOME 환경변수를 설정한다. tarball을 생성하기 위해서 다음을 실시한다. 소스 릴리즈를 확장하기 위한 디렉토리를 만듭니다. 소스 릴리즈를 이 디렉토리로 복사하고 압축을 풉니다.

mkdir /tmp/hcat_source_release

cp hcatalog-src-0.4.0-incubating.tar.gz /tmp/hcat_source_release

cd /tmp/hcat_source_release

tar xzf hcatalog-src-0.4.0-incubating.tar.gz

압축이 풀어진 소스 릴리즈로 디렉토리를 이동하고 설치 tarball을 빌드합니다.

cd hcatalog-src-0.4.0-incubating

ant_home/bin/ant -Dhcatalog.version=0.4.0 -Dforrest.home=forrest_home tar

설치를 위한 tarball은 이제 build/hcatalog-0.4.0.tar.gz에 위치합니다.

Database Setup

만약 당신이 MySQL과 Hive가 설지되어 있지 않다면, 다음은 당신이 어떻게 할지를 알려 줄것입니다. 이미 설치되어 있다면 이 스텝을 스킵할 수 있습니다. 머신에 설치할 데이터베이스를 선택합니다. 이것은 이후에 설치할 Thrift 서버와 마찬가지로 같은 머신에 있을 필요는 없습니다. 대형 클러스터들을 위해서는 우리는 같은 머신에 있지 않기를 추천합니다. 이 지침서의 목적에 따라서 데이터베이스가 설치된 머신을 _hivedb.acme.com_으로 참조하겠습니다. _hivedb.acme.com_에 MySQL서버를 설치합니다. MySQL's download site에서 Mysql 패키지를 얻을 수 있습니다. 우리는 5.1.46과 5.1.48버전으로 개발과 테스트를 해왔습니다. 우리는 이 버전과 이후 버전을 사용하기를 추천합니다. MySQL를 띄우고 실행 시키고 나면, mysql 커맨드 라인 도구를 이용해서 _hive_ 사용자와 _hivemetastoredb_ 데이터베이스를 추가합니다.

mysql -u root

mysql> CREATE USER 'hive'@'hivedb.acme.com' IDENTIFIED BY 'dbpassword';

mysql> CREATE DATABASE hivemetastoredb DEFAULT CHARACTER SET latin1 DEFAULT COLLATE latin1_swedish_ci;

mysql> GRANT ALL PRIVILEGES ON hivemetastoredb.* TO 'hive'@'hivedb.acme.com' WITH GRANT OPTION;

mysql> flush privileges;

mysql> quit;

Hive 패키지에서 찾은 데이터 베이스 설치 스크립트를 이용하여 데이터 베이스를 생성합니다. hive_home은 hive가 설치 된 디렉토리를 참조합니다. 만약 Hive rpms을 사용했다면 hive_home은 /usr/lib/hive가 될 것입니다.

mysql -u hive -D hivemetastoredb -hhivedb.acme.com -p < hive_home/scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql

Thrift Server Setup

만약 Thrift를 사용해서 메타스토어 서버를 실행시키는 Hive가 준비되어 있지 않다면, 실생 시키고 설치하기 위한 다음 지침서를 사용하십시오. 만약 Hive 메타스토어 서버를 사용할 수 잇는 준비가 되어 있다면 이 스텝을 넘어가도 됩니다. Thrift 서버를 실행할 머신을 선택합니다. 데이터베이스로서 같은 머신에 있어야 합니다. 이 지침서의 목표를 위해서 우리는 이 머신을 _hcatsvr.acme.com_을 참조할 것입니다. 만약 당신이 이것을 끝냈다면, 이 머신에 Hive 0.9를 설치합니다. Apache Bigtop에서 사용가능한 rpm 또는 Hive가 제공하는 binary distributions 을 사요할 수 있습니다. 당신이 Apache Hive binary distribution을 사용한다면, 디렉토리를 선택합니다. 앞으로 hive_home으로 참조 합니다. 이 distribution을 여기에 압축을 풉니다. 만약 rpm을 사용한다면 hive_home은 /usr/lib/hive가 될 것 입니다. Thrift 서버를 실행할 사용자를 선택합니다. 이 사용자는 실제 사람이 사용하는 사용자가 되서는 안됩니다. 다른 사용자들과의 프록시로 행동 할 수 있어야 합니다. 우리는 _hive_라는 이름의 사용자를 추천합니다. 이 문서의 남은 부분에서는, 우리는 _hive_를 이 사용자로서 참조할 것입니다. 만약 필요하다면 hcatsvr.acme.com에 사용자를 추가합니다. HCatalog의 설치를 위한 _root_ 디렉토리를 선택합니다. 이 디렉토리는 _hive_ 사용자에 의해서 소유(owned)되어야 합니다. 우리는 /usr/local/hive를 추천합니다. 필요하다면, 디렉토리를 생성합니다. 당신이 이 Thrift 서버 설치 섹션의 나머지에서 설명할 작업들을 위한 _hive_ 사용자가 있어야할 필요할 것이다. 임시 디렉토리로 Hcatalog 설치 tarball을 복사하고 압축을 풉니다. 그리고 나서 새로운 distribution과 Hcatalog 서버 설치 스크립트를 실행할 디렉토리로 이동합니다. 당신은 root로 선택한 디렉토리와 MySQL 자바 커넥터 라이브러리가 설치된 디렉토리를 알아야할 필요가 있습니다. 당신은 HADOOP_HOME과 하둡이 설치된 디렉토리, portnum으로 정해진 HCatalog가 운용하기 위한 포트 넘버가 필요하다.

tar zxf hcatalog-0.4.0.tar.gz

cd hcatalog-0.4.0

share/hcatalog/scripts/hcat_server_install.sh -r root -d dbroot -h hadoop_home -p portnum

이제 hive_home/conf/hive-site.xml 파일을 수정할 필요가 있다. 이 파일을 열어라. 다음 테이블은 당신이 필요한 설정들의 값을 보여준다.

ParameterValue to Set it to 
hive.metastore.local false  
javax.jdo.option.ConnectionURL jdbc:mysql://hostname/hivemetastoredb?createDatabaseIfNotExist=true MySQL을 설치한 머신의 hostname
javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver  
javax.jdo.option.ConnectionUserName hive  
javax.jdo.option.ConnectionPassword   위에 MySQL 서버의 세팅할 때 사용한 _dbpassword_
hive.semantic.analyzer.factory.impl org.apache.hcatalog.cli.HCatSemanticAnalyzerFactory  
hadoop.clientside.fs.operations true  
hive.metastore.warehouse.dir   디렉토리는 URI 또는 절대 파일 경로가 될 수 있다. 만약 절대 파일 경로라면 메타스토어에 의해 URI로 해결될 것이다;
-- 만약 기본 HDFS가 core-site.xml에 지정되어 있다면, 경로는 HDFS 위치로 해결될 것이다.
-- 그렇지 않다면, 경로는 로컬 파일 URI로 해결된다.
이 세팅은 새로운 테이블을 생성할 때 효과적이 된다. (테이블 생성시점에 기본설정인 DBS.DB_LOCATION_URI를 선행한다.)
만약 당신의 시스템위에서 실행하기 위한 설정된 하이브가 없다면 당신은 오직 이것을 설정하는 것만 필요하다. 
hive.metastore.uris thrift://hostname:portnum Thrift 서버를 호스팅하는 머신의 hostname이다. 그리고 portnum은 위에 설치 스크립에서 사용된 포트 넘버이다.
hive.metastore.execute.setugi true
hive.metastore.sasl.enabled   당신의 하둡 클러스터가 kerberos 보안을 사용한다면 true로 설정하고 그러지 않다면 false로 설정한다.
hive.metastore.kerberos.keytab.file   kerberos keytab 파일의 경로이다. 이것은 메타스토어 thrift 서버의 서비스 principal을 포함한다. 위에 hive.metastore.sasl.enabled를 true로 설정했을 때만 필요하다.
hive.metastore.kerberos.principal   메타스토어 Thrift 서버를 위한 서비스 principal 이다. 당신은 _HOST로 참조되는 당신의 호스트는 실제 hostname으로 교체될 것이다. 위에 hive.metastore.sasl.enabled를 true로 설정했을 때만 필요하다.

이제 당신은 서버 시작하기로 넘어갈 수 있습니다.

Starting the Server

서버를 시작하기 위해서, HCatalog는 Hive가 설치된 곳을 알아야한다. HIVE_HOME 환경 변수를 정하는 것으로 커뮤니케이션한다. sbin/hcat_server.sh stop을 실행한다.

Logging

서버 활동 로그는 root/var/log/hcat_server에 위치한다. 로깅 설정은 root/conf/log4j.properties에 위치한다. 서버 로깅은 DailyRollingFileAppender를 기본으로 사용한다. 이것은 자동으로 오래된 로그 파일을 만기 시키지 않고 매일 하나의 파일을 생성할 것이다.

Stopping the Server

Hcatalog 서버를 엄추기 위해서는, _root_ 디렉토리로 이동한다, sbin/hcat_server.sh stop을 실행한다.

Client Installation

HCatalog client의 설치를 위한 _root_ 디렉토리를 선정한다. /usr/local/hcat을 추천한다. 필요하다면 디렉토리를 생성한다. Hcatalog 설치 tarball을 임시 디렉토리로 복사하고 압축을 푼다. tar zxf hcatalog-0.4.0.tar.gz 이제 당신은 _hive\_home_/conf/hive-site.xml 파일을 수정하는 것이 필요하다. 당신은 javax.jdo.option.ConnectionPassword 값이 제외된 서버에 있는 같은 파일을 사용할 수 있다. 이것은 client가 텍스트로 패스워드를 사용가능하게 하는 것을 피하게 한다. HCatalog 커맨드 라인 인터페이스는 이제 root/bin/hcat으로 실행될 수 있다.

 

References

Posted by 김민우 julingks

댓글을 달아 주세요

2011년 6월 그리스 아테나에서 열린 SIGMOD 학회에 페이스북에서 HBase를 실제 서비스에 적용한 후 그에 관한 논문을 냈다. http://borthakur.com/ftp/RealtimeHadoopSigmod2011.pdf

올해 6월에 처음으로 열린 SDEC 2011 (Seoul Data Engineering Camp)에서 페이스북의 Jonathan Gray가 이와 관련된 발표를 했었다. http://www.sdec.kr/schedule#hbase

ACM에는 구체적인 연구 분야마다 특화분야그룹 (Special Interest Groups, SIGs)가 있는데 현재 30여개로 각 분야별로 SIGCOMM, SIGGRAPH, SIGMOD, SIGOPS. SIGCHI  등이 있다. SIG그룹은 CS 각 분야별로 최고 수준의 학회들이라고 볼 수 있다.  CS 박사과정 중에 있는 학생이라면 SIG 그룹에 논문을 내는 것이 꿈(?)이라고 할 수 있겠다. (졸업과 취직에 지름길? ㅎㅎ )
SIGMOD(Special Interest Group on Management of Data)는 데이터베이스 관련 역사와 전통이 있는 최고 수준의 학회 중 하나다. 그 밖에 데이타베이스 관련 최고 수준 학회로는 VLDB,  IEEE의 ICDE가 있다.

7월 회사에서 이 논문을 읽고 발표를 했었는데, Hadoop과 Hbase에 대한 깊은 기술적 이해가 필요해서 애를 먹었던 기억이 난다. 발표자료는 거의 논문 직역 수준으로 되어서 이제까지 회사에서 발표한 자료 중에는 최악이었던 것으로 기억된다. :-(  그래도 몇일 고생하면서 Hbase에 대한 기술적인 이해가 높아졌다는 것으로 만족한다. 당시 그루터에 김형준 수석님의 도움을 많이 받았다. 시간이 나면 내용을 좀 다듬으려고 했으나, 역시나 시간이 없다;

요약하면,

페이스북에서 기존 RDB 클러스터로 운영하던 시스템 Hadoop/HBase 기반으로 마이그레이션을 했고 적용한 워크로드는 다음 세가지이다.

  • Facebook Messages
  • Facebook Insights
  • Facebook Metric System (ODS)

위의 3가지 워크로드는 다음과 같은 공통점이 있다.

  • 대량의 쓰기 부하 (High Write Throughput)
  • 명시적으로 수행하지 않는 한 지워지지 않는다.
  • 최근에 쓰여진 것만 몇 번 읽고 아주 가끔 다시 본다.
  • 대부분 데이터는 읽혀지지 않지만 최소 지연시간으로 언제든지 사용 가능 해야 된다

위의 3가지 워크로드로 부터 시스템의 요구사항은 다음과 같다

  • 탄력성 (Elasticity)
  • 높은 쓰기 처리량 (High Write Throughput)
  • 한 데이터 센터 안에서 효율적인 Low-latency 강한 일관성 시멘틱
  • 효율적인 랜덤 디스크 읽기
  • 고가용성과 재난 극복 (High Availability and Disaster Recovery)
  • 내고장성 (Fault Isolation)
  • 원자적 읽기-수정-쓰기원시적인 지원
  • 범위 스캔 (Range Scan)

페이스북에서는 오프라인 배치 분석작업을 Hadoop과 Hive를 통해서 이미 수행하고 있기 때문에 Hadoop기반 오픈소스를 사용하는 것에 대한 거부감이 없으며 하둡에 대한 신뢰도 높은 편이다.  물론 프로덕션 환경에서 사용하기에 Hadoop과 HBase는 부족한 부분이 있지만 In-house 엔지니어링을 통해서 충분히 해결할 수 있는 자신감 또한 Hadoop/HBase를 선택하는 데 반영되었다.

이후 내용은 Hadoop과 HBase을 프로덕션 수준으로 높이기 위해서 그동안 페이스북에서 오픈소스에 기여한 내용에 대한 내용들이다.  Hadoop과 HBase에 대한 기술적인 이해가 필요해서 애를 먹었던 부분이다. 마지막 챕터는 개발 및 운영 경험에 대한 내용도 나온다.  자세한 내용은 논문과 발표자료를 참고하길 바란다.

---

HBase는 아직 엔터프라이즈에서 사용하기에 부족한 부분이 많다는 것이 세간의 평가지만, 페이스북에서 그 부분을 향상시키고 성공적으로 도입하므로서 다시 관심의 중심이 되었다.페이스북은 서비스 론칭 후 6억명의 사용자가 사용해야한다. 페이스북에서 검증 되었다는 것은 큰 의미가 있다고 볼 수 있겠다.
혹시나 필요한 사람을 위해서 발표자료를 공개한다.

 

 

Posted by 김민우 julingks

댓글을 달아 주세요

야후에서 분사한 하둡 빅데이터 스타트 업

This document is translated from http://www.informationweek.com/news/development/database/231000658

InformationWeek의 2011년 6월 28일자 기사

---

빅데이터 분석을 위한 오픈소스 코드 개발의 속도를 높이기 위해서 Hortonworks 스타트업은 야후에서 개발자와 투자 자본을 가져왔다. 야후의 핵심 개발자 그룹은 하둡의 더 빠른 엔터프라이즈 스타일의 개발을 위해서 벤처캐피탈로 부터 지원을 받고 야후에서 분사했다. 몇 일 안에 하둡 코드에 "20개 이상 커밋한" 핵심 커미터들과 아키텍트는 캘리포니아 Sunnyvale에 있는 야후 캠퍼스에서 독립회사인 Hortonworks 사무실로 옮길 것이라고 하둡 소프트웨어 엔지니어의 야후 VP인 Eric Baldeschwieler가 인터뷰에서 밝혔다.그는 새로운 회사의 CEO가 될 것이다.

리딩 조직들은 그들의 가장 큰 이익을 낼 수 있는 고객들과 잠재적 라이벌들을 식별하기 위해서 비지니스 애널리틱스를 받아들이고 있다.

Hortonworks의 이름은 Dr.Sesuss의 동화책에 나오는 Horton이라는 코끼리에서 따왔다. 하둡은 원래 Dave Cutting의 아이들의 코끼리 장난감의 이름이다.

하둡 상용화를 주력으로 하는 자급자족(self-sufficient) 회사를 만들기 위한 이동은 지난주 LexNexis의 High Performance Computing Cluser(HPCC) 빅데이터 시스템이 공개적으로 오픈소스로서 사용가능하게 될 것임이 공표한 후에 뒤따랐다. HPCC는 빅데이터를 다루는 무대에서 하둡의 미래 경쟁자라고 대변인은 말했다.

야후의 클라우드 플랫폼의 Senior VP인 Jay Rossiter는 Hortonworks는 야후의 축복을 받을 뿐아니라 벤치마크 캐피탈과 마찬가지로 야후가 투자자가 될 것이다.

야후를 떠나는 개발자의 수는 전체 하둡 개발자 수의 일부이다. 두 개의 그룹은 다음 하둡 릴리즈를 함께 협력 개발(co-develop)할 것이라고 인터뷰에서 Rossiter가 말했다

벤치마크에서 파트너인, Rob Bearden은 Hortonworks의  COO가 될 것이다. 그는 자바 개발자를 위한 스프링 프래임웍을 지원하는 회사인 SpringSource의 전 회장이다 SpringSource는 2009년에 VMWare에 $420 밀리언(약 495억)에 인수되었다. 그는 또한 RedHat에 팔린 오픈소스 자바 애플리케이션 서버, JBoos의 전 COO이다. 그는 현재 오픈소스 Business Intelligence 시스템 공급자인 Pentaho의 의장(chairman)이다.

"Hortonworks는 하둡의 핵심 개발을 계속할 것이다. 또 쉬운 설치와 쉬운 사용 기능을 설계할 것이다."라고 인터뷰에서 Bearden은 말했다. 모든 개발자는 아파치 소프트웨어 파운데이션의 하둡 오픈소스 프로젝트에 기여하게 된다.
하둡은  Cutting이 야후에 엔지니어였을 때, 그의 파트너, Mike Cafarella에 의해 2005년에 만들어졌다. 야후는 세계에서 가장 큰 사용자중 한명이다. 야후 개발자들은 하둡 코드의 약 70%를 기여해왔다고 믿고 있다.

Cutting은 2009년에 초기 하둡 스타트업 Cloudera를 위해서 야후를 떠났다. Cloudera는 하둡 패키저와 ease-of-implementation 벤더로서 설립되었다. Hortonworks와 Cloudera는 잠재적인 경쟁자이다. 5월에는  $9.25 밀리언(약 109억) 벤처 펀딩을 받은 또 다른  하둡 스타트업 Datameer가 나타났다. 이 숫자는 Hortonworks 뒤에서 펀딩하기 위한 것임이 드러났다.

앞선 2월에는, 야후는 자신들의 하둡 프로덕션 버전을 테스트를 했다. 테스팅과 패칭의 지식은 대부분 알려졌다. 그들의 프로덕션 버전은 야후에서 사용 가능하도록 했기 때문에 빈번히 다른 회사들에 도입되었다. 이제 아파치로 부터 발산되는 빌드와 업데이트의 가장 믿을 만한 버전들이 사용된다.

Baldeschwieler는 야후가 하둡의 향상과 변경에 대한 중요한 시험장으로 남을 것이라고 말했다. 야후는 18개의 하둡 시스템을 운영 중이다. 총 42,000대의 서버들 위에서 다음 기능등을 수행한다.

  • 웹 컨텐트 인덱싱
  • 야후 싸이트 방문자들에 대한 개인화된 컨텐트 딜리버리
  • 야후의 이메일 서비스 스팸 스크리닝
  • 하둡 검색  사용자에게 광고 제공

Rossiter는 하둡 애플리케이션을 통해 개인의 흥미와 일치되는 내용을 띄우므로서 270%까지 홈페이지 클릭율(Click-through rate)를 높일 수 있었다고 말했다.

Baldeschwieler는 벤치마크 캐피탈이 하둡에 대해서 투자 하고 싶어했고 야후가 리딩 개발자들 팀을 분리하도록 유도했다고 말했다. 야후는 하둡을 떠받치는 활발한 커뮤니티를 보기 원했고, 엔터프라이즈에 넓게 도입되는 것을 원했기 때문에 분사에 동의했다. 엔터프라이즈 소프트웨어를 만드는 노력을 할 회사는 이 목표를 진행시킬 것이다.

야후가 42,000대의 서버들 위에서 하둡을 실행할 지라도, 하나의 시스템을 실행하는 가장 많은 서버는 4,000대이다.하둡은 병렬 파일 분산 시스템이다. 파일이 어느 클러스터에 위치해 있는지 맵핑하고, 정렬과 분석작업을 데이터와 가까운 노드로 보낸다.

Baldeschwieler는 말했다. 수백만개의 작은 이미지 타일을 사용해서 미국의 지도를 만드는 복잡한 문제는 기존 야후 그래픽 처리 시스템으로는 6달이 걸렸다. 하둡을 처리에 추가했을 때 5일이 걸렸다. Hortonworks는 하둡 성능을 향상시키는데 초점을 맞출것이다. 설치하기 쉽게 만들고, 서드 파티들이 모니터링과 관리 시스템을 붙이기 위해서 사용하는 API를 제공할 것이다. 
야후는 또한 하둡 개발 그림안에 남을 것이다. 많은 수의 개발자들이 프로젝트에 커밋하는 것을 유지할 것이다.

"야후는 하둡의 선구자적인 리더쉽을 제공하는 것을 지속할 것이다. 우리는 비길 데 없는 도메인 전문가들이 있다" 라고 Rossiter는 발혔다. 야후는 하둡 변경 사항이 최대로 반영되는 테스팅과 대규모 프로덕션 환경을 제공할 것이다. 하둡은 회사 안에서 1,000명 이상의 사용자를 가지고 있다고 그는 말했다.

"우리는 5년 안에 세상의 데이터의 절반 이상은 아파치 하둡에 저장 될 것임을 고대한다"라고 Baldeshwieler는 Hortonworks 발표에서 말했다.

 

Posted by 김민우 julingks

댓글을 달아 주세요

This page is translated from http://www.informationweek.com/news/software/info_management/229500154?pgno=2

2011년 5월 12일자 기사

하둡 핼퍼 회사들은 빠른 빅 데이터 분석을 약속한다.

아파치 하둡은 가장 빠르게 성장하고 있는 오픈소스 프로젝트 중 하나이다. 따라서 상용 벤더들이 한 몫챙길 것을 찾는 것도 놀랄일이 아니다. 유명한 Data-integration 벤더들 (Informatica, Pervasive Software, SnapLogic, Syncsort)의 잇다른 최근의 발표들을 보고 있자면,  모두들 매우 어린 빅 데이터 처리 플랫폼과의 작업을 더 빠르고 더 쉽게 만드는 것을 목표로 한다.

하둡은 큰 볼륨의 비정형 데이터를 분석하기 위한 분산 데이터 처리 컴포넌트의 집합이다. 
페이스북의 댓글이나 트위터의 트윗이나, 이메일, 인스턴트 메시지들, 보안 로그, 애플리케이션 로그가 그 대상이다
IBM DB2, Oracle, Microsoft SQL Server, MySQL 같은 관계형 데이터베이스는 이런 데이터를 다룰수가 없다.  컬럼과 로우에 깔끔하게 맞지 않기 때문이다
이런 상용 데이터베이스들이 큰 볼륨의 비정형 데이터를 처리 할 수 있다고 해도,  라이센스 비용은 데이터의 스케일로 인한 문제 때문에 엄두도 못낼 정도로 비싸다 . 우리는 보통 수백 테라바이트에 대해 말하던 것이 페타바이트로 가고 있다.

오픈소스 프로젝트인 하둡 소프트웨어 버전은 공짜로 다운받을 수 있다. 하둡은  저비용 커머디티 서버 위에서 스케일 아웃 할 수 있도록 설계되었다.  AOL, eHarmony, eBay, Facebook, JP Morgan Chase, LikedIN, Netflix, The New York Times, Twitter  같은 회사들은 하둡에 매력을 느껴왔다.

하둡은 상용 벤더들을 끌어 당기는 자석이 되고 있다.
Cloudera는 가장 인기있는 하둡 배포 버전을 제공한다. 그리고 엔터프라이즈 서포트와 서비스를 제공하는 선도 주자다. Datameer는 Data-integration, Storage, Analytics와 visualization software 지원을 제공한다. Karmasphere는 하둡 잡들의 모니터링과 디버깅, 개발을 위한 그래픽한 환경울 추가했다.

EMC는 자신만의 하둡 소프트웨어 버전 제공할 것이라고 발표했다.  또한 EMC는 싱글 하드웨어 플래폼 위에서  EMC  Greenplum 관계 데이터베이스와 하둡을 실행시킬 수 있는 어플라이언스를 발표했다.

Informatica과 SnapLogic

Data-integration 벤더인 informatica와 SnapLogic 모두 EMC와의 파트너쉽을 발표했다. Informatica는 EMC 하둡 배포판과  Data-Integration-platform이 통합될 것이라고 말했다. 이것은 3분기 릴리즈가 정해졌다. 이전에도 Informatica는 비슷한 방식의 통합으로 Cloudera와 파트너 관계 였다.

Informatica는 4,200 이상의 고객 회사를 가지는 가장 큰 독립적인 data-integration 벤더이다.
그래서 EMC와 Cloudera는 Informatica가 빅데이터를 씹어먹는 하둡 사용자들을 원하는 만큼  Informatica가 필요하다.

SnapLogic은 데이터를 MapReduce로 연결할 SnapLogic 플랫폼의 모듈인 SnapReduce를 발표했다. 이것은 Core Hadoop data-filtering 알고리즘이다. 또한 SnapLogic은 그들의 HDFS 버전을 소개했다. 이것은 하둡 사용자들이 SnapLogic 플래폼이 다루는  많은 소스들로 부터 데이터를 당겨오게 할 것이다.

오픈소스 Data-integration 벤더인 Talend와 Quest Software의 의 Hadoop-supporing tool도 있다. 대부분의 Integration 파트너쉽들은 하둡으로의 데이터 입출력을 더 쉽게 하는것을 목표로한다. Syncsort 와 Pervasive의 경우에는 상용 add-on 제품들이 하둡안에서의 빠른 처리를 목표로한다.

Syncsort 와 Pervasive

Syncsort는 DMExpress data integration 소프트웨어의 하둡 에디션을 위한 계획을 발표했다. 이 에디션은 앞서 언급한 HDFS와의 연결을 포함한다. 또한 DMExpress을 이용하는 고객들이 하둡이  오름차순, 내림차순, 역순, 특정 키 범위 정렬을  할 수 있도록 하는  고급 기능 위한 플러그인도 포함한다. Syncsort에 따르면 더 나아진 정렬은 하둡에서 2배 성능을 향상 시킬 수 있다록 한다. Informatica, SnapLogic, Talend Integrations와 마찬가지로, Syncsort는 DMExpress Hadoop Edition이 사용하기 쉽운 그래픽 유저 인터페이스 지향 데이터 통합 환경을 제공할 것이라고 말한다.  이 하둡 버전은 올해가 지나서 릴리즈 될 것이다.

Pervasive의 하둡 제품은 Data Rush다. 이 도구는 하둡안에서 concurrent, parallel  처리를 최적화한다.  Pervasive의 전통적인 data-integration 소프트웨어에서 오래전에  마스터한 data-flow parallel 프로그래밍을 소개한다. Pervasive는 MapReduce 잡의 성능을 4배에서 9배까지 높일 수 있다고 말한다. 이것은 Hive와 Pig data-flow 프로그래밍 언어를 위해서 개발중인 애플리케이션이다.

 

Forecaster의 분석가 James Kobielus는 하둡 시장이 몇년동안  수조원으로 성장할 것이라고 확신한다고 말했다. 
eBay, Facebook, NetFlix, Twitter가 화려한 예시들이다. 그러나 JPMorgan Chase 같은 거대 금융회사가 하둡 도입을 시도했다는 것이 더 흥분되는 일이다.

----

의역도 하고 생략한 부분도 있다. 오역도 물론 있다;;
전통적인 Data-Integration 벤더들은 모두 하둡 시장을 새로운 기회로 보고 있다.
기존 EDW 벤더도 변신을 꾀하지 않으면 앞으로의 성장을 보장할 수 없는 시기가 왔음은 분명한것 같다. (물론 망하지는 않겠지만..  )

Posted by 김민우 julingks

댓글을 달아 주세요