Apache Phoenix 활용

Apache Phoenix 활용

 


Apache PhoenixNoSQL의 한 종류인 HBase 위에 관계형 데이터베이스에서 사용하는 SQL layer를 구현한 오픈 소스의 개발 도구입니다. 이번 포스팅에서는 Apache Phoenix의 주요 특징과 Phoenix를 웹서비스 어플리케이션에 적용해 보면서 느꼈던 장점 및 한계점과 활용방안에 대해 알아보겠습니다.

 

1.1 Apache Phoenix의 특징

Phoenix는 우리에게 익숙한 SQL 문법을 사용하여 HBase 데이터에 접근한다는 것과 HBase Java 클라이언트 API 대신 표준 JDBC API를 사용한다는 특징을 갖고 있습니다. 이를 통해 테이블 생성, 데이터 삽입, 데이터 쿼리 등의 모든 CRUD DDL 작업을 수행할 수 있습니다. SQL JDBC의 사용은 사용자가 작성해야 하는 코드의 양을 줄여주고, 사용자가 알기 쉽게 성능 최적화되어 있습니다.

Phoenix의 주요 특징으로는 다음 3가지가 있습니다. 첫 번째로는 HBase 데이터에 대한 빠른 접근이 가능하다는 점입니다. Phoenix HBase에 특화된 push down 기능이 있습니다. 이 기능을 통해 Map-reduce를 사용하지 않고 사용자가 작성한 SQL 쿼리를 수신하여 native HBase 명령어로 컴파일하여 쿼리를 수행하게 됩니다. 두 번째는 Phoenix는 추가적인 서버를 필요로 하지 않기 때문에 비교적 가볍다는 것입니다. 마지막으론 Phoenix를 통해 기존에 존재하는 HBase 테이블과의 Mapping이 가능하다는 점입니다.

 

1.2 장점

HBase에서는 put, get과 같은 단순한 명령어만 사용할 수 있기 때문에 HBase 데이터에 대해 SQL 문법으로 쿼리할 수 있는 기능을 제공하는 Phoenix를 사용함으로써 아래와 같은 장점을 발견할 수 있었습니다.

 

1.2.1 JOIN

원래 HBase에서는 JOIN 기능을 지원하지 않아 데이터 모델링 단계에서 테이블을 비정규화 하거나, Application Side Join을 실시해야 했습니다. 하지만 Phoenix를 사용하게 된다면 기존에 저희가 익숙한 SQL 문법으로 JOIN 기능을 구현할 수 있습니다.

 

1.2.2 페이징 처리

게시판을 구현할 때 필수적인 기능이 바로 페이징 처리입니다. HBase 자체적으로 페이징 처리를 구현할 수 없는 것은 아니지만 Phoenix를 통해 SQL 키워드 중 ‘LIMIT OFFSET’을 이용하여 페이징 처리를 보다 손쉽게 구현할 수 있습니다.

 

1.2.3 키워드 활용

SQL에서 사용할 수 있는 여러 가지 키워드(DISTINCT, UPPER )를 활용할 수 있기 때문에 어플리케이션 단에서 처리해야 하는 로직을 줄일 수 있습니다.

 

1.3 한계점

Phoenix HBase 데이터에 대하여 SQL 문법을 활용한 쿼리 기능을 지원하긴 하지만, RDB 처럼 모든 기능을 제공하지는 못합니다. 웹서비스에 필요한 쿼리를 Phoenix를 통해 사용해 보면서 발견한 몇 가지 한계점은 아래와 같습니다.

 

1.3.1 서브쿼리 사용의 제한

Phoenix에서 FROM절 뒤에 서브쿼리를 사용하는 것은 가능하지만 SELECT 절 뒤에 서브쿼리를 사용하는 중첩 쿼리(Nested Query)’는 사용이 불가능합니다.

 

1.3.2 중첩 집계 함수 (Nested Aggregate function) 사용 불가능

함수 안에 또 다른 함수를 사용하는 것을 중첩 집계 함수라고 합니다. 예를 들어, 특정 컬럼의 데이터 갯수를 구하고 그 합계의 평균을 구하기 위해선 AVG(COUNT(컬럼명)) 과 같은 구문을 작성해야 합니다. 그러나 Phoenix에서는 이와 같은 중첩 집계 함수 사용이 불가능합니다.

cf) COUNT(DISTINCT 컬럼명)과 같이 함수와 키워드의 중첩 사용은 가능합니다.

 

1.3.3 키워드 및 함수 사용의 제한

Phoenix에서는 기존 SQL 함수 및 키워드 중 사용이 불가능한 것들이 몇 가지 있습니다.

 

1) CONVERT() 함수

CONVERT 함수는 특정 컬럼의 데이터 형식을 다른 데이터 형식으로 변환하는데 사용됩니다. 보통 날짜 데이터를 가지고 있는 컬럼을 대상으로 사용되며, 해당 날짜 컬럼에서 년도, , 일을 분리하여 새로운 컬럼으로 이용하기 위해 주로 사용합니다. Phoenix에서는 이러한 기능을 제공하는 CONVERT() 함수를 사용할 수 없습니다.

 

2) OVER() 함수와 RATIO_TO_REPORT() 함수

OVER() 함수는 여러 집계 함수들과 함께 사용되어 괄호 안의 내용을 기준으로 묶어주는 역할을 합니다. 주로 사용되는 OVER() 함수의 사용 형태는 다음과 같습니다.


OVER() 함수는 분석 쿼리를 만드는데 많이 사용되곤 하는데 Phoenix에서는 이 OVER() 함수를 사용할 수 없기 때문에 분석 쿼리를 만드는데 제한이 됩니다.

RATIO_TO_REPORT() 함수는 분석함수로서 값의 그룹별 합에 대한 값의 비율을 계산합니다. 이 함수를 통해 전체 중에 각 그룹이 차지하는 비율 등을 계산할 수 있는데 Phoenix에선 이 함수 또한 사용이 불가능합니다.

 

1.4 활용방안


1.4.1 CRUD 어플리케이션 구축

put get 명령어만을 이용하여 HBase 데이터에 접근할 때와는 달리 Phoenix를 사용하게 된다면 우리에게 익숙한 SQL 문법을 통해 HBase 데이터에 접근할 수 있습니다. 또한 SQL 키워드 및 함수들을 활용하여 페이징 처리와 조건 검색, JOIN 등을 할 수 있습니다. 이러한 Phoenix의 사용을 통해 SQL 접근 기능과 함께 HBase의 확장성을 필요로 하는 CRUD 기능의 어플리케이션을 구축하는데 효과적일 것이라고 생각합니다.

 

1.4.2 데이터 분석 기능 사용의 제한

Phoenix에서는 중첩 쿼리나 중첩 함수의 사용이 불가능하다는 점과 몇 가지 함수 및 키워드를 사용할 수 없다는 것을 알게 되었습니다. 또 그 외에도 여러 분석 함수들의 사용이 Phoenix를 통해서의 사용이 제한됩니다. 이와 같은 것들을 고려해보면 Phoenix를 이용하여 로그 데이터 분석과 같은 기능을 구현하는 데에는 어려움이 있을 것이라고 생각합니다.

 



 

'빅데이터' 카테고리의 다른 글

간략하게 알아보는 추천시스템  (0) 2017.12.29
[Spark] Streaming에서 DataFrame Tip  (0) 2017.11.30
Apache Phoenix 활용  (0) 2017.11.28
NoSQL 데이터 모델링  (0) 2017.10.30
HBase 개념 정리  (0) 2017.09.21
NoSQL 개념 정리  (0) 2017.09.21

New Multi-Channel Dynamic CMS