2010. 11. 29. 18:42

HDFS 설치의 가장 큰 어려움 (Bad connection to FS. command aborted.)

마스터 서버 1대 슬레이브 서버 3대 설정
제대로 다시 하둡 파일 시스템을 구성하면서 이전에 포스팅한 하둡 설치에 대한 한심함을 느꼈다.
공부를 하려고 하둡을 설치하는 자세가 아니라 그냥 설치만 되면 끝이라는 생각으로 하고 있었다는 것을 뒤늦게 느꼈다. 이런 얘기는 스스로에 대한 반성의 시간으로 남기고 내가 겪었던 가장 큰 어려움에 대해서 다루겠다.

hadoop-0.20.2 버젼을 설치 했다. OS 환경은 ubuntu9.10 버전

설정파일을 공개해보면

 -------------------------------------------------------------------------------------
[ core-site.xml ]
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
        <name>fs.default.name</name>
        <value>hdfs://masternode:9000</value>
</property>
</configuration>

=> 별거 없다. 기본적인 세팅이며, dfs master 가 될 주소만 set 했다.

[ hdfs-site.xml ]
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
        <name>dfs.name.dir</name>
        <value>/hadoop/dir/name_node</value>
</property>
<property>
        <name>dfs.data.dir</name>
        <value>/hadoop/dir/data_node</value>
</property>
<property>
        <name>dfs.block.size</name>
        <value>67108864</value>
</property>
</configuration>

=> 이역시 별거 없다. dfs의 namenode, datanode 에서 각각 저장되는 절대경로 지정이다.
    dfs.block.size 를 통해서 64M의 블록크기를 설정했다. (1024 * 1024 * 64 )

[ mapred-site.xml ]

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
        <name>mapred.job.tracker</name>
        <value>masternode:9001</value>
</property>
<property>
        <name>mapred.system.dir</name>
        <value>/hadoop/dir/system</value>
</property>
<property>
        <name>mapred.local.dir</name>
        <value>/hadoop/dir/local</value>
</property>
</configuration>

=> map & reduce 작업을 하면서 jobtracker 의 주소를 입력한후 경로 설정
-------------------------------------------------------------------------------------


보통 웹에서 제공되는 정보는 이정도 이다. 여기에 추가적으로 환경변수 HADOOP_PATH, JAVA_PATH 의 정보와 혹은 ssh-keygen 을 통한 서버와 클라이언트의 통신 방법

하지만, 내가 가장 어려웠던 점은 바로 hostname 이었다.

시스템이 커지게 되면서 설정 하나 바뀔때마다 master, slave의 모든 아이피를 수정하는 문제나 추가 시켜야 하는 수고로움을 덜기 위해서 클러스터 설정 과정에서 대부분 hosts 파일을 수정해서 domain 을 이용하게 된다

이때 문제가 발생하게 된다.

클러스터의 각 masternode 와 slavenode 들은 domain 으로 통신을 하지만 그 주소는 hostname 으로 변환되어 요청이 이루어 지게 된다. ( log 를 통해서 확인 가능)

결국 hostname 과 hosts 의 각 노드의 이름을 동일시 시켜주면 문제는 해결된다.
hostname과 hosts 는 각각 /etc/hostname, /etc/hosts 에서 수정가능하다.

위와 같은 문제가 발생시 오류 메시지는 다음과 같다.

 2010-03-10 01:01:23,521 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory /tmp/hadoop-root/dfs/name does not exist.
2010-03-10 01:01:23,522 ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:290)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:87)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:311)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:292)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:201)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:279)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:956)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:965)
2010-03-10 01:01:23,522 INFO org.apache.hadoop.ipc.Server: Stopping server on 9000
2010-03-10 01:01:23,524 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:290)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:87)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:311)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:292)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:201)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:279)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:956)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:965)

2010-03-10 01:01:23,527 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: ubuntu: ubuntu

hosts 파일에 있는 도메인과는 다른 갑자기 ubuntu 라는 호스트가 존재하지 않는 다는 메시지와 함께 디렉토리까지 찾을 수 없다는 메시지를 확인 할 수 있다.

결국
# hadoop dfs -ls 라는 command 라는 메시지의 아웃풋은
Bad connection to FS. command aborted.

라고 뜨는 것을 확인 할 수 있다.

namenode 포멧을 한 후에 지정 경로를 수정했을 때 발생하기도 하며 그때는 이전에 포스팅 한 자료대로
모든 hdfs-site 에서 설정한 경로의 파일을 삭제한 후 다시 namenode 를 포멧하면 되지만, 위와 같은 메시지에
가장큰 문제는 hostname 과 hosts 의 동기화 였다.

이 포스팅 자료를 통해 꼭 큰 한숨을 쉬며 다행이라는 한마디를 남기는 유저가 있었으면 좋겠다.