본문 바로가기
Bioinformatics/Technology

Hadoop 1.1.1 클러스터 설정 우분투 12.04(Precise) + JDK 7 + Hive 설치

by 임은천 2012. 12. 15.

하둡은 리눅스에서 설정하는 것이 사용하기에 편하기 때문에 우분투 12.04에서 설정하는 것으로 설명한다.


하둡 전용 계정과 그룹 생성


가장 먼저 할 것은 하둡 전용의 계정과 그룹을 만드는 것이다. 루트로 실행할 것을 가정하고 있다. 만약 루트가 아니라면 모든 명령 앞에 sudo를 붙여야 한다.


euncheonlim@localhost:~$ addgroup hadoop

euncheonlim@localhost:~$ adduser --ingroup hadoop hadoop



만약 이 계정이 루트 계정 권한 대행으로 동작하게 하려면 sudo 그룹에 추가해 준다.


euncheonlim@localhost:~$ adduser hadoop sudo


하둡에서 사용하는 SSH  연결 설정


다음으로 원격에 있는 노드에 접근하기 위해서 ssh와 rsync를 설치한다.


euncheonlim@localhost:~$ apt-get install ssh

euncheonlim@localhost:~$ apt-get install rsync


이제 localhost로 접속해보자.


euncheonlim@localhost:~$ ssh hadoop@localhost


아마도 암호를 물어보는 화면이 나올 것이다. 다음으로 공백의 암호를 가진 public key를 생성하여 Hadoop 스크립트를 통해서 자유롭게 localhost에 접속할 수 있도록 해야한다. 이것은 연결하려는 모든 노드에서 실행한다.


hadoop@localhost:~$ ssh-keygen -t rsa -P ""

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): <엔터>


hadoop@localhost:~$ cd ~/.ssh

hadoop@localhost:~/.ssh$ cat id_rsa.pub >> authorized_keys


슬레이브 노드가 있는 경우 다음과 같이 슬레이브 노드의 공개키들을 마스터 노드로 덧붙이기 한다. 즉, 마스터 노드의 authorized_key 파일에 덧붙이기가 된다.


hadoop@localhost:~$ ssh hadoop@slave1 'cat ~/.ssh/id_rsa.pub' >> ~/.ssh/authorized_keys

hadoop@localhost:~$ ssh hadoop@slave2 'cat ~/.ssh/id_rsa.pub' >> ~/.ssh/authorized_keys


다음으로 이렇게 모두 덧붙여진 상태의 authorized_keys 파일을 슬레이브 노드들로 복사해 준다. 또한 권한이 잘못 설정되면 연결이 안되기 때문에 권한 설정도 해준다.


hadoop@localhost:~$ scp authorized_keys hadoop@slave1:~/.ssh/authorized_keys

hadoop@localhost:~$ ssh hadoop@slave1 'chmod 700 ~/.ssh'

hadoop@localhost:~$ ssh hadoop@slave1 'chmod 600 ~/.ssh/authorized_keys'

hadoop@localhost:~$ scp authorized_keys hadoop@slave2:~/.ssh/authorized_keys 

hadoop@localhost:~$ ssh hadoop@slave2 'chmod 700 ~/.ssh'

hadoop@localhost:~$ ssh hadoop@slave2 'chmod 600 ~/.ssh/authorized_keys'


마찬가지로 마스터 노드에서도 ssh 폴더와 authorized_keys의 권한을 변경해 준다.


hadoop@localhost:~/.ssh$ chmod 600 authorized_keys

hadoop@localhost:~/.ssh$ cd ..

hadoop@localhost:~$ chmod 700 .ssh


혹시 필요하다면 ssh를 재시작한다.


hadoop@localhost:~$ /etc/init.d/ssh restart


하둡 설치 및 설정


이제 hadoop을 설치하자.


hadoop@localhost:~$ wget http://apache.mirror.iphh.net/hadoop/common/hadoop-1.1.1/hadoop-1.1.1.tar.gz


아니면 클라우데라 배포 버전을 받으려면

hadoop@localhost:~$ wget http://archive.cloudera.com/cdh/3/hadoop-latest.tar.gz


여기에서 하둡의 버전이나 미러에 따라서 다른 경로를 적어야 한다. 혹시 자바가 설치되어 있지 않다면 자바도 설치한다.


hadoop@localhost:~$ add-apt-repository ppa:webupd8team/java

hadoop@localhost:~$ apt-get update

hadoop@localhost:~$ apt-get install oracle-java7-installer


만약 설치가 안되면 수동으로 오라클 JDK 홈페이지에서 직접 파일을 다운로드 받는다.


hadoop@localhost:~$ tar -xzf hadoop-1.1.1.tar.gz

hadoop@localhost:~$ tar -xzf jdk-7-linux-x64.tar.gz

hadoop@localhost:~$ ln -s hadoop-1.1.1 hadoop

hadoop@localhost:~$ ln -s jdk1.7.0 java_home


파일명은 버전에 따라 조금씩 다를 수 있다. 이제 환경 설정을 한다.


hadoop@localhost:~$ vi .bashrc

export JAVA_HOME=$HOME/java_home

export HARDOOP_PREFIX=$HOME/hadoop

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin

:wq!<엔터>

hadoop@localhost:~$ source .bashrc

설정이 끝났으니 현재 환경에 설정을 적용한다.

hadoop@localhost:~$ cd hadoop/conf

hadoop@localhost:~/hadoop/conf$ vi hadoop-env.sh

export JAVA_HOME=/home/hadoop/java_home

:wq!<엔터>


이제 나머지 설정을 해보자.


hadoop@localhost:~/hadoop/conf$ vi core-site.xml

... (생략) ...

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/hadoop/hadoop/tmp</value>

</property>

</configuration>

:wq! <엔터>


hadoop@localhost:~/hadoop/conf$ vi hdfs-site.xml

... (생략) ...

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.name.dir</name>

<value>/home/hadoop/hadoop/work/name</value>

</property>

<property>

<name>dfs.name.edits.dir</name>

<value>${dfs.name.dir}</value>

</property>

<property>

<name>dfs.data.dir</name>

<value>/home/hadoop/hadoop/work/data</value>

</property>

</configuration>


hadoop@localhost:~/hadoop/conf$ vi mapred-site.xml


<configuration>

<property>

<name>mapred.job.tracker</name>

<value>localhost:9001</value>

</property>


<property>

<name>mapred.local.dir</name>

<value>${hadoop.tmp.dir}/mapred/local</value>

</property>


<property>

<name>mapred.system.dir</name>

<value>${hadoop.tmp.dir}/mapred/system</value>

</property>

</configuration>


이제 테스트를 해보자.


hadoop@localhost:~$ cd hadoop

hadoop@localhost:~/hadoop$ hadoop namenode -format

hadoop@localhost:~/hadoop$ start-all.sh

hadoop@localhost:~/hadoop$ dfs -mkdir input

hadoop@localhost:~/hadoop$ hadoop fs -put conf/* input

hadoop@localhost:~/hadoop$ hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
hadoop@localhost:~/hadoop$ hadoop fs -get output output
hadoop@localhost:~/hadoop$ cat output/*
1 dfsadmin


위와 유사한 결과가 나와야 한다. 다음으로 네임 노드(파일시스템의 파일명과 디렉토리 정보를 가지고 있는 인스턴스)와 잡트랙커(분산 작업 스케줄러)가 잘 동작하는 지 확인하기 위해서 다음의 경로를 확인한다.

네임노드: http://localhost:50070

잡트래커: http://localhost:50030


Hive 설치 및 설정


먼저 Hive를 다운로드 받는다.


wget http://apache.mirror.digionline.de/hive/hive-0.9.0/hive-0.9.0.tar.gz


또는 클라우데라 배포 버전을 다운받는다.


wget http://archive.cloudera.com/cdh/3/hive-latest.tar.gz


다음으로 Hive가 사용할 데이터베이스를 설치한다. 여기에서는 MySQL을 이용한다.


hadoop@localhost:~$ apt-get install mysql-server

hadoop@localhost:~$ wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz

hadoop@localhost:~$ tar -xf mysql-connector-java-5.1.22.tar.gz

hadoop@localhost:~$ cp mysql-connector-java-5.1.22/mysql-connector-java-5.1.22-bin.jar hive/lib/


root 암호는 적절한 것을 선택한다. 여기에서는 hadoop이라고 하겠다. 이제 mysql 서버로 접속을 한다. 결론적으로 해야 하는 것은 미리 준비된 SQL 스크립트를 실행하는 것과 이 metastore에 접근할 계정을 만드는 것이다. 그리고 해당 계정에 필요한 권한을 준다.

hadoop@localhost:~$ mysql -u root -p
Enter password: hadoop <엔터>
mysql> CREATE DATABASE hive;
mysql> use hive;
mysql> source /home/elim/hive/scripts/metastore/upgrade/mysql/hive-schema-0.7.0.mysql.sql
mysql> use mysql;
mysql> CREATE USER 'hiveuser'@'%' IDENTIFIED BY 'hadoophive';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON hive.* to 'hiveuser'@'%';
mysql> REVOKE ALTER, CREATE ON hive.* FROM 'hiveuser'@'%';
mysql> flush privileges;
mysql> exit

이제 자바 단에서 이 metastore에 접근하는데 이용된느 정보들을 hive 압축 해제한 곳의 conf/hive-site.xml 파일에 설정한다. 파일이 없다면 생성한다.


<property>

            <name>javax.jdo.option.ConnectionURL</name>

            <value>jdbc:mysql://localhost/hive</value>

    </property>

    <property>

            <name>javax.jdo.option.connectionDriverName</name>

            <value>com.mysql.jdbc.Driver</value>

    </property>

    <property>

            <name>javax.jdo.option.ConnectionUserName</name>

            <value>hiveuser</value>

    </property> 

    <property>

            <name>javax.jdo.option.ConnectionPassword</name>

            <value>hadoophive</value>

    </property>

    <property>

            <name>datanucleus.autoCreateSchema</name> 

            <value>false</value> 

    </property> 

    <property> 

            <name>datanucleus.fixedDatastore</name>

            <value>true</value> 

</property>


이제 hive에 접속해서 잘 동작하는 지 확인해 보자.


hadoop@localhost:~/hive$ bin/hive

CREATE TABLE TEST(t1 INT, t2 STRING);

SHOW TABLES;

ALTER TABLE TEST ADD COLUMNS (t3 STRING);

DESCRIBE TEST;

DROP TABLE TEST;


연결 관련된 오류가 날 수도 있다. 이 때 다양한 원인이 있을 수 있다. 살펴 봐야 하는 부분을 말하자면, hive-site.xml에서 정보가 틀렸는지 여부, /etc/hosts 파일에서 host들이 ip와 잘 매치 되었는지 여부, ConnnectorJ가 hive/lib에 있는지 여부, mysql의 테이블 중 mysql.user 테이블의 정보가 인증에 성공할 수 있도록 되어 있는지 여부 등이다. 가령 아래와 같은 문제가 발생한다고 하자.


FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user 'hiveuser'@'localhost' (using password: YES)


가령 이런 문제가 발생한 경우에는 mysql.user 테이블을 수정해야 한다.


mysql -uroot -p

DELETE FROM mysql.user WHERE Host='localhost' AND User='';

DELETE FROM mysql.user WHERE Host='실제 호스트 이름' AND User='';

FLUSH PRIVILEGES;


위의 내용을 지우게 되면 명시적으로 선언된 권한들에 따라서 인증이 수행되게 된다.



댓글