이번 포스팅에서는 R로 Hive에 바로 접속(dbConnect)해서 바로 Hive 내의 데이터를 추출해서 R의 데이터 프레임으로 만드는 방법에 대해서 소개하겠습니다.

 

dbConnect 를 사용하지 않을 때와 사용할 때를 비교해보면 아무래도 dbConnect를 하는 것이 편합니다. 

 

그리고 혹시 R로 Hive table의 데이터를 사용해서 자동화하는 프로그램을 짰다고 할 경우 관리 측면에서도 직접 Hive에 연동해서 batch job 실행시키는 것이 관리 측면에서도 용이합니다.

 

------------------------------------------- 

[ R 따로, Hive 따로 사용할 경우 Hive에서 데이터 추출 및 R에서 사용하기 절차]

 

  1) Hive 로 데이터 처리/추출하여 text file, 또는 csv file 로 내리기

    => 2) R 에서 read.table() 혹은 read.csv() 함수로 데이터 불러오기

 -------------------------------------------

 

vs.

 

------------------------------------------- 

[ R로 Hive에 dbConnect 할 경우 Hive에서 데이터 추출 및 R에서 사용하기 절차 ]

 

  1) R에서 Hive Query로 직접 데이터 처리하여 R로 바로 data.frame으로 내리기 (끝!)
     (별도로 불러오기 필요 없음!)

-------------------------------------------

 

 

 

대신에 사용환경 설정해주는게 처음에 좀 번거로운게 있습니다. ^^;

한번 고생하고 나중에 두고 두고 편할 거냐, 아니면 당장의 수고스러움을 피하고 조금 불편한거 감수할거냐의 선택인데요, 이왕 이번 글 읽기 시작하셨으니 아래 설명 참고해서 R로 Hive 접근할 수 있는 환경 세팅해보심이 어떨런지요. 

 

차근차근 설명해보겠습니다.

 

 

(1) Java 최신 버전 설치하기

 

R로 Hive 연동해서 쓸 때 Java를 사용하므로 먼저 Java를 설치해야 합니다.  이미 Java를 설치했다고 하더라도 최신 버전이 아니면 에러가 나더라구요.

 

Java 설치 확인하는 방법은 cmd 창에서 아래 처럼 'where /R C:\ java.exe' 라고 입력했는데 '정보 : 제공된 패턴에 해당되는 파일을 찾지 못했습니다'라는 메시지가 뜨면 설치가 안되어 있는 겁니다.

 

 

 

설치를 하려면 아래의 링크된 주소로 접속해서 Java SE download 를 합니다.

 

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 

 

아래 그림이 화면에 나오면 Java DOWNLOAD 이미지 클릭하세요.

 

 

그러면 아래의 화면이 나오는데요, 각자의 OS, bit 체계 확인해서 본인의 것에 맞는거 다운로드 하시면 됩니다.   (참고로, 저는 window7 OS 64bix 운영체제에 R x64 3.3.1 version 사용하고 있습니다. )

 

중간에 ( ) Accept License Agreement 에 체크하고 다운로드 받으세요.

 

 

 

[참고 : Windows 운영체제 확인하는 방법]

 

(방법 1) 제어판 > 시스템  선택

(방법 20) 시작메뉴 오른쪽의) 컴퓨터 > (마우스 오른쪽 누르고) 속성 선택

 

하면 아래의 화면 나옵니다. 

 

 

 

 

jdk-8u101-windows-x64.exe 파일을 다운로드 완료하였다면 클릭해서 설치해주세요.

(계속'Next' 누르시면 됩니다)

 

 

 

C:\Program Files\Java\jre1.8.0_101  폴더에 Java가 설치되었을 겁니다.

cmd 창에서 확인해보니 잘 설치가 되었군요.

 

 

 

 

 

(2) 메모리 늘리기(increase heap size of rJava) : options(java.parameters = "-Xmx8g")

 

Java는 virtual machine을 사용하므로, 만약 메모리가 부족하면 'java.lang.OutOfMemoryError: Java heap space' 에러 메시지가 뜹니다. 

 

R에서는 default memory setting 값이 512 MB 입니다.  Hive에서 512 MB 넘는 파일 추출하기라도 하면 에러납니다.  메모리 문제를 피하기 위해서 아래처럼 options(java.parameters = "-Xmx4g" 라는 명령문으로 메모리를 4G 까지 쓸 수 있도록 설정해보겠습니다.

(만약 컴퓨터의 메모리가 빠방하다면 options(java.parameters = "-Xmx8g" 로 해서 8G 로 설정할 수도 있습니다)

 

> ##---------------------------- > ## R - Hive connect > ##---------------------------- > > # R: Increase heap size for rJava > # : assign 4 gigabytes of heap space to the Java environment > # (<-> default setting : 512 MB) > > options(java.parameters = "-Xmx4g" )

 

 

 

 

(3) rJava, RJDBC 패키지 설치 및 로딩 (rJava, RJDBC RJDBC package installation and loading)

 

RJDBC가 rJava에 의존적이므로 반드시 library(rJava)를 실행한 후에 library(RJDBC) 순서로 로딩을 해야 합니다.

 

> # rJava, RJDDB package installation and loading
> install.packages("rJava")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/rJava_0.9-8.zip'
Content type 'application/zip' length 713501 bytes (696 KB)
downloaded 696 KB

package ‘rJava’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\Administrator\AppData\Local\Temp\Rtmpc9SiL3\downloaded_packages

> install.packages("RJDBC") trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/RJDBC_0.2-5.zip' Content type 'application/zip' length 66405 bytes (64 KB) downloaded 64 KB package ‘RJDBC’ successfully unpacked and MD5 sums checked The downloaded binary packages are in C:\Users\Administrator\AppData\Local\Temp\Rtmpc9SiL3\downloaded_packages

> library(DBI)
> library(rJava) > library(RJDBC)

 

 

 

 

(4) R에 Hive Class Path, Dirver, dbConnect 설정

 

Hive/Hadoop Class Path, dbConnect 설정은 하둡 엔지니어에게 물어서 사용하시기 바랍니다.

(아래는 그냥 예시임...)

 

# setting class path

hive.class.path = list.files(path=c("/usr/lib/hive/lib"), pattern="jar", full.names=T);
hadoop.lib.path = list.files(path=c("/usr/lib/hadoop/lib"), pattern="jar", full.names=T);
hadoop.class.path = list.files(path=c("/usr/lib/hadoop"), pattern="jar", full.names=T); 
class.path = c(hive.class.path, hadoop.lib.path, hadoop.class.path);
.jinit(classpath = class.path)

 

# setting driver

drv <- JDBC("org.apache.hive.jdbc.HiveDriver")

 

# setting dbConnect : driver, ip, port, userID, password

conn <- dbConnect(drv, "jdbc:hive2://xxx/xxx", "userID", "password")

 

 

(* 주의 : dbConnect 할 때요, Hive 설치된 것이 jdbc:hive인지 jdbc:hive2 인지 확인해서 사용하세요.)

 

 

 

(5) R에서 Hive Query 날리기 : dbGetQuery()

 

 

# Hive Query

db_qry <- dbGetQuery(conn,
      "SELECT *
          FROM db.table
          WHERE ymd = '2016-09-03'
          LIMIT 100;")

 

db_qry # query result

 

 

 

이렇게 R에서 Hive로 Query를 날리면 R에 데이터 프레임(data.frame) 이 생성됩니다.

 

 

 

[참고] hive 2.0.1 설치 및 metastore 설정 =>  http://www.gooper.com/ss/bigdata/271507 

 

 


 

참고로, RPostgreSQL package를 사용해서 R로 PostgreSQL 사용하는 방법도 아래에 소개합니다.  

 

 

# installation and loading RPostgreSQL package

install.packages("RPostgreSQL")
library(RPostgreSQL)

 

# setting Driver : dbDriver()

drv <- dbDriver("PostgreSQL")

 

# setting dbConnect
con <- dbConnect(drv, dbname = "dbname",
                               host = "xx.xx.xxx.xx",
                               port = xxxx,
                               user = "userID",
                               password = "password")

 

# DB SQL Query

r_sql <- c("SELECT var1, sum(var2) as sum_var2
    FROM db.table
    WHERE var3 = 'xxx' AND var4 = 'xxx'
    GROUP BY var1
    ORDER BY var1;")

 

sql_result <- dbGetQuery(con, r_sql)

 

sql_result # query result

 

dbDisconnect(conn = con)

 

 

 


 

 

RMySQL package를 사용해서 R로 MySQL 접속해서 사용하는 방법은 아래와 같습니다. 

위의 RPostgreSQL과 비슷해요.

 

 

# install and loading RMySQL package

install.packages("RMySQL")
library(RMySQL)

 

# setting dbDriver, dbConnect()

drv <- dbDriver("MySQL")

con <- dbConnect(drv,
                 dbname = "dbname",
     user = "userID",
     host = "xx.xx.xxx.xx",
     port = xxxx,
     password = "password")

 

# MySQL query : dbGetQuery

r_sql <- c("SELECT var1, sum(var2) as sum_var2
    FROM db.table
    WHERE var3 = 'xxx' AND var4 = 'xxx'
    GROUP BY var1
    ORDER BY var1;")
 
test.table <- dbGetQuery(con, r_sql)

 

# disconnect MySQL DB : dbDisconnect()

dbDisconnect(conn = con)

 

 

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요.

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 궁금해 2016.10.31 14:30  댓글주소  수정/삭제  댓글쓰기

    위에서 r에서 hive연결시
    drv <- JDBC("org.apache.hive.jdbc.HiveDriver")

    이부분에서 Error in .jfindClass(as.character(driverClass)[1]) : class not found
    라고 나오는데 어떻게 처리해야하나요?

    • R Friend R_Friend 2016.10.31 15:47 신고  댓글주소  수정/삭제

      안녕하세요 궁금해님,

      저는 문의하신 에러를 겪어보지 못해서 정확한 해법은 잘 모르겠습니다.

      댓글로 남겨주신 에러메시지를 가지고 구글링을 해서 몇 개 찾아보니 "의존성이 있는 jar 파일들을 동일한 폴더에 압축해제해놔야 한다"가 해법인거 같습니다.

      아래에 구글링해서 찾은 글 하나 링크 걸어놓습니다. 아래 링크글의 댓글 답변 참고하세요.

      http://stackoverflow.com/questions/31109276/r-error-in-jfindclassas-characterdriverclass1-class-not-found

  2. marketer 2017.01.19 10:36  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 포스팅 잘 보고 있습니다.

    RMySQL패키지를 이용하여 쿼리를 조회하려하는데,
    MySQL데이터가 한글일 경우 R에서 깨지는 현상을 보이고 있습니다.

    이에 대한 해결책이 있을까요?

    감사합니다.