'Hadoop'에 해당하는 글 3건

R on Hadoop and Amazon EMR

R 2014.08.19 15:44

Amazon EMR은 R을 지원한다. 

AMI Versions 3.0.0 이상부터는 Hadoop과 함께 R 3.0.2버전이 함께 Includes되어 설치된다.

현재 R최신버전은 3.1.1이지만 R 3.0.2버전이면 거의 최신버전이라고 할 수 있다.


Amazon 서비스에서 R을 지원하기 때문에 EMR을 이용하여 R Script를 실행하는 방법을 알아보고자 한다.


우선 고려해야 될 사항을 나열해보면 아래와 같다.

첫째 AMI를 통해 설치되는 R버전이 내가 사용하고자 하는 R package에서 지원하는 버전대인지?

둘째 EMR Hadoop Cluster 세팅 시 R은 설치 되지만 R Package는 설치되지 않기 때문에 설치가 가는한지?


우선 첫번째 문제부터 살펴보면 R 3.0.2버전이면 거의 왠만한 R package는 사용가능하다. 

rdocumentation.org 에서 제공하는 R package rank내의 ggplot2, plyr등 모두 사용가능하며 이슈는 없다.

둘째로는 사용하고자 하는 R package가 설치가 가능한지인데 이 부분도 EMR에서는 Bootstrap Actions라는 기능이 있다. 해당 기능을 통해서 R package뿐만 아니라 기타 여러 패키지가 설치 가능하다.


그럼 이제 EMR에서 R Script를 실행하는 방법을 알아보자.


AMI version

위에서 언급한 바와 같이 3.0.0이상 가장 최신버전을 선택하도록 하자.


Bootstrap Actions

Bootstrap Custom Actions을 통해 R Script에서 사용할 package와 기타 필요한 패키지들을 설치할 수 있도록 해야 한다.

여기서는 R package 하나와 mysql을 설치하도록 지정했다.

아래와 같이 shell script파일을 생성한다.

 
#!/bin/bash
sudo yum -y install mysql mysql-server mysql-connector-odbc mysql-devel
wget http://cran.r-project.org/src/contrib/DBI_0.2-7.tar.gz
sudo R CMD INSTALL DBI_0.2-7.tar.gz

만약 설치되어야 하는 R package가 많다면  아래와 같이 RScript Install.package구문으로도 가능하다.

 
 sudo Rscript -e "install.packages(c('DBI', 'rJava', 'etc'),repos='http://ftp.heanet.ie/mirrors/cran.r-project.org/')"

mysql설치는 apt-get 명령어가 아닌 yum을 사용했다. AMI 3.x대 버전 이후 부터는 apt-get이 아닌 yum을 이용하여

필요한 패키지들을 설치할 수 있다. 해당 shell script를 S3내의 내 버킷공간에 저장해 둔다.


S3에 저장한 shell script를 S3 location에 Path를 지정한 후 Add해주면 Bootstrap Action설정은 모두 끝난다.


Steps

R Script 작성 시 맨 상단에 "#! /usr/bin/env Rscript" 해당 구문을 추가해주어야 한다.

추가하지 않으면 EMR에서 R Script를 해석하지 못한다.

#! /usr/bin/env Rscript
library(DBI, quietly=TRUE)
.....

실행할 R Script를 Bootstrap의 Shell script와 마찬가지로 S3내의 내 버컷공간에 저장해 둔다.

그리고 Streaming program을 선택 후 Step을 추가해주면 된다.



Mapper, Reduce에서 싫행될 R Script를 각각 지정 후 Input, Output 장소도 지정한다.

Output의 경우 Reduce에서 실행되는 R Script의 실행 결과물이 파일로 저장된다.



위와 같이 최종 설정 후 Create cluster를 생성하면 EMR내에서 R Script가 실행가능하다.



참고
http://www.joyofdata.de/blog/mapreduce-r-hadoop-amazon-emr/
https://forums.cascading.io/index.php?/topic/9-unable-to-run-emr-bootstrapscript/
http://mrjob.readthedocs.org/en/latest/guides/emr-bootstrap-cookbook.html#ami-2-x-and-ami-3-x-version-differences


저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

맵리듀스에서 리듀스 출력결과를 RDBMS로 저장 시 GC overhead limit exceeded Issue가 발생한다.

해당 Issue는 리듀스 출력결과가 즉 RDBMS로 저장되어야 하는 데이터가 많은 경우 발생하게 된다.


맵리듀스에서 RDBMS로 Insert하기 위해 org.apache.hadoop.mapreduce.lib.db.DBOutputFormat(링크)를 

사용한다. 해당 소스를 까보면 리듀스 출력결과로 Insert문자열을 생성하여 addBatch()로 보관 후 DB Connection이 close될때 executeBatch()가 실행되고 commit()이 실행된다. 즉 대량의 데이터가 한번에 Insert되는 것이다.

해당 Issue와 관련해서 Cloudera블로그에도 관련 글이 존재한다. (링크)


이 문제를 해결하기 위해 DBOutputFormat을 상속받아 삽질을 했으나 해결방법은 의외로 간단하다.


    public static final int batchSize = 5000;
    public static int count = 0;

    public static class DBOutputWritable implements Writable, DBWritable {
        String col1, col2;

        public DBOutputWritable(String col1, String col2) {
            this.col1 = col1;
            this.col2 = col2;
        }

        public void readFields(DataInput in) throws IOException {}

        public void readFields(ResultSet rs) throws SQLException {
            col1 = rs.getString(1);
            col2 = rs.getString(2);
        }

        public void write(DataOutput out) throws IOException {}

        public void write(PreparedStatement ps) throws SQLException {
            ps.setString(1,col1);
            ps.setString(2,col1);
            
            if(++count % batchSize == 0) {
                ps.executeBatch();
                count=0;
            }
           
        }
    }
DBOutputWritable에서 write메소드에서 데이터 단위를 나누어 주면된다. 

끝.


저작자 표시
신고

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

HBase local setting

nosql 2013.07.11 14:41

HBase의 간단한 명령어를 학습하기 위하여 HBase를 로컬에 세팅하는 방법이다.


우선 아파치 HBase 릴리즈 사이트에서 최신 HBase 파일을 내려받는다.(링크)


적당한 폴더에 압축을 풀면 OK!


$ tar -zxvf hbase-0.94.8.tar.gz 


압축해제한 디렉토리


이제 로컬에서 HDFS역할을 해줄 데이터 디렉토리를 설정해주어야 한다.

이를 위해 설정파일 conf/hbase-site.xml파일을 수정해준다.


$ vi conf/hbase-site.xml


아래구문을 configuration에 추가해준다.

<property>

      <name>hbase.rootdir</name>

      <value>file:///{yourpath}/hbase</value>

</property>

※ 체크포인트 : 쓰기권한


HBase 실행

$ bin/start-hbase.sh

starting master, logging to /opt/hbase-0.94.8/bin/../logs/hbase-root-master-pooh.out


HBase shell 접근

$ bin/hbase shell

HBase Shell; enter 'help<RETURN>' for list of supported commands.

Type "exit<RETURN>" to leave the HBase Shell

Version 0.94.8, r1485407, Wed May 22 20:53:13 UTC 2013


테이블 생성 시 아래와 같은 에러가 발생할 경우

hbase(main):002:0> create 'testtable', 'colfam1'

ERROR: org.apache.hadoop.hbase.PleaseHoldException: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing


HBase는 127.0.0.1를 사용하여 로컬 호스트에 연결할 수 없기 때문에 hosts 파일은 아래와 같이 편집해줘야 한다.

$ vi /etc/hosts


127.0.0.1       localhost

127.0.0.1       {user machine}

127.0.1.1       localhost

127.0.1.1       {user machine}


설정 후 HBase를 재시작한다.

아래는 HBase 재시작 후 컬럼패밀리를 하나 가진 테이블을 생성하였으며 에러없이 정상적으로 동작한다.

$ bin/stop-hbase.sh

stopping hbase....................................................................................

$ bin/start-hbase.sh

starting master, logging to /opt/hbase-0.94.8/bin/../logs/hbase-root-master-pooh.out

$ bin/hbase shell

HBase Shell; enter 'help<RETURN>' for list of supported commands.

Type "exit<RETURN>" to leave the HBase Shell

Version 0.94.8, r1485407, Wed May 22 20:53:13 UTC 2013

hbase(main):002:0> create 'testtable', 'colfam1'

0 row(s) in 1.1650 seconds


테이블 생성 후 데이터 디렉토리로 모습


참고 : HBase 완벽가이드

저작자 표시
신고

'nosql' 카테고리의 다른 글

HBase local setting  (0) 2013.07.11

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret