Hcatalog introduction and install.

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 파일을 수정할 필요가 있다. 이 파일을 열어라. 다음 테이블은 당신이 필요한 설정들의 값을 보여준다.

Parameter Value 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

Apache Hadoop Goes Realtime at Facebook, SIGMOD’11

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억명의 사용자가 사용해야한다. 페이스북에서 검증 되었다는 것은 큰 의미가 있다고 볼 수 있겠다.
혹시나 필요한 사람을 위해서 발표자료를 공개한다.

Hadoop Big Data Startup Spins Out of Yahoo

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

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 발표에서 말했다.

4 Hadoop Helpers Promise Speedy Big-Data Analysis

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 벤더도 변신을 꾀하지 않으면 앞으로의 성장을 보장할 수 없는 시기가 왔음은 분명한것 같다. (물론 망하지는 않겠지만..  )

Gartner Adds Big Data, Gamification, and Internet of Things to Its Hype Cycle

* Source : http://www.readwriteweb.com/enterprise/2011/08/gartner-adds-big-data-gamifica.php

2011 가트너  “하이프 싸이클”에 작년에는 없던  키워드인 Big Data, Gamification, internet of Things, Consumerization 가 추가 됐다.

가트너의 하이프 싸이클은 시장의 기술 수용 단계(가로)와 관심도(세로)의 그래프라고 할 수 있다.

Gartner hypecycle thumb 600x436 32385

시장의 기술 관심도는 점점 높아져 Peak of Inflated Expections 지점에 가게 된다.
하지만  기대에 대한 거품이 빠지면 Trough of Disillusionment 단계로 넘어간다.  언론과 시장의 관심이 줄어드는 이 단계에 접어 들었다고 기술이 한 물 갔다고 생각하면 안된다. 그 중에 가능성 있는 기술은 다시 재조명 받게 되고 이전에 이 기술에 투자한 회사들은 매출이 증가하게 된다.
하지만 실상 기술의 관심이 절정일 때에는 관심도의 비해서 도입 비율과 매출은 미비하다. 사람들은 기술이 모든걸 해결 해줄 거라는 기대를 하지만 거품이 껴있다. ( 그래서 사람들은 새로운 기술에 반드시 실망한다. 그렇다고 모두 내팽개치면 안된다.)

올해는 어떠한가 Private Cloud 가 관심의 정점에 있다.  Cloud/Web Platfroms은 환멸의 골(Trough of Disillusionment)을 향하고 있다.
215667 0001

엔지니어라면 하이프 싸이클은 앞으로 어떤 기술이 시장의 관심을 많이 받을 것인가를 보는데 집중하는 것이 좋다.
경험상 한국은 미국에 비해서 경우에 따라 1,2년 정도의 격차가 있지만, 그 간격도 점점 좁혀지고 있다.

이번에 4가지에 키워드가 추가되었는데 그 중에 “빅 데이터”에 주목 하자. 기사에서는 빅데이터가 빠르게 성숙할 것 이라고 예상한다.
빠르게 이동하고 있지만 매우 적은 실망을 보여주고 있다는 것이 고무적이라고 할 수 있다.
지금의 속도라면 1~2년 후에 시장의 큰 관심을 받게 될 것이다.
이미 올해부터 빅데이터에 대한 기사와 시장 조사 기관의 보고서들 나오고 있다.

엔지니어의 기술 포트폴리오는 금융 포트폴리오와 비슷한 면이 많다. (from 실용주의 프로그래머)
경험상 3,4년전 한창 웹 2.0 열풍이 불었을 때 별다른 관심을 받지 않던 클라우드 컴퓨팅과 하둡에  대한 주제를 선점한 사람들은 지금 전문가가 되어 가치가 상승했다.  나의 기술 포트폴리오에 어떤 종목을 추가할 것인가?  누군가 묻는다면 “빅 데이터”를 눈여겨 보라고 하고 싶다.

Reference

Hadoop World 2011, NYC

올해도 어김 없이 Cloudera 주최의 Hadoop World 컨퍼런스가 열린다.
11월 8일~9일, 이틀 동안이고 장소는 뉴욕이다.
세션도 대폭 늘어나 40여개나 된다.

비정형 빅데이터 플랫폼 강자로 떠오른 하둡에 대한 관심과 열기를 느낄 수 있는 컨퍼런스라 할 수 있겠다.
앞으로 수년 내로  하둡 시장이 수조원 규모로 성장한다는 이야기도 나오고 있고, JP Mongan Chase 같은 보수적인 금융회사에서 하둡을 도입하고 있다.
가트너에서 내년 BI 시장을 15조원 정도로 예상하고(하드웨어와 하둡을 제외한), 데이터 분석 시장 또한 10~15% 정도 성장할 것으로 내다 보고 있다.
비정형 빅데이터 분석 시장도 같이 커질 것으로 예상된다.
빅데이터 키워드도 가트너 하이프 싸이클에 추가가 되어 1~2년 사이에 큰 관심을 받는 분야가 될 것이라는 예측이 지배적이다.
(지금 하이프 싸이클의 정점은 클라우드 컴퓨팅이다)
전통적인 BI 빅 플레이어들 (SAP, Oracle, IBM, Microsoft 등)도 빅데이터 플랫폼의 패권을 차지하기 위한 경쟁에 뛰어 들었다.
그 중심에 있는 키워드는 단연 하둡이라고 할 수 있겠다. 물론 넥스트 하둡 플랫폼의 대한 경쟁도 이미 막이 올랐다.
하둡은 강력한 오픈소스 커뮤니티의 힘으로 성장했다고 볼 수 있는데, 구글의 GFS 논문의 클론 프로젝트가 이만큼 성정한 것을 보니, 오히려 베일 속에 감춰진 구글의 저력이 궁금하면서 무섭기도 하다.  그런 의미에서 Mapreduce, GFS, BigTable 논문은 CS 학계의 패러다임을 전환시킨 대단한 논문이라고 할 수 있겠다. 이미 MapReduce 논문은 인용 횟수가 수천회가 넘었다. (2004년에 나온 논문이 벌써 3천여회라니.. )

화제를 다시 Hadoop World로 돌리면, 2009년에 이어 올해 우리 회사의 proposal이 통과했다.
올해는 Jason Han(한재선 대표)이 “Replacing RDB/DW with Hadoop and Hive for Telco Big Data” 주제로 발표한다.
꾸준히 해외 컨퍼런스에 한 세션을 차지하고 있다는 것은 뿌듯한 일이다. (국내 기업은 유일하다)
Hbase도 페이스북의 Contribution으로 다시 뜨겁게 관심을 받고 있고, 하둡 에코 시스템의 힘이 대단 하다고 볼 수 있겠다.

다가올 빅데이터 시대의 하둡에 대한 관심과 위상을 느낄 수 있는 컨퍼런스임에는 분명하다.
뉴욕에서 열리기 때문에 가는 비용이 만만치 않지만 다양해진 세션과 높아진 관심을 생각하면 빅데이터 대한 관심이 있는 회사라면 올해 만큼은 참가할 만하다. (작년에는 미국에 날아가는 정성에 비해서는 별로 건질게 없었다)

Related Links

Maven – Coc (Convention over Configuration)

Coc(Convention over Configuration)는 간단한 개념이다.
시스템들과 라이브러리, 프레임워크는 별도의 설정 시스템 없이 ‘바로 실행’ 될 수 있어야 한다는 요구사항이 없더라도, 기본적으로 이러한 사항이 당연하다고 가정한다.
CoC의 실증으로, EJB3 영속성(Persistence)이 있다.
개별적인 영속성있는 빈을 만들기 위해서는 클래스에 @Entity라고 어노테이션을 명기하는 것이 전부이다. 프레임웍에서는 테이블 명을 클래스 명, 컬럼을 프로퍼티 명으로 가정할 것이다. 필요한 경우 제공된 이름들을 재정의 할 수 있도록 제공하는데, 대부분 불필요하다.
급하게 진행되는 프로젝트의 경우 프레임워크에서 제공하는 기본적인 정의들을 활용하는 게 낫다.

메이븐은 프로젝트에 관한 상식적인 기본 정의들을 CoC를 바탕으로 구체화 한다.
소스코드는 ${basedir}/src/main/java
리소스는 ${basedir}/src/main/resources
테스트 코드는 ${basedir}/src/test
컴파일 하면 ${basedir}/target/classes 에 바이트 코드가 생성되고
배포할 수 있는  JAR  파일은 ${basedir}/target에 생성될 것이라고 가정한다.

이런 가정이 하찮게 보일지도 모르겠지만, 대부분의 앤트 기반 빌드에서는 각 서브 프로젝트에서 이러한 디렉토리의 위치를 각기 정의한다.
메이븐은 단지 디렉토리 위치를 간단한게 하려는 것보다 소스 코드의 컴파일, 배포를 위한 패키징, 웹 사이트의 생성과 많은 다른 프로세스들을 위한 일반적인 관례들을 메이븐의 핵심 플러그인들에 적용하기 위해 CoC를 채용하였다. 이런 관례는 사용자가 선택할 수 있지만 관례를 따른다면 메이븐이 알아서 해주기 때문에 해야할 일들이 없다.
이것은 또한 사용자가 특수한 관례에 구속되어 있다고 느낄수 있다. 하지만 대부분은 사용자가 직접 정의 할 수 있다. 메이븐은 요구사항들에 적합하게 기본적인 것들을 사용자가 정의할 수 있도록 허용한다.

현대적인 프레임웍에서는  CoC적인 접근 방벙을 사용하고 있다.

  • Ruby on Rails
  • Zend Framework
  • Grails
  • Spring
  • Castle MonoRail
  • Junit
  • JBoss Seam
  • CakePHP
  • symfony
  • kohana

전통적으로, 프레임워크는 여러 다중 설정 파일들을 필요로 한다.  설정 파일은 많은 설정을 포함한다.
애플리케이션의 복잡도에 따라 이러한 설정 파일들읠 수와 크기는 매우 쉽게 늘어난다. 이에 따라 설정의 방법도 복잡해지며, 개발자가 일일이 이러한 설정을 해야 하기 때문에 개발의 속도는 감소되고, 개발의 복잡도는 증가한다. 따라서 개발자는 애플리케이션에서 관습적이지 않은 면 (unconventional aspects of the application)만 정의할 필요가 있다는 개념이다.

Reference

  • Maven sonatype이 만든 Maven 핵심가이드 / 팀 오브라이언 지음,  장선진 옮김/  지앤선

Add Test-Repository on CentOS

CentOs는 서버용으로 쓰이기 때문에 기본 Repository의 대부분의 패키지들이 버전이 낮다.
높은 버전을 사용하기 위해서는 rpm으로 직접 설치를 해야 해서 불편하다.
yum repository에 CentOS-Test Repository를 추가해서 최신 버전의 패키지들을 쉽게 설치하자.
(물론 안정성이 떨어질 수 있다는 것에 유의)

# cd /etc/yum.repos.d
# wget http://dev.centos.org/centos/5/CentOS-Testing.repo

설치를  할 때는 –enablerepo 옵션을 이용한다

# yum install php --enablerepo=c5-test

Reference

Hive 0.7.0 New Features

https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310843&version=12315150

New Features

  • [HIVE-78] – Authorization infrastructure for Hive
  • [HIVE-417] – 하이브에서 인덱스 구현
  • [HIVE-471] – 자바 메서드 reflective invocation을 위한 reflect() UDF 추가
  • [HIVE-537] – 하이브 TypeInfo/ObjectInspector 객채가 union을 지원 (struct, array, map)
  • [HIVE-842] – 사용자 권한 인프라스트럭처
  • [HIVE-1096] – 하이브 변수
  • [HIVE-1293] – 하이브를 위한 동시성 모델
  • [HIVE-1304] – row_sequence UDF 추가
  • [HIVE-1405] – 다른 SQL 커맨드 이전에 파일을 초기화 파일을 실행하는 커맨드 라인 -i 옵션
  • [HIVE-1408] – 튜닝할 수 있는 휴리스틱 기반의 로컬 모드에서 자동적으로 하이브를 실행하는 옵션 추가
  • [HIVE-1413] – 테이블/파티션을 오프라인으로 가져오기
  • [HIVE-1438] – 자연어 tokenization을 위한 sentences() UDF
  • [HIVE-1481] – 기존 top-k n-gram 빈도수를 예측하기 위한 ngrams() UDAF
  • [HIVE-1514] – 파티션의 파일포맷과 파일 위치 정보를 수정할 수 있다.
  • [HIVE-1518] – top-k econtextual n-grams 추정하기 위한 UDFA context_ngrams() 추가
  • [HIVE-1528] – json_tuple() UDTF 함수 추가
  • [HIVE-1529] – ANSI SQL covariance 집계 함수들 (covar_pop과 covar_samp 추가)
  • [HIVE-1549] – ANSI SQL 연관 집계 함수 추가 (CORR(X,Y))
  • [HIVE-1609] – 메타스토어에서 파티션 필터링 지원
  • [HIVE-1624] – S3에 위치한 스크립트 허용
  • [HIVE-1636] – SHOW TABLES {FROM | IN} db_name 구현
  • [HIVE-1659] – parse_url_tuple : parse_url의 UDTF 버젼
  • [HIVE-1661] – 파라메터들의 디폴트 값들
  • [HIVE-1779] – str_to_map의 GenericUDF 구현
  • [HIVE-1790] – Hive에서 HAVING 절 지원
  • [HIVE-1792] – 자동적으로 맵-조인으로 전환되는 조인들을 추적한다
  • [HIVE-1818] – jmx를 통해 HiveMetaSotre를 위한 빈도수와 지속시간 메트릭을 호출한다
  • [HIVE-1819] – 메타스토어에서 lastAccessTime을 유지한다
  • [HIVE-1820] – Hive 데이타베이스 데이터 센터를 알린다
  • [HIVE-1827] – 테스트에 새로운 로컬 모드 flag 추가
  • [HIVE-1835] – 하이브를 위한 더 낳은 자동 완성 기능
  • [HIVE-1840] – 데이터 프로퍼티들을 변경하기 위한 ALTER DATABASE 지원
  • [HIVE-1856] – DROP TABLE/VIEW … IF EXISTS 구현
  • [HIVE-1858] – DROP {PARTITION, INDEX, TEMPORARY FUNCTION} IF EXISTS 구현
  • [HIVE-1881] – 메타스토어 파일시스템 인터페이스가 hive.metastore.fs.handler.class.configuration property 를 통해서 연결되도록 한다.
  • [HIVE-1889] – 인덱스 파일들에 저장된  HDFS 위치를 무시하도록하는 hive.index.compact.file.ignore.hdfs 옵션 추가
  • [HIVE-1971] – Hive CLI 를 위한 verbose(진행 메세지 표시)/echo 모드

Hibernate : Generic Hibernate Dao

추상 클래스인 Generic Hibernate Doa를 상속받아 DAO를 구현하면 시간이 절약된다.

public abstract class GenericDaoHibernate <E,PK extends Serializable> extends HibernateDaoSupport implements GenericDao<E,PK>{
	
	@Autowired
	public void init(SessionFactory sessionFactory){
		this.setSessionFactory(sessionFactory);
	}
	
	@SuppressWarnings("unchecked")
	protected Class<E> getEntityClass(){
		Class<E> persistentClass = (Class<E>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		  return persistentClass;
	}
	
	protected DetachedCriteria createDetachedCriteria(){
		return DetachedCriteria.forClass(getEntityClass()); 
	}
	
	@SuppressWarnings("unchecked")
	public PK save(E newInstance) {
		return (PK)getHibernateTemplate().save(newInstance);
	}

	public void update(E transientObject) {
		getHibernateTemplate().update(transientObject);
	}

	public void saveOrUpdate(E transientObject) {
		getHibernateTemplate().saveOrUpdate(transientObject);
	}

	public void delete(E persistentObject) {
		getHibernateTemplate().delete(persistentObject);
	}
	
	public void deleteById(PK id){
		getHibernateTemplate().delete(findById(id));
	}
	
    public void deleteByProperty(String entityName, Object entity) {
        getHibernateTemplate().delete(entityName,entity);
    }

	public E findById(PK id) {
		return (E)getHibernateTemplate().get(getEntityClass(), id);
	}
	
	@SuppressWarnings("unchecked")
	public List<E> findByExample(E object) {
        List<E> resultList = getHibernateTemplate().findByExample(object, 0, 1);
        return resultList;
	}
	@SuppressWarnings("unchecked")
	public List<E> findByExample(E object, int firstResult, int maxResults) {
        List<E> resultList = getHibernateTemplate().findByExample(object,firstResult, maxResults);
        return resultList;
	}

	@SuppressWarnings("unchecked")
	public List<E> findAll() {
		return getHibernateTemplate().findByCriteria(createDetachedCriteria());
	}

	@SuppressWarnings("unchecked")
	public List<E> findAllByProperty(String propertyName, Object value) {
		DetachedCriteria criteria = createDetachedCriteria();
		criteria.add(Restrictions.eq(propertyName, value));
		return getHibernateTemplate().findByCriteria(criteria);
	}
	
}

인터페이스

public interface GenericDao <E,PK extends Serializable> {
	PK save(E newInstance);
	void update(E transientObject);
	void saveOrUpdate(E transientObject);
	void delete(E persistentObject);
	void deleteById(PK id);
    void deleteByProperty(String entityName, Object entity);
	E findById(PK id);
	List<E> findByExample(E object);
	List<E> findByExample(E object, int firstResult, int maxResults);
	List<E> findAll();
	List<E> findAllByProperty(String propertyName, Object value);
}

실제 DAO는 GenericHibernateDao를 상속 받아서 Entity 클래스와 Primary Key의 타입을 넘겨주면 된다.

@Repository
public class UserDaoHibernate extends GenericDaoHibernate<User,Long>{
	
	
}

필요한 커스텀 메서드는 DAO 마다 구현하면 된다.