본문 바로가기
일하는 중에

Apache Phoenix Query Server를 활용한 프론트엔드 개발환경 꾸미기

by likebnb 2020. 8. 10.

0. 들어가며 - Query Server가 필요한 이유

HBase가 처음 소개된지도 꽤나 오래다. RDBMS를 오랫동안 사용해온 수 많은 개발자들에게 HBase의 출현은 충격 그 자체였다.

"정규화를 하면 안 된다고? 게다가 색인을 만들수도 없다는 것이 말이 돼?"

HBase는 복잡한 코드를 단순하게 만들어주는 마법과도 같았던 SQL 조차 쓸 수 없었으니 난감할 수 밖에. 그래서 등장한 것이 Phoenix 코프로세서다. HBase에 플러긴처럼 꽂아 쓸 수 있도록 고안된 이 코프로세서는 SQL을 지원할 뿐 아니라 색인도 지원한다. NoSQL의 대명사인 HBase가 어떤 의미에선 더 이상 NoSQL이 아닌 것이 돼 버렸다. 아니 NoSQL의 장점과 RDBMS의 장점을 두루 갖춘 강력한 DBMS가 됐다고 하는 것이 맞겠다. 어디까지나 개발자의 관점에서 그렇다.

자 그럼 Query Server란 무엇이고 필자가 이 글을 쓰게 된 이유는 무엇일까? 하나씩 차근차근 알아보도록 하자.

 

1. HBase와 Phoenix

HBase는 컬럼기반으로 동작하는 DBMS이며 관계형데이터베이스에서 지원하는 SQL은 지원하지 않는다. 그래서 RDBMS에서 요구하는 정규화가 필요치 않으며-하면 안 된다- 가급적 모든 컬럼을 하나의 테이블에 모아서 정의하는 것을 권장한다. 대용량의 데이터 행을 처리하는 것을 목적으로 만들었기 때문에 테이블간 조인이라는 개념이 없고 그렇기에 테이블을 쪼개면 대략 난감이다. 이러한 이유로 RDBMS에서 익숙하게 사용하던 SQL이 HBase엔 없는 것이다. 관계대수에 기반을 두고 있는 SQL을 사용하는 RDBMS와  HBase는 근본적으로 다른 것이다.

이처럼 SQL을 지원하지 않는다는 이유로 "No SQL"이란 별명이 붙은 것이다. 하지만 영원한 것은 없는 법, HBase가 여기저기서 쓰이기 시작하고 관심을 받다보니, 아니면 반대로 저변확대를 위해서일까? SQL을 통해 HBase에 접근하기를 원하는 바람에 부응해서 Phoenix라는 것이 등장한다. 한 가지 짚고 넘어가자면 Phoenix는 그 자체로 데이터베이스는 아니다. 혼자서 단독으로 동작할 수 없고 HBase에 붙어서 그 처리과정에 개입하는 모듈이라고 볼 수 있다. 하지만 주인공에 버금가는 조연으로 부상하는가 싶더니 이내 HBase는 개발자들에게서 잊혀지고 Phoenix만 남았다. SQL을 통한 데이터 접근 뿐 아니라 JDBC 드라이버를 제공하기 때문에 표준 API로 기존에 쌓은 노하우를 그대로 Phoenix를 통해 HBase를 다루는 것에 활용할 수 있다. 자 이제 본론으로 들어가보자, Phoenix로 접속하기 위해선 Zookeeper 쿼럼과 통신이 가능할 뿐 아니라 HBase 클러스터의 HMaster, 모든 RegionServer들과도 통신이 가능해야 한다. 하둡의 HDFS 기반으로 동작하는 HBase 클러스터는 IPC, RPC 통신을 근간으로 하기 때문에 일반적으로 방화벽 설정을 해제하고 사용한다. Phoenix 클라이언트 역시 HBase 클러스터와 통신을 위해서 클러스터의 모든 노드에 접근할 수 있어야 한다. 보안 담당자 입장에선 이런 상황이 몹시 못마땅할 수도 있을 것이다. 그래서 등장한 것이 바로 Phoenix Query Server다.

 

2. Phoenix와 Query Server

Phoenix 클라이언트에게 굳이 HBase 클러스터를 노출하고 싶지 않다면 Query Server를 구성하고 이를 통해서 접속하게 하면 된다. 바람직하게도 Query Server는 HBase 클러스터 밖에 배치할 수도 있다. 즉 HBase 클러스터와 Phoenix 클라이언트의 중간 지점인 DMZ에 배치하여 피닉스 클라이언트가 속한 네트워크와 HBase 클러스터의 네트워크를 분리할 수 있다는 것이다. 네크워크 보안이라는 관점에서의 이점도 있겠지만 개발자 관점에서의 이점도 있는데 다름 아닌 JDBC 드라이버를 사용함에 있어 thick 드라이버 대신 thin 드라이버를 쓸 수 있다는 점이 바로 그것이다. 뭐니뭐니 해도 디버깅 포인트가 줄어든다는 점에서 훌륭한 솔류션이 아닐 수 없다. 자 이제 서론은 끝났다. 이제 Query Server를 설치하고 설정한 뒤 운영하는 방법을 알아보도록 하자. 

 

 

3. Query Server 설치, 설정 그리고 시작과 종료

설치하기에 앞서 확인해야 할 사항이 몇 가지 있는데 가장 중요한 것 두 가지만 나열해 보았다.

  • 네트워크 구성은 어떻게 할 것인가?
  • 접속할 Phoenix 버전(HBase 버전에 종속됨)은 어떻게 되는가?

첫 번째로 네트워크는 1) HBase 클러스터와 2) Query Server 그리고 3) Phoenix 클라이언트가 모두 다른 네트워크에 있다고 전제한다. 다음으로 Phoenix 클라이언트는 phoenix-5.0.0-HBase-2.0 버전을 사용하기로 한다. 해당 버전은 저장소에서 다운 받을 수 있다.

 

1) 피닉스 다운로드, 설치

다운 받은 파일은 서업 운영 규칙에 맞는 디렉토리(/usr/local에 설치하기로 한다)에 압축을 해제하면 된다. 이로써 반은 끝난 셈이다.

cd /usr/local
tar zxvf phoenix-5.0.0-HBase-2.0-bin.tar.gz

 

2) 피닉스 쿼리서버 설정

먼저 HBase 클러스터의 hbase관련 xml들을 쿼리서버가 운영될 호스트의 /etc/hbase/conf로 복사한다. 복사한 결과 다음과 같은 파일들이 위치하게 된다.

 

Query Server가 운영될 호스트의 /etc/hbase/conf에 HBase 설정파일들을 복사

 

다음으로 hbase-site.xml 파일을 열어서 Query Server가 서비스할 포트를 지정해준다. 기본값은 8765인데 이 값 대신 60876을 쓰기로 한다.

 

쿼리서버가 서비스할 포트 지정

 

이것으로 필요한 설정은 모두 마쳤다. 물론 방금 쿼리서버에 할당한 포트에 대한 방화벽 설정은 해줘야 한다. 아울러 DMZ 역할을 하는 쿼리서버에서 HBase 클러스터 네트워크로의 접근은 허용돼야 함은 물론이다. 프록시라고 생각하면 되겠다.

 

3) Query Server의 기동과 종료

설치와 설정이 끝났으니 Query Server를 기동하고 종료하는 방법을 알아보자. 어려울 것 없다. start, stop만 알면 된다.

$PHOENIX_HOME/bin/queryserver.py start
$PHOENIX_HOME/bin/queryserver.py stop

 

 

4. Query Server Client

쿼리 서버가 정상적으로 동작하는지 확인하는 방법은 클라이언트 프로그램을 실행해보는 것이다. 피닉스 설치 경로에서 다음의 프로그램을 찾아 실행보도록 하자.

$PHOENIX_HOME/bin/sqlline-thin.py http://localhost:60876
기본 포트 8765 대신 60876을 썼기 때문에 실행 인자로 포트를 지정해줘야 함을 잊지 말자.

 

sqlline-thin.py 실행 시 기본 포트가 아닌 경우 반드시 포트를 명시해야 함

 

HBase를 찾지는 못했지만(당연하다) Phoenix로 접속은 성공했다. 이제 일반적인 HBase 클러스터에 접속한 것과 동일하게 피닉스를 쓰면 된다. 이 쯤에서 이 글의 목적을 다시 한 번 상기해보건데 우리는 개발환경을 꾸미기로 하였다. sqlline-thin.py는 서버 사이드에서 구동되는 프로그램이다. 정말이지 급할 때 잠깐 쓰는 용도의 프로그램이지 개발의 동반자로 삼기엔 부족하다. 이 글을 읽는 독자들은 여러분 PC의 개발툴(아마도 이클립스)에서 피닉스 서버(Query Server)에 직접 연결하고 싶을 것이다.

 

5. Eclipse와 DBeaver 플러그인

DBeaver는 이클립스에 플러긴으로 추가할 수 있는 아주 훌륭한 DBMS 관리툴이자 개발을 지원하는 개발툴이다. 설치법이나 기본적인 사용법은 생략하겠다. 이클립스에 DBeaver 플러그인이 이미 설치돼 있다는 가정 하에 설명을 이어 나가기로 한다. DBeaver Perspective에서 프로젝트에 Connections, Scripts 폴더가 추가된 것을 볼 수 있다. SQL 편집기에서 단순 편집만 가능한 것이 아니라 편집한 SQL을 실행하고 그 결과를 볼 수 있게 레이어가 구성돼 있다. 자 이렇게 편리한 툴이 있어도 DBMS에 접속할 방법이 없다면 무슨 소용이란 말인가! 이제 DBeaver 플러긴을 이용해 Phoenix Query Server에 접속하는 방법을 알아 보자.

 

Eclipse 플러그인, DBeaver와 그 Perspective

 

6. DBeaver 플러그인에 Query Server Client 설정

Connections 폴더에 접속하기를 원하는 JDBC 설정을 선언해주면 되는데 이를 위해서 다음 사항을 준비해야 한다.

  • JDBC Thin Driver 파일
  • 쿼리서버의 호스트, 포트 그리고 프로토콜 정보
  • 옵션: 계정정보

 

1) JDBC Thin Driver 파일

이 글의 초반에 설치한 Phoenix 경로에서 다음 파일을 다운받아 여러분 PC의 적절한 디렉토리에 저장해 놓는다.

phoenix-5.0.0-HBase-2.0-thin-client.jar 

 

2) 드라이버 템플릿 만들기

데이터베이스 > 드라이버 관리자 > Hadoop에 새로운 템플릿을 추가한다.

 

 

Hadoop 타입의 새 템플릿을 Apache Phoenix Thin이라는 이름으로 추가

기존에 이미 있는 Apache Phoenix는 Thick Driver로 HBase 클러스터에 직접 연결하는 템플릿이다. 이 템플릿 대신 Query Server로 접근할 수 있는 Thin Driver를 사용하는 템플릿을 만들 것이다. New 버튼을 클릭하면 다음의 다이얼로그 창이 뜬다. 셋업해야 할 내용은 다음과 같다.

  • Driver Name: Apache Phoenix Thin
  • Class Name: org.apache.phoenix.queryserver.client.Driver
  • URL Template: jdbc:phoenix:thin:url=http://{host}:{port};serialization=PROTOBUF;
  • Default Port: 60876
  • No authentication, Allow Empty Password 항목에 체크
  • Libraries: 전 단계에서 다운 받은 jar파일을 추가

 

 

Apache Phoenix Thin Driver 접속을 위한 드라이버 템플릿

 

이제 거의 끝났다. 방금 만든 이 템플릿을 이용해서 실제 쿼리서버에 접속하는 커넥션을 하나 만들어 보자. 이클립스 해당 프로젝트의 Connections 폴더에서 마우스 오른쪽 버튼을 클릭해서 Create > Connection 메뉴를 선택한다. 직전에 만들었던 템플릿, Apache Phoeix Thin이 보일 것이다. 이를 선택하고 다음(Next)을 클릭한다.

 

 

Apache Phoenix Thin 템플릿을 선택하고 다음을 클릭한다.

 

다음과 같은 다이얼로그를 만나게 되는데 여기에서 여러분이 신경 쓸 부분은 Host와 Port이다. 미리 확인해 둔 정보를 써 넣자. 

 

Apache Phoenix Query Server 접속을 위한 정보 입력

 

이제 마지막 하나의 설정이 남았다. 일반적으로 데이터베이스 툴을 보면 접속 후에 데이터베이스 스키마를 탐색할 수 있는 GUI를 제공한다. DBeaver도 마찬가지인데 수동으로 만든 Phoenix Query Server용 템플릿에서 이 부분이 자동으로 잡히질 않는다. 그래서 별도의 셋업이 필요하다. 커넥션 편집, General 하위메뉴의 Filters 섹션에서 Schemas를 클릭하고 Include에 "DEFAULT"를 추가하자. 이는 기본 설정으로 HBase, Phoenix를 설치했을 때 생성되는 기본 데이터베이스 이름이다. 여러분의 DBA가 만약 데이터베이스 이름으로 다른 것을 썼다면 당연하게 그 이름을 알아야 한다. 더 나아가 계정정보 또한 추가 설정할 수 있다.

 

Phoenix Query Server와 연결한 뒤 스키마 정보를 보기 위한 설정

 

 

 

7. 글을 마치며

여러분을 비롯한 많은 현역 개발자들과 예비 개발자들이 빅데이터 개발자로 거듭나기 위한 노력들을 경주하고 있는 것으로 안다. 이 일을 먼저 시작한 입장에서 개발자들에게 필요할 것이라 생각되어 정리해봤다. 일반적인 내용은 대체로 잘 설명하고 있는 글들이 많아서 큰 흐름만 서술했다. Phoenix Query Server가 여타의 이유로 필요한 것이 사실이고 실제로 많이 쓰이고 있는데 개발툴과의 연동 부분에 대한 자세한 설명이 없어서 적어본 글인데 부족한 부분이나 잘못된 부분이 있다면 하시라도 수정, 보완을 요청 바란다.