하둡 설치 오류 정리

길고 긴 설치였다.
이틀동안 하둡 설치하는데 시간을 다 썼다.
이 때까지 오류 나왔던 것들을 다시 한 번 정리하는 의미에서 글을 쓰겠다.
이 게시글은 설치 가이드가 아닌 오류를 정리하는 글이다.

우선 나의 하둡 설치 환경에 대해 설명하자면,
VirtualBox 에서 3개의 우분투 16.04버젼을 설치하고
컴퓨터의 이름은 hadoop1-VirtualBox hadoop2 hadoop3으로 하였다.


 첫번째로 만났던 고난은 리눅스의 계정 관리였다.
되도록이면 adduser을 통해 3개의 가상 머신에 hadoop이라는 계정을 만들어주는 걸 강력 추천한다.
그래야 나중에 혼동이 없고 configure 파일 수정할 때 편리하다.
hadoop@hadoop1-VirtualMachine $
위와 같이 써있으면 전자 hadoop은 계정이고 후자는 컴퓨터 이름이다.

 두번째는 ras_pub 이었다. 즉, ssh 연결할 때 비밀번호 없이 공개 키를 주어
접속할 수 있도록하는 방법이다.
hadoop@hadoop1에서 hadoop@hadoop2로 ssh 접속을 하기 위해
전자에서 후자로 공개 키를 복사해서 주었을 것이다.
책에서는 이렇게 하면 끝이라고 했지만
후자에서 전자로 또 공개 키를 복사해주는 것이 좋다고 한다.

 세번째는 네트워크 접속 거부이다.
여기서 엄청 애 먹었다.
iptables 나 netstat을 통해 이것저것 다 해봤다.
가장 효과적인 것은 gufw 를 apt-get install 해서 방화벽을 재설정했다.
나는 9000, 9001, 50070, 50090 포트를 모두 열어놨고
내부 네트워크에서 오는 접속은 모두 허용했다.
마지막으로 내가 생각하는 해결책은 /etc/hosts 에 있는 파일을 수정하는 것이다.
설치 가이드를 보면 이 파일을 수정하게 되는데 아래와 같이 되어 있었다.
127.0.0.1 localhost
127.0.1.1 hadoop1
두번째 있는 127.0.1.1 을 지우고 컴퓨터를 재부팅했더니 연결 거부가 사라졌다.
나중에 다시 쓸 거지만 jps 명령어를 쳤을때 네임노드에서 namenode 프로세스가 실행도지 않고 있었을 때 연결 거부라는 에러가 뜨기도 했다.

 네번째는 데이터 노드가 실행이 안되는 것이다.
데이터 노드에서 다른 프로세스들은 다 실행되는데 딱 데이터 노드 프로세스가 안된다.
네임노드가 알고 있는 namenode id와 데이터노드가 알고 잇는 namenode id가 서로 달라서 에러가 뜨는 것이다.

에러를 볼때는 로그파일을 보고 에러를 파악해야한다.
아래 데이터 노드를 시작하면서 로깅을 하기 때문에 경로를 잘 보고
따라가면 에러 뜨는 로그를 보고 구글링하면 왠만한 에러는 잡을 수 있다.


내가 구글링해서 찾은 해결책을 설명하겠다.
이 경우는 하둡이 실행되는 상황에서 네임노드 포맷을 해서 그렇다.
hadoop namenode -format
이라는 명령어는 네임 노드 설정할 때 처음에만 쓰는 것을 추천한다.
그렇다면 해결책은 tmp.dir 를 지우고 다시 포맷하는 것이다.

core-site.xml 파일은 아래와 같다.


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


hadoop.tmp.dir
/home/hadoop/hadoop-data/



위의 tmp.dir 로 설정되어 있는 hadoop-data 폴더를 모든 노드에서 다 지우고
hadoop namenode -format
명령어를 실행하는 것이다.

 다섯번째는 하둡 실행 예제인 wordcount였다.
이건 좀 어이가 없었지만 책을 자세히 읽지 못한 나의 불찰이었다.
./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount conf/hadoop-env.sh wordcount_output
을 이용해 wordcount를 하는 예제를 실행하는 것이었는데 
하둡이 conf/hadoop-env.sh 파일을 찾지 못하는 것이었다.
한참 헤매다가 책을 자세히 보니 위에 작게
./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh
을 먼저 실행하라는 문장을 보았다.
그렇다면 모든 과정이 에러 없이 진행된다면 명령어 순서는 아래와 같다.

1. cd hadoop-dir 하둡 디렉토리 이동
1.5 <첫 실행시 네임노드 포맷 -> ./bin/hadoop namenode -format >
2. ./bin/start-all.sh 모든 노드 실행
3. jps 명령어로 프로세스 확인하고
5444 Jps
5111 NameNode
5295 JobTracker
위와 같은 형식으로 나오면 작동될 것이다.
하지만 데이터 노드에 문제가 있으면 안된다.
4. ./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh
5. ./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount conf/hadoop-env.sh wordcount_output

설치 오류를 설명해놓은 블로그들은 파일을 공유하지 않고 설명해서
추상적인 느낌으로 내가 이것저것 해보았다.
이것저것하면서 많이 알아가긴 하지만 그래도 설치하는 이틀동안 
차라리 하둡 실행해서 공부했다면 더 많은 것을 배웠겟다.
그래서 다른 사람들은 그러지 않았으면하는 취지에서 파일을 올리겠다.

/etc/hosts 
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.0.23 hadoop1-VirtualBox
192.168.0.25 hadoop2
192.168.0.26 hadoop3

core-site.xml


fs.default.name
hdfs://hadoop1-VirtualBox:9000 -> 계정 이름이 아닌 /etc/hosts에 적은 네임노드 호스트를 적는 것이다.
hadoop.tmp.dir
/home/hadoop/hadoop-data/

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=/usr/local/java
export HADOOP_HOME=/home/hadoop/hadoop

# 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

# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
# export HADOOP_TASKTRACKER_OPTS=
# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
# export HADOOP_CLIENT_OPTS

# Extra ssh options.  Empty by default.
# export HADOOP_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR"

# Where log files are stored.  $HADOOP_HOME/logs by default.
# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs

# File naming remote slave hosts.  $HADOOP_HOME/conf/slaves by default.
# export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

# host:path where hadoop code should be rsync'd from.  Unset by default.
# export HADOOP_MASTER=master:/home/$USER/src/hadoop

# Seconds to sleep between slave commands.  Unset by default.  This
# can be useful in large clusters, where, e.g., slave rsyncs can
# otherwise arrive faster than the master can service them.
# export HADOOP_SLAVE_SLEEP=0.1

# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by 
#       the users that are going to run the hadoop daemons.  Otherwise there is
#       the potential for a symlink attack.
# export HADOOP_PID_DIR=/var/hadoop/pids

# A string representing this instance of hadoop. $USER by default.
# export HADOOP_IDENT_STRING=$USER

# The scheduling priority for daemon processes.  See 'man nice'.
# export HADOOP_NICENESS=10

export HADOOP_HOME_WARN_SUPPRESS="TRUE"

hdfs-site.cml


  dfs.replication
  2
  dfs.http.address
  hadoop1-VirtualBox:50070
  dfs.secondary.http.address
  hadoop2:50090

mapred-site.xml


mapred.job.tracker
hadoop1-VirtualBox:9001 

마지막으로 위와 같은 내용을 모든 노드들이 갖고 있어야한다는 것이다.
네임노드만 갖고 있으면 돌아가질 않는다.
네임노드와 데이터 노드들이 모두 위와 같은 동일한 설정을 갖고 있어야 한다.


위처럼 잘 실행되는 하둡을 설치해서 예제를 실행해보길 바란다. 

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First