하둡설치 클러스터 구성 이렇게 치면 다양한 설치 방법이 나오는데요. 그거랑 제가 지금 쓰는거랑 틀리지 않습니다-_- 그 문서를 가지고 삽질했습니다. 저도 나중에 진짜 업무에서 클러스터 구성할 기회가 있을지도 모르니 문서화합니다. 그냥 참고만 하세요.

공식문서입니다.
http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html

아마 나중에는 2.x방식 대로 뭔가 바뀔 것 같은데, 현재 알파버전이 나왔습니다. 문서를 보면 뭔가 좀 틀리긴 합니다. 그건 또 나중에 삽질하기로 하고...
하둡 1.1.2버전 기준입니다.

서버를 3대로 했습니다. 운영체제는 ubuntu에서 했습니다.
namenode, jobtracker = 1대
secondarynamenode = 1대
datanode1 = 1대
그 외에 계속 datanode만 확장하면 됩니다.


1. 기본적으로 설치되어야할 것.

기본적으로 sshd, ssh, rsync가 설치되어야 함.
서로 접속이 가능하도록 키값 authorized_keys에 등록. 비밀번호 없이 모든 서버가 통신이 가능해야 합니다.


2. 서버를 알아보기 쉽게 하기 위해 /etc/hosts 수정

sudo vi /etc/hosts
192.168.0.1 namenode
192.168.0.2 secondarynode
192.168.0.3 datanode1
#192.168.0.4 datanode2
#192.168.0.5 datanode3

해당 아이피는 각각 서버 아이피를 입력하면 됩니다. 저는 가상머신이라.....


3. ssh-key값을 모든 서버가 비번없이 접속 가능하게 수정.

ssh localhost
ssh-keygen -t dsa -P '' ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

보면 키값을 만들고 자신에게 접속해도 비밀번호 묻지 않게 authorized_keys에 공개키를 추가하는 과정입니다.
그리고 나서 이 키값을 모든 서버에 동일하게 넣습니다. 그러면 모든 서버가 비밀번호 없이 접속할 수 있습니다.
손쉽게 rsync를 이용해서 넣으세요. 처음에는 비밀번호 물어볼겁니다. 대신 넣고 나서는 잘 될겁니다.

rsync -avz ~/.ssh/ mudchobo@secondarynode:~/.ssh/
rsync -avz ~/.ssh/ mudchobo@datanode1:~/.ssh/

그리고 다 접속한번 해보고 known_hosts에 등록이 되어야 합니다. 안그러면 hadoop이 서로 접속할 때 ssh로 접속하는데 yes/no 뜨는 거
The authenticity of host '~~~' can't be established.
RSA key fingerprint is 8e:52:c0:a7:1f:d8:4f:b5:5b:c3:05:f2:76:85:ab:65.
Are you sure you want to continue connecting (yes/no)?
요런거 뜨는데, 그래서 무슨 서로 연결이 안되어서 에러나요. 그래서 한번씩 접속해줘야 합니다. 모든 서버에서 다 해줘야함. 이것때문에 고생함ㅠ

ssh namenode
ssh secondarynode
ssh datanode1


4. 하둡은 자바기반이라 java설치


우분투라 저는 간단하게 아래명령어로 설치했습니다. 모든서버에 다 설치합니다.

sudo apt-get install openjdk-7-jdk


5. 하둡다운로드 및 압축풀기

namenode서버에서만 일단 다운로드 및 셋팅합니다. 나중에 다른 서버는 rsync로 그냥 동기화 시켜버릴겁니다.

wget http://apache.tt.co.kr/hadoop/common/hadoop-1.1.2/hadoop-1.1.2.tar.gz
tar xvf hadoop-1.1.2.tar.gz


6. 하둡설정 core-site.xml, hdfs-site.xml, mapred-site.xml

최소 필요설정만 할겁니다. 나머지 디폴트값은 src/core, src/hdfs, src/mapred에 있습니다. 대부분 자기 업무에 맞게 최적화하면 되는데, 옵션이....많군요....ㄷㄷ

core-site.xml

보면 hdfs:// 으로 시작해야 합니다. 그리고 namenode는 아이피로 써도 됩니다. 결국 호스트와 포트설정임.

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


hdfs-site.xml

namenode저장 경로랑 datanode저장 경로 지정합니다. 아무곳이나 원하는 곳을 설정하세요.

<configuration>
        <property>
                <name>dfs.name.dir</name>
                <value>/home/mudchobo/hdfs/name</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>/home/mudchobo/hdfs/data</value>
        </property>
</configuration>


mapred-site.xml

맵리듀스 관련해서 설정하는 겁니다. jobtracker를 어디다가 놓을지 설정하는데, 보통 namenode랑 같이 놓는 것 같은데, 일부 서버 따로 빼서 놓는다는 사람도 있는 것 같아요. 뭐 잘 몰라서 일단 저는 namenode서버에 설정합니다. 그리고, local.dir system.dir설정합니다. 뭐하는 디렉토리인지는 잘 모르겠어요.

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>namenode:9001</value>
        </property>
        <property>
                <name>mapred.local.dir</name>
                <value>/home/mudchobo/hdfs/mapred</value>
        </property>
        <property>
                <name>mapred.system.dir</name>
                <value>/home/mudchobo/hdfs/mapred</value>
        </property>
</configuration>


conf/hadoop-env.sh

여기에 JAVA_HOME 환경변수를 추가해줘야 해요. 전역으로 되어있다면 안해도 되는데 혹시 모르니...
우분투 oepnjdk-7-jdk로 설치한 경우 JAVA_HOME은 /usr/lib/jvm/java-7-openjdk-amd64

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64


conf/master

여기 서버리스트는 secondary namenode서버목록을 넣습니다. 아이피로 써도 되고 네임호스트로 써도 됩니다.

secondarynode


conf/slaves

여기 서버리스트는 datanode를 넣습니다. 아이피로 써도 되고 네임호스트로 써도 됩니다. 나중에 확장할 때 datanode서버만 추가해주면 손쉽게 확장을 할 수 있습니다.

datanode1



7. rsync로 secondary namenode서버와 datanode서버에 하둡 복사

rsync로 그냥 복사해버립니다.

rsync -avz ~/hadoop-1.1.2/ mudchobo@secondarynode:~/hadoop-1.1.2/
rsync -avz ~/hadoop-1.1.2/ mudchobo@datanode1:~/hadoop-1.1.2/


8. 데몬 구동 실행

하둡홈/bin/start-all.sh 이라는 스크립트가 있는데, 이게 이제 위에 설정대로 구동하게 됩니다. namenode, jobtracker, secondarynamenode, datanode들을 띄우게 되는데, 설정대로 라면 namenode와 jobtracker는 namenode호스트로 9000, 9001로 뜨게 되고, secondarynamenode는 masters목록에서 띄우고, datanode는 slaves목록에 있는 것을 띄우게 됩니다. 그러니 다 각각 서버에 같은 디렉토리와 셋팅이 있으면 됩니다. 7번에서 rsync로 맞췄기 때문에 다 같은 환경설정입니다.

시작하기전에 namenode를 포맷하고 시작해야해요.

bin/hadoop namenode -format


시작 스크립트를 수행합니다.

mudchobo@ubuntu1:~/hadoop-1.1.2$ bin/start-all.sh
starting namenode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-namenode-ubuntu1.out
datanode1: starting datanode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-datanode-ubuntu3.out
secondarynode: starting secondarynamenode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-secondarynamenode-ubuntu2.out
starting jobtracker, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-jobtracker-ubuntu1.out
datanode1: starting tasktracker, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-tasktracker-ubuntu3.out
mudchobo@ubuntu1:~/hadoop-1.1.2$

jps 라는 명령어가 있는데 java에서 지원하는 건데, java로 실행하고 있는 프로세스 목록을 보여주는 것이에요. 그래서 각각 서버 들어가서 데몬이 잘 떠있는지 확인해봐야해요.

namenode 서버

mudchobo@ubuntu1:~/hadoop-1.1.2$ jps
26206 NameNode
26498 Jps
26383 JobTracker
mudchobo@ubuntu1:~/hadoop-1.1.2$

secondarynamenode 서버

mudchobo@ubuntu2:~$ jps
10704 Jps
10434 SecondaryNameNode
mudchobo@ubuntu2:~$

datanode1 서버

mudchobo@ubuntu3:~$ jps
17049 TaskTracker
16827 DataNode
17347 Jps
mudchobo@ubuntu3:~$


9. 초간단 MapReduce 예제 실행

다 잘 떠있으니 예제를 돌려보면요. 기본 문서에 나와있는 예제를 돌려봅시다.
conf파일을 hdfs에 put하고 거기서 dfs문자를 찾아서 grep하는 예제입니다.

mudchobo@ubuntu1:~/hadoop-1.1.2$ bin/hadoop fs -put conf input
mudchobo@ubuntu1:~/hadoop-1.1.2$ bin/hadoop fs -ls
Found 1 items
drwxr-xr-x   - mudchobo supergroup          0 2013-07-02 18:35 /user/mudchobo/input
mudchobo@ubuntu1:~/hadoop-1.1.2$ bin/hadoop jar hadoop-examples-1.1.2.jar grep input output 'dfs[a-z.]+'
13/07/02 18:36:26 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/07/02 18:36:26 WARN snappy.LoadSnappy: Snappy native library not loaded
13/07/02 18:36:26 INFO mapred.FileInputFormat: Total input paths to process : 16
13/07/02 18:36:26 INFO mapred.JobClient: Running job: job_201307021835_0001
13/07/02 18:36:27 INFO mapred.JobClient:  map 0% reduce 0%
13/07/02 18:36:35 INFO mapred.JobClient:  map 12% reduce 0%
13/07/02 18:36:41 INFO mapred.JobClient:  map 25% reduce 0%
13/07/02 18:36:46 INFO mapred.JobClient:  map 37% reduce 0%
13/07/02 18:36:51 INFO mapred.JobClient:  map 50% reduce 0%
13/07/02 18:36:53 INFO mapred.JobClient:  map 50% reduce 16%
13/07/02 18:36:56 INFO mapred.JobClient:  map 62% reduce 16%
13/07/02 18:37:00 INFO mapred.JobClient:  map 68% reduce 16%
13/07/02 18:37:01 INFO mapred.JobClient:  map 75% reduce 16%
13/07/02 18:37:02 INFO mapred.JobClient:  map 75% reduce 20%
13/07/02 18:37:05 INFO mapred.JobClient:  map 75% reduce 25%
13/07/02 18:37:06 INFO mapred.JobClient:  map 87% reduce 25%
13/07/02 18:37:11 INFO mapred.JobClient:  map 100% reduce 29%
13/07/02 18:37:15 INFO mapred.JobClient:  map 100% reduce 100%
13/07/02 18:37:16 INFO mapred.JobClient: Job complete: job_201307021835_0001
13/07/02 18:37:16 INFO mapred.JobClient: Counters: 30
13/07/02 18:37:16 INFO mapred.JobClient:   Job Counters
13/07/02 18:37:16 INFO mapred.JobClient:     Launched reduce tasks=1
13/07/02 18:37:16 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=82690
13/07/02 18:37:16 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/07/02 18:37:16 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/07/02 18:37:16 INFO mapred.JobClient:     Launched map tasks=16
13/07/02 18:37:16 INFO mapred.JobClient:     Data-local map tasks=16
13/07/02 18:37:16 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=40275
13/07/02 18:37:16 INFO mapred.JobClient:   File Input Format Counters
13/07/02 18:37:16 INFO mapred.JobClient:     Bytes Read=27225
13/07/02 18:37:16 INFO mapred.JobClient:   File Output Format Counters
13/07/02 18:37:16 INFO mapred.JobClient:     Bytes Written=206
13/07/02 18:37:16 INFO mapred.JobClient:   FileSystemCounters
13/07/02 18:37:16 INFO mapred.JobClient:     FILE_BYTES_READ=102
13/07/02 18:37:16 INFO mapred.JobClient:     HDFS_BYTES_READ=28995
13/07/02 18:37:16 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=871542
13/07/02 18:37:16 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=206
13/07/02 18:37:16 INFO mapred.JobClient:   Map-Reduce Framework
13/07/02 18:37:16 INFO mapred.JobClient:     Map output materialized bytes=192
13/07/02 18:37:16 INFO mapred.JobClient:     Map input records=771
13/07/02 18:37:16 INFO mapred.JobClient:     Reduce shuffle bytes=192
13/07/02 18:37:16 INFO mapred.JobClient:     Spilled Records=8
13/07/02 18:37:16 INFO mapred.JobClient:     Map output bytes=88
13/07/02 18:37:16 INFO mapred.JobClient:     Total committed heap usage (bytes)=3252924416
13/07/02 18:37:16 INFO mapred.JobClient:     CPU time spent (ms)=4080
13/07/02 18:37:16 INFO mapred.JobClient:     Map input bytes=27225
13/07/02 18:37:16 INFO mapred.JobClient:     SPLIT_RAW_BYTES=1770
13/07/02 18:37:16 INFO mapred.JobClient:     Combine input records=4
13/07/02 18:37:16 INFO mapred.JobClient:     Reduce input records=4
13/07/02 18:37:16 INFO mapred.JobClient:     Reduce input groups=4
13/07/02 18:37:16 INFO mapred.JobClient:     Combine output records=4
13/07/02 18:37:16 INFO mapred.JobClient:     Physical memory (bytes) snapshot=2754953216
13/07/02 18:37:16 INFO mapred.JobClient:     Reduce output records=4
13/07/02 18:37:16 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=12783337472
13/07/02 18:37:16 INFO mapred.JobClient:     Map output records=4
13/07/02 18:37:16 INFO mapred.FileInputFormat: Total input paths to process : 1
13/07/02 18:37:16 INFO mapred.JobClient: Running job: job_201307021835_0002
13/07/02 18:37:17 INFO mapred.JobClient:  map 0% reduce 0%
13/07/02 18:37:23 INFO mapred.JobClient:  map 100% reduce 0%
13/07/02 18:37:31 INFO mapred.JobClient:  map 100% reduce 33%
13/07/02 18:37:33 INFO mapred.JobClient:  map 100% reduce 100%
13/07/02 18:37:34 INFO mapred.JobClient: Job complete: job_201307021835_0002
13/07/02 18:37:34 INFO mapred.JobClient: Counters: 30
13/07/02 18:37:34 INFO mapred.JobClient:   Job Counters
13/07/02 18:37:34 INFO mapred.JobClient:     Launched reduce tasks=1
13/07/02 18:37:34 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=5959
13/07/02 18:37:34 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/07/02 18:37:34 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/07/02 18:37:34 INFO mapred.JobClient:     Launched map tasks=1
13/07/02 18:37:34 INFO mapred.JobClient:     Data-local map tasks=1
13/07/02 18:37:34 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=9109
13/07/02 18:37:34 INFO mapred.JobClient:   File Input Format Counters
13/07/02 18:37:34 INFO mapred.JobClient:     Bytes Read=206
13/07/02 18:37:34 INFO mapred.JobClient:   File Output Format Counters
13/07/02 18:37:34 INFO mapred.JobClient:     Bytes Written=64
13/07/02 18:37:34 INFO mapred.JobClient:   FileSystemCounters
13/07/02 18:37:34 INFO mapred.JobClient:     FILE_BYTES_READ=102
13/07/02 18:37:34 INFO mapred.JobClient:     HDFS_BYTES_READ=324
13/07/02 18:37:34 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=100996
13/07/02 18:37:34 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=64
13/07/02 18:37:34 INFO mapred.JobClient:   Map-Reduce Framework
13/07/02 18:37:34 INFO mapred.JobClient:     Map output materialized bytes=102
13/07/02 18:37:34 INFO mapred.JobClient:     Map input records=4
13/07/02 18:37:34 INFO mapred.JobClient:     Reduce shuffle bytes=102
13/07/02 18:37:34 INFO mapred.JobClient:     Spilled Records=8
13/07/02 18:37:34 INFO mapred.JobClient:     Map output bytes=88
13/07/02 18:37:34 INFO mapred.JobClient:     Total committed heap usage (bytes)=211382272
13/07/02 18:37:34 INFO mapred.JobClient:     CPU time spent (ms)=710
13/07/02 18:37:34 INFO mapred.JobClient:     Map input bytes=120
13/07/02 18:37:34 INFO mapred.JobClient:     SPLIT_RAW_BYTES=118
13/07/02 18:37:34 INFO mapred.JobClient:     Combine input records=0
13/07/02 18:37:34 INFO mapred.JobClient:     Reduce input records=4
13/07/02 18:37:34 INFO mapred.JobClient:     Reduce input groups=1
13/07/02 18:37:34 INFO mapred.JobClient:     Combine output records=0
13/07/02 18:37:34 INFO mapred.JobClient:     Physical memory (bytes) snapshot=236998656
13/07/02 18:37:34 INFO mapred.JobClient:     Reduce output records=4
13/07/02 18:37:34 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1511505920
13/07/02 18:37:34 INFO mapred.JobClient:     Map output records=4
mudchobo@ubuntu1:~/hadoop-1.1.2$ bin/hadoop fs -cat output/*
1       dfs.data.dir
1       dfs.name.dir
1       dfs.server.namenode.
1       dfsadmin
cat: File does not exist: /user/mudchobo/output/_logs
mudchobo@ubuntu1:~/hadoop-1.1.2$

dfs로 시작하는거 4개를 찾았네요. 간단히 하둡위에서 돌아가는 맵리듀스 예제였음 ㅇㅇ


 
Posted by 머드초보

댓글을 달아 주세요