Impala를 사용해 봐야 할 일이 생겼다.
Impala 는 아파치 프로젝트에 incubating 단계로 관리되고 있는
프로젝트로써
HDFS(Hadoop Distributed File System) 안에 있는 데이터를 SQL를 통해
대화형으로 분석할 수 있게 도와주는 시스템이라고 한다.
HDFS 를 이용하기 위해선 MapReduce 프레임워크를 알고 있어야 이용할 수
있다는 불편한 제약을 Impala 를 통해 벗어날 수 있다고 이해할 수
있겠다.
필자는 Hadoop, SQL 과 같은 기술이 낯설고 두려움이 있었는데 Impala 를
통해 조금씩 알게 되는 계기로 작용하기도 했다.
본 글은 Docker 을 통해 Impala
를 간단히 구동시켜보고,
RImpala package 를 이용해 R 상에서 Impala 와 커넥션을 맺는데 성공했던
과정을 짤막하게 정리하고 적어보고자 한다.
Ready impala
Impala 이용 전 .jar
리소스들을 준비해야 한다고
한다.
아래 코드를 통해 다운로드 및 워킹디렉토리에 압축해제가 가능하다.
download.file("https://github.com/Mu-Sigma/RImpala/blob/master/impala-jdbc-cdh5.zip?raw=true",
"jdbc.zip", method = "curl", extra = "-L")
unzip("jdbc.zip")
Docker images ready
프로젝트 당시 Cloudera 인프라 환경이 잘 갖추어진 상태에서 RImpala
패키지를 통해 R과 연동시켜 분석이 가능했는데
클라우데라 동작환경을 그대로 본 포스팅 글에 재현하기가 조금 어렵다.
그래서 Docker 의 도움을 받아 튜토리얼을 작성해 보려 한다.
여기서 Docker 를 이용하려는 이유를 언급해야 할 것 같은데
Impala 를 이용하기 위해선 Hadoop 시스템이 사전에 준비되어야 하고, JDBC
를 위한 Java 설정등 다양한 준비(Requirements)가 매우 부담되기
때문이다.1
이러한 이유로 나는 Docker 를 이용해 누군가가 사전에 잘 구축한 환경을
사용하고자 하기 때문에 Docker 를 실행시켰다.
“impala” 라는 검색어로 docker hub 상 이미지를 검색해 본다.
$ docker search impala
NAME DESCRIPTION STARS
cloudera/impala-dev Impala development environment 10
codingtony/impala 5
rooneyp1976/impala Impala 2.0.1 on Ubuntu 14.04 Image (fork o... 4
lancope/impala-shell 1
yanlinw/docker-impala impala 2.0.1 + sqoop + sql server driver 0
mikefaille/ubuntu-impala Description 0
galloplabs/hadoop-cdh-impala 0
yanlinw/docker-impala-sqoop impala sqoop2 0
cpcloud86/impala 0
damsl/impala 0
joshdub223/impala 0
aurele/shiny4saagie-impala Form that reads/writes from Impala on Saagie 0
sebastianmontero/impala 0
datadudes/impala-rest-api Simple rest API for Impala 0
andreysabitov/impala-kudu 0
... [이하 생략]
여러 가지가 이미지가 준비되어 있는데 그중 개인적으론
“cloudera/impala-dev” 보단 “codingtony/impala” 가 바로 사용하기
좋았다.
“codingtony/impala” 이미지를 준비 내려받았다.
$ docker pull codingtony/impala
1.4GB 정도가 다운로드 되는데 시간이 조금 소요된다.
다운로드 이후 image 가 잘 준비되어 있는지 docker images
를
통해 확인할 수 있다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
codingtony/impala latest 24f0d50712cf 2 years ago 1.452 GB
다음을 통해 준비한 Impala 이미지를 컨테이너로 실행시킨다.2
$ docker run -d --name "impala" -p 9000:9000 -p 50010:50010 -p 50020:50020 -p 50070:50070 -p 50075:50075 -p 21000:21000 -p 21050:21050 -p 25000:25000 -p 25010:25010 -p 25020:25020 codingtony/impala
참고로 docker run
의 다양한 옵션들 중 -d,
--name
은 각각
-d
: background 프로세스로 실행해 놓겠다는 의미--name "impala"
: image 이름의 alias 를 부여, 예를 들어 본 컨테이너에 접근하기 위해선 “codingtony/impala” 의 이름을 다 입력해야 하는데 앞으론 “impala” 라는 이름으로 접근 가능
의 의미를 가지고 있다.
참고로 Impala 컨테이너가 백그라운드로 잘 실행되는 상태인지 확인을 위해선
docker ps
명령어로 프로세스 확인할 수 있다.
프로세스가 잘 돌고 있는 것을 확인했다면
$ docker exec -it impala /bin/bash
를 통해 Impala 컨테이너의 bash 셸을 열어 입력/출력이 가능하도록
사용할 수 있고
impala-shell
를 실행해 대화형 쿼리를 주고받을 수 있다.
root@cb4ba4d0f902:/# impala-shell
Starting Impala Shell without Kerberos authentication
Connected to cb4ba4d0f902:21000
Server version: impalad version 1.4.2-cdh5 RELEASE (build eac952d4ff674663ec3834778c2b981b252aec78)
Welcome to the Impala shell. Press TAB twice to see a list of available commands.
Copyright (c) 2012 Cloudera, Inc. All rights reserved.
(Shell build version: Impala Shell v1.4.2-cdh5 (eac952d) built on Tue Sep 16 19:15:40 PDT 2014)
[cb4ba4d0f902:21000] >
RImpala package 이용한 로컬에서의 impala 제어
Docker VM IP 확인
로컬 상에서 RImpala package 이용한 로컬 상의 제어를 위해 docker
컨테이너의 ip 를 확인할 필요가 있다.
boot2docker 를 사용해 docker 를 이용한다면 boot2docker ip
를 통해 확인하거나,
$ boot2docker ip
도커 컨테이너에 직접 들어가 ip addr
를 실행시켜 확인하는
방법이 있을 것이다.
$ docker exec [CONTAINER_ID] ip addr
예를 들어 ip를 확인해 보니 “192.168.59.103” 임을 위의 커멘드를 통해 확인했다고 가정하겠다.
R상에서 RImpala 패키지를 이용한 커넥션
RImpala 패키지는 현재 install.packages("RImpala")
를
통해 설치가 되지 않는다. CRAN 에서 유지보수가 멈춘듯 싶은데3 이전
아카이브에 설치 리소스가 있다.
링크를 타고 들어가 보면 0.1.6 버전이 마지막 최신버전인데 tar.gz
압축파일을 다운로드 한 후 다운로드의 경로에서 터미널을 실행해
$ R CMD install RImpala_0.1.6.tar.gz
를 입력하거나 R 상에서
install.packages("RImpala_0.1.6.tar.gz", repos = NULL)
을 통해 패키지를 설치할 수 있다. 단 Java 가 시스템상의 요구조건이며, rJava 패키지와 의존성이 있어 rJava 패키지가 정상적으로 설치되었을 때 위의 RImpala 패키지 설치가 가능하다.
설치 및 로드가 되었다면 R session 으로 시점을 이제 완전히
돌린다.
먼저 .jar
들을 다운받은 디렉토리 path를
rimpala.init()
함수에 입력한 코드를 먼저 실행하고,
docker 컨테이너의 ip, 그리고 Impala JDBC/ODBC 기본값 포트번호 (21050) 를
rimpala.connect()
에 입력한 코드를 그다음으로
실행한다.
TRUE
가 반환되면 커넥션이 성공한 것이다.
library(RImpala)
rimpala.init(libs = "impala-jdbc-cdh5")
## [1] "Classpath added successfully"
rimpala.connect(IP = "192.168.59.103", port = "21050")
## [1] TRUE
Use databases
자 이제 즐기면 되겠다. database 가 무엇이 있는지 확인부터
해보자.
show databases;
쿼리를 실행하는 것은
rimpala.showdatabases()
을 실행하는 것과 같다.
rimpala.showdatabases()
## name
## 1 _impala_builtins
## 2 default
쿼리문 자체를 이용하고자 한다면 rimpala.query()
함수를
이용하면 된다.
rimpala.query("show databases")
## name
## 1 _impala_builtins
## 2 default
사용할 데이터베이스 선택을 해보자.
“default” database 를 사용하려한다면
rimpala.usedatabase("default")
## [1] TRUE
를 하면된다. use default;
쿼리와 같다.
Send query test
rimpala.query("drop table sample")
rimpala.query("create table sample(no integer)")
rimpala.query("insert into sample (no) values (1)")
<- rimpala.query("select * from sample")
data data
## no
## 1 1
close connect impala
커넥션은 rimpala.close()
로 끊을 수 있다.
rimpala.close()
## [1] TRUE
Reference
- How-to: Do Statistical Analysis with Impala and R
- Naver D2 - Hadoop에서의 실시간 SQL 질의: Impala
- Github Readme (codingtony/docker-impala)
Cloudera 에서 Impala install 페이지를 보고 지레 겁먹어서 그렇기도 하다↩︎
docker pull
과정 없이 바로docker run
을 해도 된다.docker run
은 이미지가 없을 경우 자동으로 이미지를 다운로드 하고나서 컨테이너를 준비해 실행시키기 때문이다↩︎2018-01-07 부로 그런 듯 싶다↩︎