GenericOptionsParser 활용(ToolRunner)

Command Line에서 Hadoop job을 실행할 때, 아래와 같은 경고 메세지를 자주 본다면 GenericOptionsParser를 활용해 보는 것을 고려해보는 것이 좋다.


WARN mapreduce.JobSubmitter: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.


GenericOptionsParser는 아래와 같은 Hadoop framework에서 사용되는 option을 분석해서 처리해준다. (Configuration에 세팅)


 Option

 Description

 -conf <configuration file>

 specify a configuration file

 -D <property=value>

 use value for given property

 -fs <local|namenode:port>

 specify a namenode

 -jt <local|jobtracker:port> 

specify a job tracker 

 -files <comma separated list of files>

 specify comma separated files to be copied to the map reduce cluster

 -libjars <comma separated list of jars>

specify comma separated jar files to include in the classpath. 

 -archives <comma separated list of archives>

specify comma separated archives to be unarchived on the compute machines. 



아래 GenericOptionsParser 사용 예를 보자.


public static void main(String[] args) {
    Configuration conf = new Configuration();
    GenericOptionsParser optionParser = new GenericOptionsParser(conf, args);

    String[] remainingArgs = parser.getRemainingArgs();
}


생성자에 Configuration과 args를 파라메터로 넘겨주면 위에서 설명한 옵션을 세팅해 주고, 나머지 argument를 getRemainingArgs 메소드로 받을 수 있다. 


하지만 GenericOptionsParser를 직접 사용하는 것보다는 ToolRunner를 사용해서 자동으로 설정하게 끔 하는 것이 더 좋다.


public class ConfigurationPrinter extends Configured implements Tool {
  
    @Override
    public int run(String[] args) throws Exception {
        Configuration conf = getConf();
        for (Entry entry: conf) {
            System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
        }
        return 0;
    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
        System.exit(exitCode);
    }
}


ToolRunner.run 메소드로 ConfigurationPrinter 클래스를 실행하는 예제이다. ToolRunner.run 메소드를 사용하려면 Configured 를 상속받고 Tool 을 implements 해야 한다.


특히 -conf 옵션이나 -D 옵션은 파라메터를 설정할 때 편리하게 사용할 수 있다.


% hadoop ConfigurationPrinter -D color=yellow | grep color

color=yellow


위와 같이 실행 했을 때, 별도의 parsing 하는 작업 없이 color=yellow라는 값을 Configuration에 설정할 수 있다.



관련글

2009/09/04 - [Programming/hadoop] - Hadoop 실행시 jar 파일 추가하기


[MAC] 맥에서 하둡 설치 (Hadoop Single node Setup on OS X Mountain Lion)

맥에서 Hadoop을 설치하는 방법입니다. 설치 환경은 아래와 같습니다.

  • OS X 10.8.3
  • Java 1.7.0_17
  • Hadoop 1.0.4


설치 과정은 아래와 같은 단계를 거칩니다.

  • 설치 준비
    • hadoop 계정 생성
    • Java 설치
    • SSH 설치
  • 설치 및 설정
    • hadoop 설치
    • hadoop 설정 



설치 준비 


hadoop 계정 생성


꼭 필요한 과정은 아니지만 보안상의 이유로 hadoop을 위한 별도 계정을 만드는 것이 좋습니다.

전체 이름: Hadoop

계정 이름: hadoop


시스템 환경설정 > 사용자 및 그룹에서 사용자 계정을 추가합니다.




이제 생성한 hadoop 계정으로 로그인 합니다.



Java 설치


$ java -version


터미널에서 위와 같이 입력합니다.


java version "1.7.0_17"

Java(TM) SE Runtime Environment (build 1.7.0_17-b02)

Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)


Hadoop을 사용하기 위해서는 java 1.6 이상의 버전이 설치되어 있어야 합니다.

혹시 자바가 설치되어 있지 않거나 버전이 1.6 미만이면 아래 사이트를 통해 자바를 설치합니다.


http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jdk.html




SSH 설치


이번 단계에서는 SSH를 통해 local 머신에 접속을 할 수 있도록 하고 접속하되 password를 입력하지 않도록 해야합니다.


시스템 환경설정 > 공유를 선택합니다.



왼쪽에 원격 로그인에 체크를 하면 원격 로그인이 켜집니다. 보안상 새로 추가한 hadoop 계정만 접근을 허용하는 것이 좋습니다.


$ ssh localhost


위와 같이 입력해서 접속이 되는지 확인합니다.


The authenticity of host 'localhost (127.0.0.1) stablished.

RSA key fingerprint is 67:ef:a4:e1:38:51:64:0f:2f:f8:d5:bc:72:b9:4f:a0.

Are you sure you want to continue connecting (yes/no)? 


처음 접속하면 위와 같은 메세지가 나오는데 yes 을 입력하면 다음부터는 이 메세지가 출력되지 않습니다.

그런데 아직까지는 ssh 접속할때 패스워드를 입력을 해야합니다. hadoop은 내부적으로 ssh로 통신하므로 패스워드 입력없이 ssh 접속이 가능하도록 설정해야 합니다.


$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa


위와 같이 입력해서 키를 생성합니다. 중간에 입력을 해야 하는 항목이 나오면 그냥 엔터키를 누르면 됩니다.


The key's randomart image is:

+--[ DSA 1024]----+

|                 |

|           .     |

|      .   . .    |

|     + + o .     |

|    o + S +      |

| . o o + = .     |

|  + o o +        |

|  .oEo o         |

|   ++ .          |

+-----------------+


재미있는 그림도 나오네요 :)


$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys


키를 생성하면 ~/.ssh 디렉토리에 파일이 생기는데 위와 같이 입력하여 이 키 파일을 같은 디렉토리에 있는 authorized_keys 파일에 추가해 줍니다.


$ ssh localhost


자, 이제 다시 ssh 접속을 해서 패스워드 입력없이 접속이 되면 성공입니다~




설치 및 설정



다운로드 및 설치


설치는 간단합니다. 아래 사이트에 접속해서 파일을 다운 받습니다.


[Hadoop Releases]



Hadoop 버전이 여러가지가 있는데 간단하게 언급하면

  • 1.0.x - 현재 안정된 버전
  • 1.1.x - 베타 버전
  • 2.x.x - 알파 버전
  • 0.23.x - 2.x.x 버전과 유사하나 namenode 이중화 구성이 빠짐
  • 0.22.x - security 기능 제외
  • 0.20.203.x - 안정된 버전(구버전)
  • 0.20.x - 구버전


여기서는 1.0.4 버전으로 설치할 것입니다.

적당한 디렉토리에 다운받은 파일의 압축을 풉니다.


$ tar -xzvf hadoop-*.tar.gz


이것으로 설치는 끝입니다 :)

설치가 잘 됐는지 확인해 볼까요?




Hadoop 설정


hadoop cluster를 시작하기 위한 준비 작업으로 hadoop 홈 디렉토리 하위에 conf/hadoop-env.sh 파일을 수정해야 합니다.


  • Java Home 설정
    hadoop-env.sh 파일에서 JAVA_HOME 설정부분에 주석(#)을 제거하고 /Library/Java/Home (또는 /System/Library/Frameworks/JavaVM.framework/Home)를 입력합니다.
    혹시 자바를 다른 디렉토리에 설치했으면 자바를 설치한 디렉토리를 적어주면 됩니다.
      export JAVA_HOME=/Library/Java/Home

  • OS X용 환경변수 추가
    이 부분 때문에 좀 고생을 했는데, 아래와 같은 내용을 추가해줍니다. (참조: https://issues.apache.org/jira/browse/HADOOP-7489)

      export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

  • 아래는 hadoop-env.sh 파일의 예입니다.


    # Set Hadoop-specific environment variables here.
    
    # The only required environment variable is JAVA_HOME.  All others are
    # optional.  When running a distributed configuration it is best to
    # set JAVA_HOME in this file, so that it is correctly defined on
    # remote nodes.
    
    # The java implementation to use.  Required.
    export JAVA_HOME=/Library/Java/Home
    
    # Extra Java CLASSPATH elements.  Optional.
    # export HADOOP_CLASSPATH=
    
    # The maximum amount of heap to use, in MB. Default is 1000.
    export HADOOP_HEAPSIZE=2000
    
    # Extra Java runtime options.  Empty by default.
    # export HADOOP_OPTS=-server
    export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"
    


    여기까지 했으면 hadoop이 잘 돌아가는지 테스트 해 볼 수 있습니다.


    $ bin/hadoop


    위와 같이 입력했을 때, hadoop 실행 방법이 출력되면 정상입니다.



    이제 본격적으로 설정을 해 볼텐데요, Hadoop은 3가지 모드를 지원합니다.

    • Standalone mode (Local mode)
    • Pseudo-Distributed mode
    • Fully-Distributed mode


    Standalone mode


    기본 설정입니다. 모든 hadoop daemon이 하나의 java process로 실행됩니다. 

    처음 hadoop-env.sh 파일 수정한 것 외에는 별도 수정할 필요 없이 바로 hadoop을 실행하면 됩니다. local mode 라고도 불리는 것처럼 HDFS에 파일을 올릴 필요없이 local 파일을 바로 access 해서 출력도 local에 생성됩니다. 디버깅할 때 편리합니다.


    Standalone으로 실행해 보려면 아래와 같이 입력합니다.


    $ mkdir input 

    $ cp conf/*.xml input 

    $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 

    $ cat output/*




    Pseudo-Distributed mode


    Standalone mode와는 달리 Hadoop daemon들이 각각 별도의 java process로 실행되는데 하나의 node로 실행되는 형태입니다. input 파일은 HDFS 상에 있어야 하고 output 파일도 HDFS에 생성됩니다.


    conf/core-site.xml:


    
         
             fs.default.name
             hdfs://localhost:9000
         
    
    


    conf/hdfs-site.xml:

    
         
             dfs.replication
             1
         
    
    


    conf/mapred-site.xml:

    
         
             mapred.job.tracker
             localhost:9001
         
    
    


    위와 같이 설정 파일을 입력했으면 hadoop을 실행해 보기 전에 HDFS를 포맷해야 합니다.

    $ bin/hadoop namenode -format



    다음은 hadoop daemon을 실행시키는 명령입니다.


    $ bin/start-all.sh



    hadoop을 실행 시켰으면 log를 보면서 제대로 기동이 됐는지 확인합니다. log 디렉토리는 기본적으로 ${HADOOP_HOME}/logs 입니다.


    그 다음 hadoop에서 web interface로 제공하는 NameNode와 JobTracker에 접속해 봅니다.


    여기까지 잘 됐다면 위 Standalone mode에서 했던 예제를 해볼까요?


    $ bin/hadoop fs -put conf input


    hadoop의 conf 디렉토리를 HDFS 에 input 위치에 올리는 명령입니다.


    예제 실행은 아래와 같이 합니다.


    $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'



    똑같이 결과가 output 디렉토리에 생기는데 Standalone mode와는 다르게 local이 아니고 HDFS상입니다. 결과를 확인해 보려면


    $ bin/hadoop fs -get output output 

    $ cat output/*


    위와 같이 HDFS의 output을 local의 output으로 내려받아서 확인해 보거나


    $ bin/hadoop fs -cat output/*


    HDFS상의 파일을 바로 확인할 수도 있습니다.



    마지막으로 hadoop daemon을 종료하려면 아래와 같이 입력합니다.


    $ bin/stop-all.sh



    Fully-Distributed mode는 여기서 다루지 않겠습니다~


    'framework > hadoop' 카테고리의 다른 글

    GenericOptionsParser 활용(ToolRunner)  (0) 2013.08.02
    Hadoop 실행시 jar 파일 추가하기  (0) 2009.09.04

    Hadoop 실행시 jar 파일 추가하기

    Hadoop 명령 중에 jar 명령을 쓰면 jar 파일로 만든 Map Reduce 프로그램을 실행시킬 수 있다.

    Usage: hadoop jar <jar> [mainClass] args...

    실행시키고자 jar 패키지가 다른 jar 파일을 참조한다면 -libjars 옵션을 쓰면 된다.
    -libjars <comma seperated list of jars>

    물론 실행하려는 jar 파일에 몽땅 때려넣고 실행 시켜도 되지만, 여러 패키지에서 참조하는 jar라면 따로 분리해서 관리하는 것이 편리할 때도 있다.

    그런데 -libjars 옵션을 줘도 하둡 실행시 참조하는 파일을 인식못하는 경우가 발생했는데 클래스패스(HADOOP_CLASSPATH)를 지정 해서 해결했다.

    Wordcount 로 예를 들면,
    HADOOP_CLASSPATH=mylib.jar hadoop jar hadoop-examples.jar wordcount -libjars mylib.jar input output