Category Posts Navigation

우분투(Ubuntu) Hadoop 설치법 (Single-Node Cluster)

Posted by 사르기스 on

Last updated on 1월 26, 2013

이 글은 우분투 12.04 LTS, 12.10, 하둡 1.0.4 기준으로 작성하였다.

 

하둡은 세가지 모드로 구분된다.

  1. Standalone (독립실행) 모드
  2. Pseudo-distributed(가상분산) 모드
  3. Full distributed(완전분산) 모드

 

1. Standalone 모드

standalone 모드는 하둡의 기본 모드이다. 하둡 소스를 받아 압축을 푼 상태에서, 하둡은 사용자의 하드웨어에 대한 정보를 가지고 있지 않다. 따라서, 하둡은 로컬 머신에서만 실행된다. 다른 노드와 통신할 필요가 없기 때문에 standalone 모드에서는 HDFS를 사용하지 않고 다른 데몬들도 실행시키지 않는다. 이 모드의 목적은 독립적으로 MapReduce 프로그램의 로직을 개발하고 디버깅하는데 있다. 따라서 다른 데몬들과 서로 주고받는 부가 작업이 필요없다.

 

2. Pseudo-distributed 모드

pseudo-distributed  모드는 클러스터가 한 대로 구성되어 있고, 모든 데몬 역시 이 한 대의 컴퓨터에서 실행된다. 이 모드는 코드 디버깅 시 standalone 모드에서의 기능을 보완할 수 있는데, 메모리 사용정도, HDFS 입출력 관련 문제, 다른 데몬과의 상호작용에서 발생하는 일을 검사할 수 있다. standalone과 pseudo-distributed 모드는 모두 개발이나 디버깅 목적으로 사용된다. 실제 하둡 클러스터는 fully distributed 모드에서 실행된다.

 

3. Fully distributed 모드

모든 기능이 갖추어진 클러스터 구성이며, 분산 저장과 분산 연산의 장점을 누릴 수 있다. 클러스터를 설명할 때는 아래와 같은 서버명을 사용한다.

  • master – 클러스터의 master 노드로서, NameNode와 JobTracker 데몬을 제공한다.
  • backup – SNN(Secondary NameNode 데몬)을 제공하는 서버
  • hadoop1, hadoop2, hadoop3, … – DataNode와 TaskTracker 데몬을 실행하는 slave들

 

이 글에서는 우분투 리눅스에서 Single-Node Cluster 구성으로 Hadoop을 pseudo-distributed 모드로 설정하고 실행해본다.

 

1. Sun JDK 6 설치

OpenJDK가 설치되어 있다면 Sun의 JDK로 교체하는 것이 좋다. 필자가 직접 테스트해보지는 않았지만 다른 블로거들의 정보에 의하면 OpenJDK는 구동중에 몇가지 에러를 일으키는 듯 하다.

 

2. 하둡 시스템 사용자 계정 설정

하둡에서는 모든 노드가 동일한 사용자명을 가진다. 보안을 위해 사용자 레벨의 계정을 사용할 것을 권한다. 이 계정은 하둡 클러스터를 관리할 목적으로만 사용되기 때문이다. 클러스터의 모든 데몬이 실행되고 나면, 다른 계정을 사용해서 MapReduce 작업을 실행할 수 있다.

$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser

razorback@ubuntu4:~$ sudo addgroup hadoop
[sudo] password for razorback:
Adding group `hadoop’ (GID 1001) …
Done.
razorback@ubuntu4:~$ sudo adduser –ingroup hadoop hduser
Adding user `hduser’ …
Adding new user `hduser’ (1001) with group `hadoop’ …
Creating home directory `/home/hduser’ …
Copying files from `/etc/skel’ …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for hduser
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
razorback@ubuntu4:~$

 

3-1. SSH 설정

master 노드는 클러스터에 위치한 다른 모든 노드들에 접근할 수 있어야 한다. 하둡은 이러한 접근을 위해 SSH를 사용한다. SSH가 설치되어 있지 않은 경우 “$ sudo apt-get install ssh”를 통해 설치하기 바란다.

$ su hduser
$ ssh-keygen -t rsa -P ""

razorback@ubuntu4:~$ su hduser
Password:
hduser@ubuntu4:/home/razorback$ ssh-keygen -t rsa -P “”
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_rsa):
Created directory ‘/home/hduser/.ssh’.
Your identification has been saved in /home/hduser/.ssh/id_rsa.
Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.
The key fingerprint is:
e5:64:6e:a1:85:99:bc:7f:40:2f:85:65:fb:5d:ee:08 hduser@ubuntu4
The key’s randomart image is:
+–[ RSA 2048]—-+
+—————–+

 

3-2. SSH 공개 키 배포

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

 

3-3. SSH 로그인 테스트

$ ssh localhost

hduser@ubuntu4:/home/razorback$ ssh localhost
The authenticity of host ‘localhost (127.0.0.1)’ can’t be established.
ECDSA key fingerprint is b1:b9:19:75:17:b0:d6:3f:bc:48:14:63:50:00:1a:53.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘localhost’ (ECDSA) to the list of known hosts.

 

4. 하둡 패키지 다운로드

master 노드는 클러스터에 위치한 다른 모든 노드들에 접근할 수 있어야 한다. 하둡은 이러한 접근을 위해 SSH를 사용한다. SSH가 설치되어 있지 않은 경우 “$ sudo apt-get install ssh”를 통해 설치하기 바란다.

$ cd /usr/local
$ sudo wget http://mirror.apache-kr.org/hadoop/common/hadoop-1.0.4/hadoop-1.0.4.tar.gz
$ sudo tar xzf hadoop-1.0.4.tar.gz
$ sudo mv hadoop-1.0.4 hadoop
$ sudo chown -R hduser:hadoop hadoop

hduser@ubuntu4:~$ cd /usr/local
hduser@ubuntu4:/usr/local$ sudo wget http://mirror.apache-kr.org/hadoop/common/hadoop-1.0.4/hadoop-1.0.4.tar.gz
[sudo] password for hduser:
–2013-01-24 02:58:13– http://mirror.apache-kr.org/hadoop/common/hadoop-1.0.4/hadoop-1.0.4.tar.gz
Resolving mirror.apache-kr.org (mirror.apache-kr.org)… 211.115.106.101
Connecting to mirror.apache-kr.org (mirror.apache-kr.org)|211.115.106.101|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 62793050 (60M) [application/x-gzip]
Saving to: `hadoop-1.0.4.tar.gz’

100%[======================================>] 62,793,050 11.2M/s in 5.4s

2013-01-24 02:58:19 (11.1 MB/s) – `hadoop-1.0.4.tar.gz’ saved [62793050/62793050]

hduser@ubuntu4:/usr/local$ sudo tar xzf hadoop-1.0.4.tar.gz
hduser@ubuntu4:/usr/local$ sudo mv hadoop-1.0.4 hadoop
hduser@ubuntu4:/usr/local$ sudo chown -R hduser:hadoop hadoop
hduser@ubuntu4:/usr/local$

 

5. 환경설정 업데이트

$HOME/.bashrc 파일의 맨 아래에 다음과 같은 내용을 추가한다.

$ vi ~/.bashrc
# Set Hadoop-related envrionment variables
export HADOOP_HOME=/usr/local/hadoop

# Set JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-6-sun

# Some convenient aliases and functions for running Hadoop-related commandsunalias fs &> /dev/null
alias fs="hadoop fs"
unalias hls &> /dev/null
alias hls="fs -ls"

# If you have LZO compression enabled in your Hadoop cluster and
# compress job outputs with LZOP (not covered in this tutorial):
# Conveniently inspect an LZOP compressed file from the command
# line; run via:
#
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
#
# Requires installed 'lzop' command.
#
lzohead () {
    hadoop fs -cat $1 | lzop -dc | head -1000 | less
}
# Add Hadoop bin/ directory to PATH
export PATH=$PATH:$HADOOP_HOME/bin

 

6-1. 하둡 HDFS 디렉토리 셋팅

$ sudo mkdir -p /app/hadoop/tmp
$ sudo chown hduser:hadoop /app/hadoop/tmp
$ sudo chmod 750 /app/hadoop/tmp

 

6-2. 하둡 스크립트 셋팅

/usr/local/hadoop/conf/hadoop-env.sh 파일의 맨 아래에 다음과 같은 내용을 추가한다.

$ vi /usr/local/hadoop/conf/hadoop-env.sh
# The java implementation to use. Required.
export JAVA_HOME=/usr/lib/jvm/java-6-sun

# Disable IPv6
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

# Ignore HADOOP_HOME deprecated warning
export HADOOP_HOME_WARN_SUPPRESS=TRUE

 

6-3. 하둡 XML 셋팅

아래의 내용들을 각각의 파일들의 내부에 있는

<configuration> ... </configuration>

사이에 추가하도록 한다.

 

  • /usr/local/hadoop/conf/core-site.xml
<property>
  <name>hadoop.tmp.dir</name>
  <value>/app/hadoop/tmp</value>
  <description>A base for other temporary directories.</description>
</property>

<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:54310</value>
  <description>The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.</description>
</property>

 

  • /usr/local/hadoop/conf/mapred-site.xml
<property>
  <name>mapred.job.tracker</name>
  <value>localhost:54311</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>

 

  • /usr/local/hadoop/conf/hdfs-site.xml
<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>Default block replication.
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  </description>
</property>

 

7. 하둡 HDFS 파일 시스템 포맷

하둡의 첫 사용을 위해서는 하둡 파일 시스템(HDFS)을 포맷해야한다.

$ /usr/local/hadoop/bin/hadoop namenode -format

hduser@ubuntu4:/usr/local/hadoop$ bin/hadoop namenode -format
Warning: $HADOOP_HOME is deprecated.

13/01/24 21:45:39 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu4/192.168.3.71
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.0.4
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by ‘hortonfo’ on Wed Oct 3 05:13:58 UTC 2012
************************************************************/
13/01/24 21:45:39 INFO util.GSet: VM type = 64-bit
13/01/24 21:45:39 INFO util.GSet: 2% max memory = 17.77875 MB
13/01/24 21:45:39 INFO util.GSet: capacity = 2^21 = 2097152 entries
13/01/24 21:45:39 INFO util.GSet: recommended=2097152, actual=2097152
13/01/24 21:45:39 INFO namenode.FSNamesystem: fsOwner=hduser
13/01/24 21:45:39 INFO namenode.FSNamesystem: supergroup=supergroup
13/01/24 21:45:39 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/01/24 21:45:39 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/01/24 21:45:39 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/01/24 21:45:39 INFO namenode.NameNode: Caching file names occuring more than 10 times
13/01/24 21:45:40 INFO common.Storage: Image file of size 112 saved in 0 seconds.
13/01/24 21:45:40 INFO common.Storage: Storage directory /app/hadoop/tmp/dfs/name has been successfully formatted.
13/01/24 21:45:40 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu4/192.168.3.71
************************************************************/
hduser@ubuntu4:/usr/local/hadoop$

 

8. Hadoop Single-Node Cluster 구동

다음 명령어는 Hadoop의 NameNode, DataNode, JobTracker, TaskTracker 데몬을 실행시켜준다. 반대로 데몬들을 실행 종료 시키려면 “stop-all.sh”를 실행시키면 된다.

$ /usr/local/hadoop/bin/start-all.sh

hduser@ubuntu4:/usr/local/hadoop$ bin/start-all.sh
Warning: $HADOOP_HOME is deprecated.

starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-namenode-ubuntu4.out
localhost: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-datanode-ubuntu4.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-secondarynamenode-ubuntu4.out
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-jobtracker-ubuntu4.out
localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-tasktracker-ubuntu4.out
hduser@ubuntu4:/usr/local/hadoop$

 

9. Hadoop 데몬 구동 확인

jps 명령어를 통해 하둡 데몬들의 구동 여부를 확인할 수 있다.

$ jps

hduser@ubuntu4:/usr/local/hadoop$ jps
7996 SecondaryNameNode
7873 DataNode
8079 JobTracker
7747 NameNode
8354 Jps
8201 TaskTracker
hduser@ubuntu4:/usr/local/hadoop$

 

10. 예제 파일 생성

HDFS에 input이라는 폴더를 만들고 여기에 MapReduce를 수행하는데 사용할 자료(CHANGES.txt)를 복사해서 넣는다.

$ hadoop dfs -mkdir input
$ hadoop dfs -put CHANGES.txt input/

 

11. MapReduce 작업 수행

Hadoop 예제 프로그램들이 정의되어 있는 jar 파일에서 wordcount 코드를 실행시킨다. (wordcount는 대상 자료에 있는 단어들의 갯수를 세주는 코드이다.)

이 때, MapReduce를 수행할 타겟 자료가 있는 폴더는 input 으로 지정하고, 결과는 output 폴더에 저장하도록 지정한다.

$ hadoop jar hadoop-examples-1.0.4.jar wordcount input output

hduser@ubuntu4:/usr/local/hadoop$ hadoop jar hadoop-examples-1.0.4.jar wordcount input output
13/01/25 05:08:13 INFO input.FileInputFormat: Total input paths to process : 1
13/01/25 05:08:13 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/01/25 05:08:13 WARN snappy.LoadSnappy: Snappy native library not loaded
13/01/25 05:08:13 INFO mapred.JobClient: Running job: job_201301242147_0003
13/01/25 05:08:14 INFO mapred.JobClient: map 0% reduce 0%
13/01/25 05:08:27 INFO mapred.JobClient: map 100% reduce 0%
13/01/25 05:08:39 INFO mapred.JobClient: map 100% reduce 100%
13/01/25 05:08:44 INFO mapred.JobClient: Job complete: job_201301242147_0003
13/01/25 05:08:44 INFO mapred.JobClient: Counters: 29
13/01/25 05:08:44 INFO mapred.JobClient: Job Counters
13/01/25 05:08:44 INFO mapred.JobClient: Launched reduce tasks=1
13/01/25 05:08:44 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=11293
13/01/25 05:08:44 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
13/01/25 05:08:44 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
13/01/25 05:08:44 INFO mapred.JobClient: Launched map tasks=1
13/01/25 05:08:44 INFO mapred.JobClient: Data-local map tasks=1
13/01/25 05:08:44 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=9776
13/01/25 05:08:44 INFO mapred.JobClient: File Output Format Counters
13/01/25 05:08:44 INFO mapred.JobClient: Bytes Written=160967
13/01/25 05:08:44 INFO mapred.JobClient: FileSystemCounters
13/01/25 05:08:44 INFO mapred.JobClient: FILE_BYTES_READ=209637
13/01/25 05:08:44 INFO mapred.JobClient: HDFS_BYTES_READ=447116
13/01/25 05:08:44 INFO mapred.JobClient: FILE_BYTES_WRITTEN=462387
13/01/25 05:08:44 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=160967
13/01/25 05:08:44 INFO mapred.JobClient: File Input Format Counters
13/01/25 05:08:44 INFO mapred.JobClient: Bytes Read=446999
13/01/25 05:08:44 INFO mapred.JobClient: Map-Reduce Framework
13/01/25 05:08:44 INFO mapred.JobClient: Map output materialized bytes=209637
13/01/25 05:08:44 INFO mapred.JobClient: Map input records=11260
13/01/25 05:08:44 INFO mapred.JobClient: Reduce shuffle bytes=0
13/01/25 05:08:44 INFO mapred.JobClient: Spilled Records=24772
13/01/25 05:08:44 INFO mapred.JobClient: Map output bytes=643859
13/01/25 05:08:44 INFO mapred.JobClient: CPU time spent (ms)=4990
13/01/25 05:08:44 INFO mapred.JobClient: Total committed heap usage (bytes)=178847744
13/01/25 05:08:44 INFO mapred.JobClient: Combine input records=57549
13/01/25 05:08:44 INFO mapred.JobClient: SPLIT_RAW_BYTES=117
13/01/25 05:08:44 INFO mapred.JobClient: Reduce input records=12386
13/01/25 05:08:44 INFO mapred.JobClient: Reduce input groups=12386
13/01/25 05:08:44 INFO mapred.JobClient: Combine output records=12386
13/01/25 05:08:44 INFO mapred.JobClient: Physical memory (bytes) snapshot=265150464
13/01/25 05:08:44 INFO mapred.JobClient: Reduce output records=12386
13/01/25 05:08:44 INFO mapred.JobClient: Virtual memory (bytes) snapshot=1925767168
13/01/25 05:08:44 INFO mapred.JobClient: Map output records=57549
hduser@ubuntu4:/usr/local/hadoop$

 

12. MapReduce 작업 결과물 확인

결과물을 저장하도록 지정한 output 폴더를 확인하면 MapReduce 작업 결과물을 확인할 수 있다.

$ hadoop dfs -ls output
$ hadoop dfs -cat output/part-r-00000

hduser@ubuntu4:/usr/local/hadoop$ hadoop dfs -ls output
Found 3 items
-rw-r–r– 1 hduser supergroup 0 2013-01-25 05:08 /user/hduser/output/_SUCCESS
drwxr-xr-x – hduser supergroup 0 2013-01-25 05:08 /user/hduser/output/_logs
-rw-r–r– 1 hduser supergroup 160967 2013-01-25 05:08 /user/hduser/output/part-r-00000
hduser@ubuntu4:/usr/local/hadoop$ hadoop dfs -cat output/part-r-00000

 

13. Hadoop Web Interface

Hadoop에서 기본적으로 지원되는 Web 인터페이스를 통해서도 하둡 클러스터에 대한 다양한 정보를 얻을 수 있다.

 

7 개의 댓글

  • 잘 정리해두셨네요.

    덕분에 막혔던 부분이 해결되었습니다.

    감사합니다.

  • 정말 감사 합니다. 덕분에 쉽게 문제를 해결 했어요 ㅠㅠ 이 내용 참고 해서 제 블로그에 올려도 괜찮을 까요 ㅎㅎ??

  • 안녕하세요
    하둡 공부를 막 시작한 학생입니다
    우선 정말 도움 되는 글에 감사드립니다
    다만 제가 10번까지는 잘 따라갔는데 11번에 맵리듀스를 실행하려고 명령어를 치니
    INFO mapred.JobClient: map 0% reduce 0%
    여기까지만 실행되고 killed 됐다고 끝나버리는데 혹시 왜 이러는지 아시나요? ㅜ

    • 글을 작성한지 오래되어서 제대로 도와드릴 수 있을 지는 모르겠지만
      정확한 에러 메시지를 모두 봐야 도움을 드릴 수 있을 것 같습니다.

    • 아닙니다 해결했습니다!!
      도움 많이 되었습니다
      정말 감사합니다

댓글 남기기

Note: 이름과 이메일을 꼭 적어주세요!

Facebook Comments

카테고리