본문 바로가기

Data engineering/Apache Hadoop

Apache Hadoop1 설치

1. 실행 모드 결정

Hadoop 설치하기 전에 우선 이를 어떤 방식으로 실행할지를 결정해야한다. 실행 모드는 Standalone, Pseudo-distributed, Fully distributed가 있다.

  1. Standalone(독립실행모드): Hadoop의 기본 실행 모드이다. 환경설정 파일에 아무런 설정을 하지 않고 실행하면 로컬 장비에서만 실행되기 때문에 로컬 모드라고도 한다. Hadoop에서 제공하는 데몬을 구동하지 않기 때문에 분산환경을 고려한 테스트는 불가능하다(본 블로그에서는 이를 다루지 않을 예정).
  2. Pseudo-distributed(가상분산모드): 하나의 장비에 모든 환경설정을 하고, Hadoop 서비스도 이 장비에서만 제공하는 방식을 말한다. HDFS와 MapReduce와 관련된 데몬을 하나의 장비에서만 실행하게 된다(본 블로그에서는 이를 다루지 않을 예정).
  3. Fully distributed(완전분산모드): 여러 대의 장비에 Hadoop이 설치된 경우로, 라이브 서비스를 하게 될 경우 이와 같은 방식으로 구성된다.

2. Hadoop 다운로드

하둡 설치 파일은 다음 사이트에서 내려받을 수 있다.

 

https://archive.apache.org/dist/hadoop/core/

 

설치 파일을 내려받는 방법은 2가지이다. 우선 HostOS에 gzip 파일을 내려받고 scp 통신으로 가상 서버에 전송을 하거나, 가상 서버에서 아래와 같이 wget 명령어를 사용하여 내려받는 방법이 있다.

$wget https://archive.apache.org/dist/hadoop/core/hadoop-1.2.1/hadoop-1.2.1.tar.gz

3. Host 파일 수정

Hadoop은 서버 간에 SSH 프로토콜을 이용해 통신을 수행한다. SSH로 다른 서버에 접근할 때는 IP 혹은 호스트명으로 접속할 수 있다.

 

IP로 SSH 접속을 하거나 Hadoop 환경설정 파일을 정의할 경우 별다른 문제가 없다. 그러나, 호스트명을 이용하면 훨씬 수월하게 환경설정 파일을 정의할 수 있다.

 

호스트명을 이용할 경우 서버 간에 호스트명이 어떠한 IP를 보유하고 있는지 정의해야한다. 이를 설정하는 파일이 Host 파일이다. 다음은 실습에서 사용하는 호스트명과 이에 해당하는 IP를 정의한 것이다.(실습에서 사용되는 cluster의 정보는 cluster info 포스팅을 참고하길….)

#/etc/hosts
127.0.0.1 localhost

192.168.0.100 master
192.168.0.101 sn01
192.168.0.102 sn02
192.168.0.103 sn03

# 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

4. Java 설치

Hadoop을 설치하려면 반드시 Java가 미리 설치돼 있어야 한다. Hadoop은 Java로 개발됐고, 데몬을 구동할 때 JAR 파일을 수정하기 때문에 반드시 자바가 필요하다. JAVA는 JDK 1.7 버전 이상을 권장한다. 본 실습에서는 Open JDK 8을 설치할 것이다.

 

Open JDK 8의 설치는 아래와 같이 2단계로 나뉜다.

 

1. Java 설치

#Java 설치
$sudo apt-get update
$sudo apt-get install openjdk-8-jdk

#설치 확인
$java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-8u362-ga-0ubuntu1~18.04.1-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)

 

2. 환경변수 설정

Java를 사용하기 위해선 JAVA_HOME이라는 환경변수를 설정해야한다. 환경변수를 설정하는 것은 운영체제가 컴퓨터의 어떤 경로에서든지 파일을 인식하도록 하는 것이다.즉, Java 환경변수를 등록하는 것은 컴퓨터의 어떤 경로에서든 운영체제가 Java를 인식하여 javac, java와 같은 툴을 사용할 수 있게 하기 위함이다.

 

다음은 ubunt 18.0.6에 Java 환경변수를 설정하는 과정이다.

 

우선 Java의 설치 경로를 확인해야한다.

$readlink -f $(which java)
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java #여기서 ~/bin/java는 제외

경로를 확인하면 확인한 경로를 /etc/profile 파일 안에 JAVA_HOME으로 등록해야 한다.

$sudo vi /etc/profile
#/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export PATH=$PATH:$JAVA_HOME/bin
$source /etc/profile

$echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64/jre

$echo $PATH | grep java
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin

5. SSH 설정

Hadoop은 데몬을 실행할 때 ssh를 사용하여 각 노드들끼리 통신하기 때문에 미리 ssh 공개키 설정을 해두면 데몬 실행 수행시 각 노드의 비밀번호를 입력하지 하는 수고를 덜 수 있다.

 

공개키는 사용자 계정의 홈 디렉터리에 있는 .ssh 폴더에 생성된다. 생성된 공개키를 ssh-copy-id 명령어를 이용해 다른 서버에 복사하면 모든 설정이 끝난다. 다음은 공개키 설정 방법이다.

#master 노드에서만 진행
$ssh-keygen -t rsa -N ""
$ssh-copy-id -i [복사할 공개키 경로] [대상 서버 계정]@[대상 서버]

6. Hadoop 환경설정 파일 수정

이제 Hadoop 환경설정 파일만 수정하면 모든 설치 작업이 마무리된다.

 

우선 환경설정 파일을 수정하기 위해서 내려받은 Hadoop gzip 파일이 있는 경로로 가서 다음과 같은 명령어를 사용하여 압축을 풀어야한다.

$tar xzf ~/hadoop-1.2.1.tar.gz

압축 풀기를 완료한 후 ~/hadoop-1.2.1/conf을 확인하면 환경설정과 관련된 여러 파일을 확인할 수 있다. 이 중 Hadoop1 설치와 관련된 주요 파일에 대한 설명은 다음과 같다.

  • hadoop-env.sh: 하둡을 실행할는 shell script 파일에서 필요한 환경 변수를 설정한다. Hadoop 홈 디렉터리의 아래에 있는 bin 디렉터리에 있는 shell script 파일이 이를 사용한다. 이 파일에는 JDK 경로, 클래스 경로, 데몬 실행 옵션 등 다양한 환경변수를 설정할 수 있다.
  • masters: 보조네임노드를 실행할 노드를 설정한다.
  • slaves: 데이터노드를 실행할 노드를 설정한다.
  • core-site.xml: HDFS와 MapReduce에서 공통적으로 사용할 환경 정보를 설정한다.
  • hdfs-site.xml: HDFS에서 사용할 환경 정보를 설정한다.
  • mapred-site.xml: MapReduce에서 사용할 환경 정보를 설정한다.

6.1 hadoop-env.sh 수정

이 과정에서는 JDK가 설치된 경로만 설정한다. Hadoop 설치를 안내하는 많은 블로거나 유저들이 HADOOP_HOME 설정도 같이 하는 경우가 있지만, 필자는 Hadoop을 사용하여 연구를 진행할 때 여러 Hadoop의 버전을 동시에 사용했기에 이를 사용하지 않았다. 따라서, HADOOP_HOME 설정은 진행하지 않겠다.

 

다음은 hadoop-env.sh의 설정이다.

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

6.2 core-site.xml 수정

다음은 core-site.xml 설정이다. 여기서 name은 설정 이름이고 value는 설정값이다.

<?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://master:9000</value>
	</property>
	<property>
		<name>hadooop.tmp.dir</name>
		<value>$HADOOP_HOME/hadoop-1.2.1/tmp</value>
	</property>
</configuration>

hadoop-1.2.1의 core-site.xml에서 사용되는 각 옵션에 대한 설명과 기본값은 공식 사이트에서 제공되지 않고 있다.(내가 못찾은 것일지도..) 따라서 필요하면 아래의 사이트에 유사하게 기술되어 있으니 참고 바란다.

https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/core-default.xml

6.3 hdfs-site.xml 수정

다음은 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.replication</name>
		<value>3</value>
	</property>
	<property>
		<name>dfs.http.address</name>
		<value>master:50070</value>
	</property>
	<property>
		<name>dfs.secondary.http.address</name>
		<value>master:50090</value>
	</property>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>$HADOOP_HOME/data/namenode</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>$HADOOP_HOME/data/datanode</value>
	</property>
</configuration>

hadoop-1.2.1의 hdfs-site.xml 또한사용되는 각 옵션에 대한 설명과 기본값은 공식 사이트에서 제공되지 않고 있다. 그러니 이 또한 필요하면 아래의 사이트에 유사하게 기술되어 있으니 참고 바란다.

https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

6.4 mapred-site.xml 수정

다음은 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>master:9001</value>
	</property>
</configuration>

mapred-1.2.1의 mapred-site.xml 또한사용되는 각 옵션에 대한 설명과 기본값은 공식 사이트에서 제공되지 않고 있다. 필요하면 아래의 사이트를 참고하시길…

https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

6.5 masters 수정

masters 파일에는 아래와 같이 보조네임노드를 실행할 서버를 설정한다. 2개 이상의 보조네임노드를 설정할 수 있으며, 한 줄에 하나씩 노드를 기재하면 된다. 노드는 호스트명 혹은 IP로 기재한다.

master

6.6 slaves 수정

slaves 파일에는 아래와 같이 데이터노드를 실행할 서버를 설정한다. 2개 이상의 데이터노드를 설정할 수 있으며, 한 줄에 하나씩 노드를 기재하면 된다. 노드는 호스트명 혹은 IP로 기재한다.

sn01
sn02
sn03

6.7 배포

master 노드(네임노드 담당 서버)에서 모든 수정 작업이 완료되면, 다음과 같이 scp 명령어를 이용해 모든 데이터노드 서버로 네임노드의 하둡 환경설정 파일을 전송한다.

$scp ~/hadoop-1.2.1 [대상 서버 계정]@[대상 서버]:[대상 디렉터리 경로]

7. Hadoop 실행

모든 설정 수정이 완료되고 네임노드를 초기화한 후 모든 데몬을 실행하면 Hadoop이 실행된다. Hadoop의 명령어는 Hadoop의 홈 디렉터리에 있는 bin 디렉터리에 저장돼 있다.

 

네임노드 초기화 방법은 다음과 같으며 정상적으로 실행됐다면 아래의 로그가

$./bin/hadoop namenode -format

23/03/23 04:45:50 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = <https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2> -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.8.0_362
************************************************************/
Re-format filesystem in /tmp/hadoop-hjkim/dfs/name ? (Y or N) Y
23/03/23 04:45:53 INFO util.GSet: Computing capacity for map BlocksMap
23/03/23 04:45:53 INFO util.GSet: VM type       = 64-bit
23/03/23 04:45:53 INFO util.GSet: 2.0% max memory = 932184064
23/03/23 04:45:53 INFO util.GSet: capacity      = 2^21 = 2097152 entries
23/03/23 04:45:53 INFO util.GSet: recommended=2097152, actual=2097152
23/03/23 04:45:53 INFO namenode.FSNamesystem: fsOwner=hjkim
23/03/23 04:45:53 INFO namenode.FSNamesystem: supergroup=supergroup
23/03/23 04:45:53 INFO namenode.FSNamesystem: isPermissionEnabled=true
23/03/23 04:45:53 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
23/03/23 04:45:53 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
23/03/23 04:45:53 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
23/03/23 04:45:53 INFO namenode.NameNode: Caching file names occuring more than 10 times
23/03/23 04:45:53 INFO common.Storage: Image file /tmp/hadoop-hjkim/dfs/name/current/fsimage of size 111 bytes saved in 0 seconds.
23/03/23 04:45:53 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/tmp/hadoop-hjkim/dfs/name/current/edits
23/03/23 04:45:53 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/tmp/hadoop-hjkim/dfs/name/current/edits
23/03/23 04:45:53 INFO common.Storage: Storage directory /tmp/hadoop-hjkim/dfs/name has been successfully formatted.
23/03/23 04:45:53 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/127.0.1.1
************************************************************/

이제 아래와 같이 bin 디렉터리에 있는 start-all.sh shell을 실행하면 관련된 모든 데몬이 실행된다.

$./bin/start-all.sh

starting namenode, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-namenode-master.out
sn02: starting datanode, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-datanode-sn02.out
sn03: starting datanode, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-datanode-sn03.out
sn01: starting datanode, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-datanode-sn01.out
master: starting secondarynamenode, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-secondarynamenode-master.out
starting jobtracker, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-jobtracker-master.out
sn01: starting tasktracker, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-tasktracker-sn01.out
sn02: starting tasktracker, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-tasktracker-sn02.out
sn03: starting tasktracker, logging to /home/hjkim/hadoop-1.2.1/libexec/../logs/hadoop-hjkim-tasktracker-sn03.out

데몬들이 정상적으로 실행됐다면 다음과 같이 확인할 수 있다.

$jps

#master
20998 NameNode
21270 SecondaryNameNode
21528 Jps
21353 JobTracker

#slaves
12179 TaskTracker
12232 Jps
12043 DataNode

8. 예제 실행

Hadoop은 개발자들이 이를 쉽게 배울 수 있게 예제 코드와 예제 코드를 패키징한 jar 파일을 제공한다. 본 포스팅에서는 예제로 제공되는 wordcount라는 단어 개수를 세는 프로그램을 이용해 hadoop-env.sh 파일의 단어 개수를 계산해보겠다. 예제를 실행하기 전에 우선 다음과 같이 hadoop-env.sh 파일을 HDFS에 업로드 해야한다.

$./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh

파일 업로드가 완료되면 다음과 같이 Hadoop 명령어를 이용해 jar 파일을 실행한다.

$./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount conf/hadoop-env.sh wordcount_output

23/03/23 17:37:15 INFO input.FileInputFormat: Total input paths to process : 1
23/03/23 17:37:15 INFO util.NativeCodeLoader: Loaded the native-hadoop library
23/03/23 17:37:15 WARN snappy.LoadSnappy: Snappy native library not loaded
23/03/23 17:37:16 INFO mapred.JobClient: Running job: job_202303231623_0001
23/03/23 17:37:17 INFO mapred.JobClient:  map 0% reduce 0%
23/03/23 17:37:20 INFO mapred.JobClient:  map 100% reduce 0%
23/03/23 17:37:28 INFO mapred.JobClient:  map 100% reduce 100%
23/03/23 17:37:28 INFO mapred.JobClient: Job complete: job_202303231623_0001
23/03/23 17:37:28 INFO mapred.JobClient: Counters: 29
23/03/23 17:37:28 INFO mapred.JobClient:   Map-Reduce Framework
23/03/23 17:37:28 INFO mapred.JobClient:     Spilled Records=342
23/03/23 17:37:28 INFO mapred.JobClient:     Map output materialized bytes=2925
23/03/23 17:37:28 INFO mapred.JobClient:     Reduce input records=171
23/03/23 17:37:28 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=3753127936
23/03/23 17:37:28 INFO mapred.JobClient:     Map input records=58
23/03/23 17:37:28 INFO mapred.JobClient:     SPLIT_RAW_BYTES=113
23/03/23 17:37:28 INFO mapred.JobClient:     Map output bytes=3650
23/03/23 17:37:28 INFO mapred.JobClient:     Reduce shuffle bytes=2925
23/03/23 17:37:28 INFO mapred.JobClient:     Physical memory (bytes) snapshot=273129472
23/03/23 17:37:28 INFO mapred.JobClient:     Reduce input groups=171
23/03/23 17:37:28 INFO mapred.JobClient:     Combine output records=171
23/03/23 17:37:28 INFO mapred.JobClient:     Reduce output records=171
23/03/23 17:37:28 INFO mapred.JobClient:     Map output records=300
23/03/23 17:37:28 INFO mapred.JobClient:     Combine input records=300
23/03/23 17:37:28 INFO mapred.JobClient:     CPU time spent (ms)=580
23/03/23 17:37:28 INFO mapred.JobClient:     Total committed heap usage (bytes)=221249536
23/03/23 17:37:28 INFO mapred.JobClient:   File Input Format Counters
23/03/23 17:37:28 INFO mapred.JobClient:     Bytes Read=2490
23/03/23 17:37:28 INFO mapred.JobClient:   FileSystemCounters
23/03/23 17:37:28 INFO mapred.JobClient:     HDFS_BYTES_READ=2603
23/03/23 17:37:28 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=116671
23/03/23 17:37:28 INFO mapred.JobClient:     FILE_BYTES_READ=2925
23/03/23 17:37:28 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=2237
23/03/23 17:37:28 INFO mapred.JobClient:   Job Counters
23/03/23 17:37:28 INFO mapred.JobClient:     Launched map tasks=1
23/03/23 17:37:28 INFO mapred.JobClient:     Launched reduce tasks=1
23/03/23 17:37:28 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=7975
23/03/23 17:37:28 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
23/03/23 17:37:28 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=2310
23/03/23 17:37:28 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
23/03/23 17:37:28 INFO mapred.JobClient:     Data-local map tasks=1
23/03/23 17:37:28 INFO mapred.JobClient:   File Output Format Counters
23/03/23 17:37:28 INFO mapred.JobClient:     Bytes Written=2237

결과는 다음과 같은 명렁어를 사용해서 확인하면 된다.

 

 

$./bin/hadoop dfs -cat wordcount_output/part-r-00000

'Data engineering > Apache Hadoop' 카테고리의 다른 글

MapReduce  (0) 2023.03.31
HDFS(Hadoop Distributed File System)  (0) 2023.03.24
Apache Hadoop 개요  (0) 2023.03.20