Lovetoken

저는 개발 취향을 가진 데이터 분석가 Jr. 입니다.

Navigation
 » Home
 » About Me
 » Github

R에서 RImpala 패키지를 이용해 Impala 커넥션 맺기 (with Docker)

21 Mar 2017 » R, Docker





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)")

data <- rimpala.query("select * from sample")
data
##   no
## 1  1


close connect impala

커넥션은 rimpala.close() 로 끊을 수 있다.

rimpala.close()
## [1] TRUE



Reference


  1. Cloudera 에서 Impala install 페이지를 보고 지레 겁먹어서 그렇기도 하다↩︎

  2. docker pull 과정 없이 바로 docker run 을 해도 된다. docker run 은 이미지가 없을 경우 자동으로 이미지를 다운로드 하고나서 컨테이너를 준비해 실행시키기 때문이다↩︎

  3. 2018-01-07 부로 그런 듯 싶다↩︎