데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

하둡 설치

데이터 저장
분산파일시스템
하둡 설치
작성자
admin
작성일
2021-02-15 13:41
조회
2372

하둡 분산 파일 시스템을 구축하려면 다음과 같은 시스템 요구 사항을 만족해야 한다.


  • 리눅스 운영체제
  • JDK 1.6.x 또는 그 이상 버전
  • ssh 지원

하둡은 리눅스 명령으로 시스템 정보를 수집한다. 그래서 리눅스 운영체제나 시그윈(Cygwin)과 같은 리눅스 명령을 사용하는 운영체제가 필요하다. 필자는 리눅스 운영체제에 설치하는 것을 권장한다. 자바 환경이 필요한 이유는 하둡이 자바 언어로 개발됐기 때문이다. ssh는 하둡이 각 노드를 실행하거나 중지할 때 이용하므로 반드시 필요하다. 이제부터 ssh와 하둡 설치 방법을 알아보자.


하둡 설치 환경

통상적으로 하둡을 설치하기 하기 위해서는 아래 같은 순서대로 준비를 해야 한다.


물리적인 서버 준비

물리적인 서버는 다음의 기능을 수행할 서버를 의미한다.


  • 네임 노드(1대)
  • 데이터 노드(통상 테스트 용도로 사용할 경우 3~4대 정도를 클러스터로 구성한다)
  • 보조 네임 노드(1대)

이를 구체적으로 다시 설명하면 다음과 같다.


  • 서버 1은 네임 노드의 용도
  • 서버 2는 보조 네임 노드의 용도
  • 서버 3 이상은 데이터 노드

물론, 필요 환경에 따라서 각각 다르게 구성할 수 있다. 또한 테스트 가상화 환경을 구성해 위의 구성을 원하는대로 수정해 테스트해 볼 수 있다.


소프트웨어 준비
  • OS: 일반적으로 사용되는 오픈소스인 Linux를 다운 받아 준비해 놓는다.
  • 하둡: 아파치 웹사이트(http://hadoop.apache.org)에 접속해 원하는 버전의 하둡을 다운 받아 준비한다. 버전에 따라 게시돼 있는 사이트가 조금씩 차이가 존재 하니 필요한 버전을 잘 찾아 다운 받도록 한다.
하둡 설치 전 확인사항

아래에 기술되는 확인사항은 하둡이 설치되는 모든 서버에 적용된다.



운영체제 비트 확인

앞으로 설치될 프로그램과 OS의 호환을 위해 OS의 비트를 확인한다.


# getconf LONG_BIT 64 결과가 32로 나오면 32비트, 위와 같이 64로 나오면 64비트다.


ssh 설치 확인


#yum list grep openssh openssh.x86_64 5.3p1-94.el6 installed openssh-askpass.x86_64 5.3p1-94.el6 installed openssh-clients.x86_64 5.3p1-94.el6 installed openssh-server.x86_64 5.3p1-94.el6 installed openssh-server 설치돼 있는지 확인한다.


인코딩 방식 설정


# vi / etc / sysconfig / i18n 편집창에서 아래와 같이 수정한다. LANG='ko_KR.UTF-8'


방화벽 설정(IPTABLES)에 하둡에서 사용될 포트 추가


#vi / etc / sysconfig / iptables ① 아래 내용을 COMMIT 위에 추가 (단, 내부망 구간 내에 있을 경우에는 추가하지 않아도 되며, 일반적으로 사설 방화벽을 이용함) -A RH-Firewall-1-INPUY -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50030 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50060 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50075 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT 22(SSH), 50010(Datanode), 50020(Datanode ipc서버용), 50030(Jobtracker 웹서버용), 50060(Tasktracker 웹서버용), 50070(Namenode 웹어드민용), 50075(Datanode 웹서버용), 50090 (SecondaryNamenode 웹서버용), 9000(HDFS), 9001(Jobtracker) ② IPTABLES를 재시작해 추가된 포트 적용(방화벽에 포트 추가시 실행) #service iptables restart 명령어가 발견되지 않는 에러 발생 시 아래 명령으로 실행한다. # /etc/init./iptables restart ③ (Optional) 방화벽 내리기 및 부팅 시 방화벽이 올라오지 못하도록 설정 # service iptables stop # chkconfig iptables off

위와 같이 사용될 포트를 매번 열어주는 건 매우 번거로운 일이다. 서버가 내부 망으로만 설치 돼 있다면 방화벽을 내려주는 게 가장 간단한 방법이다. 또는 명령어를 찾을수 없을 때는 명령어의 위치를 찾은 후 해당 절대경로를 지정해 실행한다.

예) #whereis service # /sbin/service iptables stop


OS 설치 시 설치된 자바 확인


#java - version java version "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.5) (rhel-1.30.1.11.5.el5-x86_64) OpenJDK 64-Bit Server VM (build 20.0-b12m, mixed mode) CentOS 설치 시 기본적으로 java가 설치된다.

자바가 설치돼 있지 않거나 버전이 낮은 경우 자바 설치와 Default Java 변경이 필요하다.



이상 설치 및 환경 설정에 대해서 알아보았다. 환경 설정에 정해진 매뉴얼은 없으며 설치 관리자의 경험과 운영 환경에 최적화한 환경을 구성할 수 있다.


SSH 설치와 설정

하둡 분산 파일 시스템은 분산된 환경에서 운영되는 응용프로그램이다. 따라서 원격에서 응용프로그램을 제어할 수 있어야 한다. 하둡은 ssh로 분산된 각 노드를 제어하기 때문에 하둡을 단일 서버에 설치하더라도 ssh는 반드시 설치해야 한다.
다음은 ssh을 설치하는 방법이다. 대부분 리눅스 운영체제는 ssh가 기본으로 설치돼 있다. 만약 설치되지 않다면, 다음과 같이 ssh와 ssh 클라이언트를 설치하자. ssh 클라이언트는 하둡 실행에는 필요 없지만, 하둡 설정 파일을 다른 서버에 배포할 때 유용하다.

sh> yum install openssh openssh-clients

openssh-clients가 설치돼 있어야 scp 명령을 사용할 수 있다. scp는 파일을 네트워크를 통해 전송하는 데 매우 유용한 도구다.

ssh 설치를 마쳤으면, 하둡을 설치할 서버 간에 ssh를 공개키 기반으로 통신할 수 있도록 설정한다.

만약 이 부분을 설정하지 않으면 하둡을 실행하거나 중지할 때 매번 비밀번호를 입력해야 한다.

sh> ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/test/.ssh/id_rsa) : Created directory '/home/test/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your indentification has been saved in /home/test/.ssh/id_rsa. Your public key has been saved in /home/test/.ssh/id_rsa.pub. The key fingerprint is: 8a:b6:af:af:6f:cc:b8:9e:38:ca:38:c8:26:cb:f9 hadoop@hadoop01.localdomain

[hadoop@bigmba .ssh] $ pwd /home/hadoop/.ssh [hadoop@bigmba .ssh] $ ls -trl total 16 -rw-r--r--. 1 hadoop hadoop 1587 Dec 25 21:44 known_hosts -rw-r--r--. 1 hadoop hadoop 395 Dec 25 21:48 id_rsa.pub -rw-------. 1 hadoop hadoop 1675 Dec 25 21:48 id_rsa -rw-r--r--. 1 hadoop hadoop 395 Dec 25 21:50 authorized_keys[hadoop@bigmba .ssh] $

[그림 Ⅱ-1-3] ssh 폴더 내부 화면

하둡을 실행하고 운영할 사용자 계정은 hadoop이다. hadoop 계정으로 로그인한 후 명령을 실행한다. 명령어가 정상적으로 실행되면 hadoop 계정에 .ssh 폴더가 생성된다. 폴더 안을 보면 id_rsa와 id_rsa.pub 파일이 있다. 이는 개인키(private key)와 공개키(public key)다. 이 공개키를 데이터 노드로 사용될 서버와 동일한 이름의 폴더에 authorized_keys라는 이름으로 복사하면 된다.

# ssh 명령으로 데이터 노드가 될 서버에 접속해 .ssh 폴더를 생성하고 권한 설정을 한다. sh> ssh hadoop@datanode01 "mkdir .ssh && chmod -R 700 .ssh" sh> scp .ssh/id_rsa.pub hadoop@datanode01:.ssh/authorized_keys

위와 같은 방식으로 한 서버에서 원격 서버 모두를 설정할 수 있다. 위 명령에서 datanode01에는 데이터 노드가 될 서버 네트워크의 IP 주소를 입력하거나 도메인 이름 또는 호스트 이름을 입력하면 된다. 서버가 수십 대에서 수백 대까지 될 수 있기 때문이다. ssh 명령으로 원격지 서버에 명령을 실행시키고, scp 명령으로 필요한 파일을 원격지 서버에 전송할 수 있다. ssh 또는 scp 명령을 실행할 때, 원격지 서버가 응답하는 속도가 5초 이상 걸린다면 다음과 같이 ssh 클라이언트 설정을 변경하자.


/etc/ssh/ssh_config

... Host * GSSAPIAuthentication no StricHostKeyChecking no ...

GSSAPIAuthentication를 no로 설정하면 ssh로 원격지 서버에 접근할 때, DNS 검색을 하지 않는다. 이를 yes로 설정하면 DNS 검색 때문에 최초 접속 시간이 길어진다. 그리고 StrictHostKeyChecking를 no로 설정하면, 원격지 서버와 접속할 때 서로 호스트 키를 확인하지 않는다. 이 부분이 yes이면 최초 접속 시 [yes | no] 질의 과정을 거치게 된다. 시스템을 확장하고 나서 하둡을 실행하면 실행 도중에 질의가 나타난다. 운영자 입장에서 상당히 불편할 수 있으니 반드시 no로 설정하자. 결론적으로 위의 예제처럼 설정하면 하둡 실행 속도를 빠르게 하고, 불필요한 질의를 없앨 수 있다.


하둡 1.X 설치

하둡 분산 파일 시스템은 오픈 소스다. 그래서 누구나 내려받아 사용할 수 있다. 여기서는 하둡 1.2.1 버전을 사용한다.

하둡 프로젝트 사이트: http://hadoop.apache.org
하둡 1.2.1 버전: http://mirror.apache-kr.org//hadoop/core/hadoop-1.2.1/hadoop-1.2.1.tar.gz

현재 하둡의 안정화 버전은 1.2.1이다. 이 책에서 구성할 하둡 분산 파일 시스템은 다음과 같다.

[그림 Ⅱ-1-4] 하둡 분산 파일 시스템 구성도

[그림 Ⅱ-1-4] 하둡 분산 파일 시스템 구성도

네임 노드와 보조 네임 노드는 동일한 서버에 구성하고, 데이터 노드 2개를 구성한다. 각각 호스트 이름은 namenode.localdomain, datanode01.localdomain, datanode02.localdomain이다. DNS 서버를 별도로 운영하지 않는다면 다음 설정값을 추가한다.


/etc/hosts

... 10.211.55.8 namenode namenode.localdomain 10.211.55.12 datanode01 datanode01.localdomain 10.211.55.14 datanode02 datanode02.localdomain

설정값은 모든 서버(네임 노드 서버, 데이터 노드 서버)에 설정해야 한다. 많은 서버를 이용해 구성하면 별도로 DNS 서버를 운영하는 방법이 좋다.
하둡을 내려받을 때는 root 계정이 아닌 hadoop 계정을 이용한다. 만약 파일을 root 계정으로 내려받았다면 hadoop 계정으로 접근할 수 있도록 하고 hadoop 홈 폴더로 이동시킨 후 다음과 같이 압축을 해제한다.

# 내려받은 압축 파일을 압축 해제한다. sh> tar xvfz hadoop-1.2.1 tar gz

필자는 압축을 해제한 하둡 폴더를 그대로 이용하지 않고 다음과 같이 링크를 이용한다.

# hadoop-1.2.1 폴더를 hadoop으로 링크를 생성한다. sh> ln -s hadoop-1.2.1 hadoop

링크를 이용하는 이유는 상황에 따라 다른 버전 하둡을 이용할 수도 있기 때문이다. 링크를 이용해 여러 버전 하둡을 설치해 운영할 수도 있다.

[그림 Ⅱ-1-5] 하둡 홈 폴더 구조의 예

[그림 Ⅱ-1-5] 하둡 홈 폴더 구조의 예

[표 Ⅱ-1-1]은 하둡 폴더에 대한 간단한 설명이다.

[표 Ⅱ-1-1] 하둡 폴더 구조


폴더 명 설명
bin 하둡을 실행하거나 관리하는 스크립트 폴더
c++ c++ 클라이언트 라이브러리 폴더
conf 하둡 환경 설정 파일이 있는 폴더
contrib 하둡 메인 코드에는 반영되지 않았지만 다양한 기능을 수행하는 도구가 있는 폴더
docs 하둡 관련 문서와 자바 API 문서가 있는 폴더
ivy 하둡을 빌드할 때 필요한 외부 라이브러리 의존성을 해결하기 위한 설정 파일이 있는 폴더
lib 하둡에서 사용되는 외부 라이브러리 폴더
logs 하둡 로그 파일 폴더
sbin 하둡 설정을 질의 형식으로 하는 관리용 스크립트 폴더
share 공유돼야 할 설정 파일의 템플릿 폴더. 하둡 설정 파일은 모든 노드(네임 노드, 보조 네임 노드, 데이터 노드 등)가 공유돼야 한다.
src 하둡 소스코드 폴더로 core, hdfs, mapred 등 메인 프로그램 소스 코드와 C++ 소스 코드, 예제 소스 코드, API 문서와 활용 문서가 있는 폴더
webapps 웹 서버의 루트 폴더. 하둡은 http 서버로 제티(jetty)를 이용한다.

하둡 버전에 따라 폴더 구조는 약간 다를 수 있다. 하둡 분산 파일 시스템을 실행하는데 필요한 폴더는 bin, conf, lib, logs, webapps, 하둡 루트 폴더에 있는 메인 라이브러리다.
압축을 해제하고 시스템 설정이 완료됐다면 하둡 분산 파일 시스템 설치가 완료된 것이다. 하지만 클러스터 환경이라면 네임 노드 서버뿐만 아니라 모든 데이터 노드 서버에도 하둡을 설치해야 한다.
다음은 네임 노드에 설치된 하둡을 모든 데이터 노드(여기서는 노드 1과 노드 2)에 복사하는 방법이다.

# 하둡 폴더 전체를 데이터 노드 1에 전송한다. sh> scp -r hadoop-1.2.1 hadoop@datanode01.localdomain:./ # 하둡 폴더를 네임 노드에서와 같이 링크를 생성한다. sh> ssh hadoop@datanode01.localdomain "ln-s hadoop-1.2.1 hadoop" # 하둡 폴더 전체를 데이터 노드 2에 전송한다. sh> scp -r hadoop-1.2.1 hadoop@datanode02.localdomain:./ # 하둡 폴더를 네임 노드에서와 같이 링크를 생성한다. sh> ssh hadoop@datanode02.localdomain "ln -s hadoop-1.2.1 hadoop"

네임 노드에서 하둡 설정을 모두 마친 후 위와 같이 하둡을 복사하면, 별도로 각 노드에서 설정 작업을 할 필요가 없다. 이미 하둡을 모든 데이터 노드에 전송했기 때문에 설정 작업을 마치면 conf 폴더만 동기화한다.


하둡 1.X 설정과 실행

하둡 1.X 설정

하둡 분산 파일 시스템의 설정 작업은 하둡 루트 폴더 내의 conf 폴더에서 모두 이뤄진다. 설정 파일이 많이 있지만, 여기서는 단순히 프라이빗 스토리지 서비스를 위한 설정만 해보자.
$HADOOP_HOME/conf/hadoop-env.sh 파일은 하둡이 실행될 때 반영되는 시스템 환경 변수를 담고 있다. 이 파일은 xml 형식의 설정 파일이 아니라, 하둡이 실행될 때 선처리로 실행되는 스크립트로서, 하둡에서 사용하는 모든 환경 변수가 정의돼 있다. 이 파일에서는 자바 옵션 중 server 옵션을 적용하는 부분의 주석을 제거하고 HADOOP_PID_DIR을 추가로 지정하자. HADOOP_PID_DIR을 지정하지 않으면 하둡은 기본값으로 /tmp 폴더에 pid 값을 저장한다. /tmp 폴더는 시스템 관리자에 의해 주기적으로 정리될 수 있으니 $HADOOP_HOME/pids 폴더에서 관리하자.


$HADOOP_HOME/conf/hadoop-env.sh

#Set Hadoop-specific environment variabled here. # The only required environment variable id 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 defiend on # remote nodes. #The java implementation to use. Required. # export JAVA_HOME=/usr/lib/j2sdk1.50sun #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_SECONDARYNAME_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. export HADOOP_PID_DIR=${HADOOP_HAME}/../pidsexport HADOOP_OPTS=-server # 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

$HADOOP_HOME/conf/core-site.xml은 하둡의 로그 파일, 네트워크 설정, 입출력 설정, 파일 시스템 설정, 압축 등에 관한 기본 설정을 한다. 파일 시스템과 맵리듀스에서 공통으로 사용하는 설정 파일로, $HADOOP_HOME/src/core/core-default.xml 또는 $HADOOP_HOME/share/hadoop/templates/conf/core-site.xml 파일을 참조하면, 항목별 설정 방법에 대한 설명이 자세히 돼 있다.
다음은 하둡 분산 파일 시스템을 실행하기 위한 최소 설정 예제다.


$HADOOP_HOME/conf/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://namenode.localdomain:9000</value></property></configuration>

$HADOOP_HOME/conf/hdfs-site.xml은 하둡에서 데이터를 관리하기 위한 설정 파일이다. 여기서 말하는 데이터는 네임 노드에서 관리하는 네임스페이스 데이터와 데이터 노드에서 관리하는 파일 블록 데이터다. dfs.data.dir은 “,”를 이용해 여러 개의 폴더를 지정할 수 있다. 단 여려 개의 폴더를 설정하면, 각각 폴더가 디스크 단위로 구분돼 있어야 용량이나 성능이 향상된다. 이 파일에서 기본 복제본 수를 설정한다. 자세한 설정 방법은 $HADOOP_HOME/src/hdfs/hdfs-default.xml 또는 $HADOOP_HOME/share/hadoop/templates/conf/hdfs-site.xml 파일을 참조하자. 다음은 기본적인 설정 예제다.


$HADOOP_HOME/conf/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>/home/hadoop/hadoop/filesystem/name</value></property><property><name>dfs.data.dir</name><value>/home/hadoop/hadoop/filesystem/data</value></property><property><name>dfs,.data.dir</name><value>/home/hadoop/hadoop/filesystem/data</value></property><property><name>dfs.replication</name><value>2</value></property><property><name>dfs.webhdfs.enabled</name><value>true</value></property></configuration>

dfs.name.dir은 네임 노드에서 파일 네임스페이스 정보를 저장하기 위한 폴더를 지정하며, dfs.data.dir은 데이터 노드에서 파일 블록을 저장할 폴더를 지정한다. dfs.replication은 파일의 기본 복제본 수를 지정하는 항목이다. 지정하지 않으면 기본값인 “3”이 적용된다. 여기서는 데이터 노드가 2개이므로 복제본 수를 “2”로 지정한다.
dfs.webhdfs.enabled는 1.0.0버전부터 새롭게 추가된 기능이다. HTTP 프로토콜로 하둡 분산 파일 시스템에 접근하는 기능이다. 이 부분을 true로 설정하면 하둡 클라이언트를 사용하지 않고도 하둡 분산 파일 시스템에 파일을 올리거나 내려받을 수 있다. 이 항목을 true로 설정해야 다음 절에서 클라우드 스토리지를 구성할 수 있다.




[Note]

dfs.data.dir 값을 설정할 때 “,”를 구분자로 사용한다. 하지만 “,” 전후로 공백이 있으면 안된다.


$HADOOP_HOME/conf/masters는 보조 네임 노드가 실행될 서버를 지정한다. 네트워크 IP 주소, 도메인 이름 또는, 호스트 이름을 사용할 수 있고, 여러 대를 지정할 수 있다. 다음은 masters 설정 방법이다.


$HADOOP_HOME/conf/masters

namenode.localdomain

여기서는 네임 노드와 보조 네임 노드를 동일한 서버에서 구성할 예정이므로 네임 노드 호스트 이름을 사용한다.
$HADOOP_HOME/conf/slaves는 데이터 노드가 실행될 서버를 지정한다. masters 파일과 마찬가지로 네트워크 IP 주소, 도메인 이름 또는 호스트 이름을 사용할 수 있다. 데이터 노드로 사용할 서버 모두를 지정해야 한다. 다음은 slaves 설정 예제다.


$HADOOP_HOME/conf/slaves

datanode01.localdomain datanode02.localdomain

데이터 노드는 ‘줄 바꿈’으로 구분된다. 이 파일을 윈도우 운영체제에서 생성하면 ‘줄 바꿈’이 다른 형식으로 돼 있을 수 있다. 그럴 경우에는 다음과 같이 파일 형식을 변경한다.

# dos2unix 명령을 통해 텍스트 파일 형식을 변환한다.
sh> dos2unix slaves

하둡이 실행될 때 $HADOOP_HOME/conf/slaves에 설정된 서버만 데이터 노드로 실행되지만, 운영중에 slaves 파일에 명시되지 않은 서버에서 데이터 노드를 별도로 실행시킬 수 있다. 물론 네임 노드에서는 자동으로 데이터 노드 클러스터로 인식한다.

그 외 설정 파일이나 항목이 많지만, 클라우드 스토리지를 구성하기 위한 최소한의 설정만 다뤘다. 하둡 맵리듀스 부분은 전혀 다루지 않았는데, 하둡에 맵리듀스를 구성할 때는 하둡 분산 파일 시스템 설정의 일부도 조정해야 한다. 지금까지의 설정을 완료했다면, 반드시 데이터 노드 서버에 해당 파일을 공유하자. 다음은 모든 데이터 노드에 설정 파일을 동기화하는 방법이다.

#hadoop-env.sh, core-site.xml, hdfs-site.xml, masters, slaves 파일을 데이터 노드 1과 2에 전송해 파일을 동기화한다. sh> scp conf/hadoop-env.sh conf/core-site.xml conf/hdfs-site.xml masters slaves hadoop@datanode01: ./hadoop/conf/ sh> scp conf/hadoop-env.sh conf/core-site.xml conf/hdfs-site.xml masters slaves hadoop@datanode02: ./hadoop/conf/

클러스터 규모가 작으면 위와 같이 간단한 명령어로 해결할 수 있다. 하지만 규모가 크면 스크립트 파일을 만들어 사용해야 편하다.


설정 파일 동기화 스크립트

#!/bin/sh for datanode in $(cat conf/slaves) do scp conf/hadoop-env.sh conf/core-site.xml conf/hdfs-site.html conf/masters conf/slaves hadoop@$datanode:./hadoop/conf/ done exit 0

지금까지 [그림 Ⅱ-1-4]와 같이 namenode.localdomain에 하둡 네임 노드와 보조 네임 노드, datanode01.localdomain과 datanode02.localdomain에 하둡 데이터 노드를 설치했다. 그리고 하둡 분산 파일 시스템을 실행하기 위한 기본적인 설정도 완료했다. 이제 하둡 네임 노드에서 하둡 분산 파일 시스템을 실행하면 된다.


하둡 1.X 실행

하둡 분산 파일 시스템을 실행하는 방법은 매우 간단하다. $HADOOP_HOME/bin/start-dfs.sh 스크립트를 실행하면 된다. 하지만 하둡 분산 파일 시스템을 최초로 실행하기 전 또는 파일 시스템을 초기화한 후에는 네임 노드 포맷이 필요하다.

# 네임 노드를 포맷한다. sh> bin/hadoop namenode -format

네임 노드를 포맷한 후에는 모든 데이터 노드에서 파일 시스템 정보를 삭제해 줘야 한다. 그렇지 않으면 새로운 네임스페이스 포맷이 데이터 노드와 동기화될 수 없을 것이다.
다음은 하둡 분산 파일 시스템을 실행하는 명령어다.

# 하둡 분산 파일 시스템을 실행한다. sh> bin/start-dfs.sh

하둡 분산 파일 시스템을 실행할 때, 다음과 같은 오류 메시지가 출력될 때가 있다. 이 메시지는 원격지 서버에 JAVA_HOME이 설정되지 않을 때 출력된다.

... datanode01.localdomain: Error: JAVA_HOME is not set. ...

/etc/profile 파일이나 .bash_profile에 JAVA_HOME을 설정하는 경우가 있다. 이 경우 네임 노드 서버에서 데이터 노드 서버로 연결할 때 JAVA_HOME 환경 변수를 불러오지 못한다. 그래서 하둡을 실행할 계정(hadoop)의 .bashrc 파일에 JAVA_HOME을 설정한다. 이는 하둡이 대화식 비로그인 쉘을 이용하기 때문이다.

# 하둡 분산 파일 시스템을 실행한다. sh> bin/start-dfs.sh starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-hadoop01.localdomain.out datanode01.localmain: starting datanode, logging to datanode01.localdomain: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-server02.localmain.out datanode02.localdomain: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-server03.localdomain.out namenode.localdomain: starting secondartynamenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-secondarynamenode-hadoop01.localdomain.out

위와 같은 출력이 나타나면 하둡 분산 파일 시스템이 정상적으로 실행된 것이다. 각 노드에 프로세스가 실행되지 않는다면, 노드별 로그 파일을 살펴보자. 대부분은 JAVA_HOME이나 방화벽 설정 그리고 파일 권한 문제다.

[그림 Ⅱ-1-6] 하둡 분산 파일 시스템 관리 화면

[그림 Ⅱ-1-6] 하둡 분산 파일 시스템 관리 화면

이제 http://namenode.localdomain:50070에 접속하자. [그림 1-6]와 같은 관리 도구 화면이 보일 것이다. 관리 도구의 첫 페이지에서는 현재 운영중인 하둡 분산 파일 시스템의 요약 정보를 보여준다. 여기서 정상적으로 실행중인 데이터 노드 수, 문제가 있거나 서비스가 불가능한 데이터 노드 수, 임의로 데이터 노드 클러스터에서 제거된 노드 수를 확인할 수 있다.
[그림 Ⅱ-1-7]은 정상적으로 실행중인 데이터 노드에 대한 관리 화면이다. 데이터 노드별 스토리지 용량 정보, 사용률, 남은 용량, 보관 중인 파일 블록 수를 확인할 수 있다. 데이터 노드 이름을 클릭하면 파일 목록과 로그 정보도 확인할 수 있다.

[그림 Ⅱ-1-7] 데이터 노드 관리 화면

[그림 Ⅱ-1-7] 데이터 노드 관리 화면


bin/Hadoop 명령을 통한 상태 정보 확인

하둡은 제티(Jetty) 웹 서버를 갖고 있어 웹 기반의 관리 도구를 지원한다. 또한 콘솔 기반으로도 하둡 분산 파일 시스템 상태 정보를 확인할 수 있다. 다음은 bin/hadoop 명령어로 하둡 분산 파일 시스템 상태 정보를 확인하는 방법이다.

# hadoop 명령을 통해 하둡 분산 파일 시스템 정보를 조회한다. sh> bin/hadoop dfsadmin -report Configured Capacity : 65600774144 (61.1 GB) Present Capacity : 61539618816 (57.31 GB) DFS Remaining: 61526880256 (57.3 GB) DFS Used: 12738560 (12.15 MB) DFS Used%: 0.02% Under replication blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 Datanodes available : 2 (2 total, 0 dead) Name: 10.211.55.14:50010 Decommission Status: Normal Configured Capacity : 32800387072 (30.55 GB) DFS Used: 6369280 (6.07 MB) Non DFS Used: 2030575616 (1.89 GB) DFS Remaining: 30763442176 (28.65 GB) DFS Used%: 0.02% DFS Remaining%: 93.79% Last contact: Sun Mar 04 01:29:29 KST 2012 Name: 10.211.55.12:50010 Decommission Status : Normal Configured Capacity : 32800387072 (30.55 GB) DFS Used: 6369280 (6.07 MB) Non DFS Used: 2030579712 (1.89 GB) DFS Remaining : 30763438080(28.65 GB) DFS Used%: 0.02% DFS Remaining : 93.79% Last contact: Sun Mar 04 01:29:29 KST 2012

report 명령어는 [그림 Ⅱ-1-7]를 CLI(Command Line Interface)에서 확인하는 것과 같다.


fsck 명령을 통한 블록 상태 정보 확인

다음은 fsck 명령으로 파일의 블록 상태를 조회하는 방법이다.

# hadoop 명령을 통해 파일의 블록 상태를 조회한다. sh> bin/hadoop fsck / FSCK started by hadoop from / 10.211.55.8 for path / at Sun Mar 05 22:59:48 KST 2012 ...Status : HEALTHY Total size: 6270981 B Total dirs: 3 Total files: 3 Total blocks (validated) : 3 (avg. block size 2090327 B) Minimally replicated blocks: 3 (100.0%) Over-replicated blocks: 0 (0.0%) Under-replicated blocks: 0 (0.0%) Mis-replication blocks: 0 (0.0%) Default replication factor : 2 Average block replication : 2.0 Corrupt blocks: 0 Missing replicas: 0 (0.0%) Number of data-nodes: 2 Number of racks: 1 FSCK ended at Sun Mar 05 22:59:48 KST 2012 in 4 milliseconds The filesystem under path '/' is HEALTHY

[그림 Ⅱ-1-7]를 볼 수 있고, 위 명령어가 정상적으로 실행된다면 하둡 분산 파일 시스템이 정상적으로 실행되고 있는 것이다.


하둡 분산 파일 시스템 종료

다음은 하둡 분산 파일 시스템을 종료하는 방법이다.

# 하둡 분산 파일 시스템을 중지한다. sh> bin/stop-dfs.sh


하둡 데이터 노드 서비스 중지

특정 데이터 노드만 종료할 때는 해당 데이터 노드에 접속한 후 하둡 계정으로 다음 명령을 실행한다.

# 하둡 데이터 노드 서비스를 중지한다. sh> bin/hadoop-daemon.sh stop datanode

일시적으로 중지해야 하는 경우에 사용된다. 예를 들어 특정 시스템을 잠시 점검하거나, 시스템 재부팅이 필요할 때다. 하지만 여러 대의 시스템에 동일한 목적이 생길 때에는 무작정 데이터 노드를 중지시키는 방법은 옳지 않다. 한 번에 너무 많은 데이터 노드를 제거하면 블록이 유실될 가능성이 있고, 블록 복제에 따른 네트워크 트래픽이 집중될 수 있기 때문이다. 그래서 하둡은 여러 데이터 노드를 중지시킬 때 중지할 데이터 노드에서 모든 데이터 블록을 다른 데이터 노드로 복제한 후 데이터 노드를 중지하는 기능을 지원한다. 그렇다고 해서 네트워크 트래픽이 줄거나, 데이터 블록이 유실될 가능성이 내려가는 것은 아니다. 하둡에서는 이런 작업을 디커미션(Decommission)이라 하고, 반대로 클러스터 멤버로 구성되는 것을 커미션(Commission)이라고 한다.


하둡 2.X 설치

이번에는 하둡 2.6.0 버전을 설치해보자.

하둡 프로젝트 사이트: http://hadoop.apache.org
하둡 2.6.0 버전: http://mirror.apache-kr.org/hadoop/core/stable2/hadoop-2.6.0.tar.gz

구성할 하둡 분산 파일 시스템은 버전 1.X와 유사하며 다음과 같다.

[그림 Ⅱ-1-8] 하둡 분산 파일 시스템 구성도

[그림 Ⅱ-1-8] 하둡 분산 파일 시스템 구성도

hadoop 계정을 이용해 다운로드 받은 하둡 파일을 hadoop 홈 폴더로 이동시킨 후 다음과 같이 압축을 해제한다.

# 내려받은 압축 파일을 압축해제한다. sh> tar xvfs hadoop-2.6.0.tar.gz

필자는 압축을 해제한 하둡 폴더를 그대로 이용하지 않고 다음과 같이 링크를 이용했다.

# hadoop-2.6.0 폴더를 hadoop으로 링크를 생성한다. sh> ln -s hadoop-2.6.0 hadoop 2

[그림 Ⅱ-1-9] 하둡 홈 폴더 구조의 예

[그림 Ⅱ-1-9] 하둡 홈 폴더 구조의 예

네임 노드에 압축 해제한 하둡폴더를 다른 데이터 노드들에 전송한다.

# 하둡 폴더 전체를 데이터 노드 1에 전송한다. sh> scp -r hadoop-2.6.0 hadoop@datanode01.localdomain:./ # 하둡 폴더를 네임 노드에서와 같이 링크를 생성한다. sh> ssh hadoop@datanode01.localdomain "ln -s hadoop-2.6.0 hadoop2" #하둡 폴더 전체를 데이터 노드 2에 전송한다. sh> scp -r hadoop-2.6.0 hadoop@datanode02.localdomain:./ # 하둡 폴더를 네임 노드에서와 같이 링크를 생성한다. sh> ssh hadoop@datanode02.localdomain "ln-s hadoop-2.6.0 hadoop2"

네임 노드에서 하둡 설정을 모두 마친 후 위와 같이 하둡을 복사하면, 별도로 각 노드에서 설정 작업을 할 필요가 없다. 이미 하둡을 모든 데이터 노드에 전송했기 때문에 설정 작업을 마치면 conf폴더만 동기화한다.


하둡 2.X 설정과 실행

하둡 2.X 설정

하둡 2.X를 설정하기 앞서 필요한 환경 변수들을 먼저 등록해보자. 로그인 계정의 홈디렉토리로 이동한후 .bashrc 파일에 아래의 내용을 추가해보자. 참고로 1.X에서는 환경 변수명으로 $HADOOP_HOME을 사용했지만, 2.X에서는 충돌을 피하기 위해 대신 $HADOOP_PREFIX를 사용한다. 이 환경 변수에 하둡 설치 디렉토리를 지정해 주면 된다.


~/.bashrc

export HADOOP_PREFIX="/home/hadoop/hadoop2" export PATH=$PATH:$HADOOP_PREFIX/bin export PATH=$PATH:$HADOOP_PREFIX/sbin export HADOOP_MAPRED_HOME=${HADOOP_PREFIX} export HADOOP_COMMON_HOME=${HADOOP_PREFIX} export HADOOP_HDFS_HOME=${HADOOP_PREFIX} export YARN_HOME=${HADOOP_PREFIX}

.bashrc 파일의 변경 내용을 반영하려면 로그아웃후 다시 로그인을 하거나, 아래와 같은 명령을 실행하면 된다.

sh> source ~/.bashrc

하둡을 실행하기 위한 대부분의 설정 파일들은 $HADOOP_PREFIX내의 etc/hadoop 폴더에 있다.
$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh 파일은 하둡이 실행될 때 반영되는 시스템 환경 변수 들을 기록한다.


$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh

export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib" export HADOOP_PID_DIR="$HADOOP_PREFIX/pids"

$HADOOP_PREFIX/etc/hadoop/core-site.xml은 하둡 2.X 버전의 로그 파일, 네트워크 설정, 입출력 설정, 파일 시스템 설정, 압축 등에 관한 기본 설정을 한다. 파일 시스템과 맵리듀스(또는 YARN)에서 공통으로 사용하는 설정 파일이다. 아래 예제는 하둡 분산 파일 시스템을 실행하기 위한 최소 설정 예제다.


$HADOOP_HOME/conf/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://namenode.localdomain:8020</value></property></configuration>

$HADOOP_PREFIX/etc/hadoop/hdfs-site.xml은 하둡 2.X 버전에서 데이터를 관리하기 위한 설정 파일이며, 다음은 기본적인 설정 예제다.


$HADOOP_HOME/conf/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.namenode.name.dir</name><value>file:/home/hadoop/hadoop2/filesystem/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/home/hadoop/hadoop2/filesystem/data</value></property><property><name>dfs.replication</name>

<value>2</value></property><property><name>dfs.webhdfs.enabled</name><value>true</value></property></configuration>

$HADOOP_PREFIX/etc/hadoop/slaves는 데이터 노드가 실행될 서버를 지정한다. 다음은 slaves 설정 예제다.


$HADOOP_PREFIX/etc/hadoop/slaves

datanode01.localdomain datanode02.localdomain

그 외 설정 파일이나 항목이 많지만, 클라우드 스토리지를 구성하기 위한 최소한의 설정만 다뤘으며, 지금까지의 설정을 완료했다면, 다음과 같이 데이터 노드 서버에 해당 파일을 공유하자.

# hadoop-env.sh, core-site.xml, hdfs-site.xml, slaves 파일을 데이터 노드 1과 2에 전송해 파일을 동기화한다. sh> scp conf/hadoop-env.sh conf/core-site.xml conf/hdfs-site.xml masters slaves hadoop@datanode02:./hadoop/conf/

단 .bashrc 설정은 시스템 환경변수이기 때문에 위처럼 scp를 이용해 동기화하기보다는 직접 데이터 노드 서버에 접속해서 해주는 것을 권고한다.
지금까지 [그림 Ⅱ-1-8]와 같이 namenode.localdomain에 하둡 네임 노드, datanode01.localdomain과 datanode02.localdomain에 하둡 데이터 노드를 설치했다. 그리고 하둡 분산 파일 시스템을 실행하기 위한 기본적인 설정도 완료했다.


하둡 2.X 실행

하둡 분산 파일 시스템을 실행하기 위해 1.X 버전과 마찬가지로 네임 노드 포맷이 필요하다.

# 네임 노드를 포맷한다. sh> hdfs namenode -format


포맷 결과 화면

START_MSG: Starting NameNode STARTUP_MSG: host = namenode.localdomain/127.0.0.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 2.6.0 STARTUP_MSF: classpath= /home/hadoop/hadoop2/etc/hadoop:/home/hadoop/hadoop2/share/hadoop/common/lib/jettison- SHUTDOWN_MSG: Shutting down NameNode loclahost/127.0.0.1

네임 노드를 포맷한 후에는 모든 데이터 노드에서 파일 시스템 정보를 삭제해 줘야 한다. 그렇지 않으면 새로운 네임스페이스 포맷이 데이터 노드와 동기화될 수 없을 것이다.
다음은 하둡 분산 파일 시스템을 실행하는 명령어다.

# 하둡 분산 파일 시스템을 실행한다. sh> sbin/start-dfs/sh

Exception같은 오류 메시지가 나타나지 않으면 하둡 분산 파일 시스템이 정상적으로 실행된 것이다. 각 노드에 프로세스가 실행되지 않는다면, 역시 처음 해야 할 일은 노드별 로그 파일을 살펴보는 것이다. 로그가 영어로 작성돼 있지만 조금만 주의 깊게 살펴보면 모든 문제의 해답이 있다.

[그림 Ⅱ-1-10] 하둡 분산 파일 시스템 관리 화면

[그림 Ⅱ-1-10] 하둡 분산 파일 시스템 관리 화면

이제 http://namenode.localdomain:50070에 접속하자 [그림 Ⅱ-1-10]와 같은 관리 도구 화면이 보일 것이다. 관리 도구의 첫 페이지에서는 현재 운영중인 하둡 분산 파일 시스템의 요약 정보를 보여주며, 이 외에도 데이터 노드, 스넵샷, 기타 명령어를 실행할 수 있도록 해준다.