하둡은 리눅스에서 설정하는 것이 사용하기에 편하기 때문에 우분투 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
위와 유사한 결과가 나와야 한다. 다음으로 네임 노드(파일시스템의 파일명과 디렉토리 정보를 가지고 있는 인스턴스)와 잡트랙커(분산 작업 스케줄러)가 잘 동작하는 지 확인하기 위해서 다음의 경로를 확인한다.
네임노드: 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/
이제 자바 단에서 이 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;
위의 내용을 지우게 되면 명시적으로 선언된 권한들에 따라서 인증이 수행되게 된다.
댓글