일상의 정리

'Hadoop/설치'에 해당되는 글 4건

  1. Hadoop Resource Manager HA 구성하기
  2. Hadoop Namenode HA 구성하기
  3. Zookeeper 설치
  4. CentOS/RHEL 8에 Hadoop 설치하기 1

Hadoop Resource Manager HA 구성하기

Hadoop/설치

Namenode 를 HA 구성하여 SPOF(Single Point Of Failure)에서 벗어났지만, 이번엔 리소스관리자인 YARN이 또다른 SPOF입니다. 이번에는 Resource Manager를 HA 구성하는 방법에 대하여 알아보겠습니다.

1. 서버 구성

1.1 yarn-site.xml

yarn-site.xml을 아래와 같이 수정해 줍니다.

<configuration>

	<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
		<value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/home/hadoop/hadoopdata/yarn/nm-local-dir</value>
	</property>
	<property>
		<name>yarn.resourcemanager.fs.state-store.uri</name>
		<value>/home/hadoop/hadoopdata/yarn/system/rmstore</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop01</value>
	</property>
 	<property>
		<name>yarn.web-proxy.address</name>
		<value>0.0.0.0:8089</value>
	</property>

	<!-- for Resource Manager HA configuration -->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>cluster1</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop01</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop02</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoop01:8088</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>hadoop02:8088</value>
	</property>
	<property>
		<name>hadoop.zk.address</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property>

</configuration>

1.5 설정파일 전송

모든 설정 파일을 다른 hadoop 서버로 전송해 줍니다. 아래 명령을 이용합니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

2. 하둡 실행

아래 명령으로 하둡을 시작 합니다.

start-dfs.sh
start-yarn.sh

3. Resource Manager 상태 확인

아래 명령으로 Resource Manager의 상태를 확인합니다.

$ yarn rmadmin -getServiceState rm1
active
 
$ yarn rmadmin -getServiceState rm2
standby

4. Fail-over 테스트

4.1 Active Resource 종료

hadoop01 에서 아래 명령으로 Resource Manager 를 강제 종료 합니다.

$ jps
148195 Jps
144490 NameNode
145722 WebAppProxyServer
146696 ResourceManager
144750 JournalNode
144942 DFSZKFailoverController

$ kill -9 146696

4.2 Resource Manager 상태 확인

다음 명령으로 rm1 과 rm2 의 상태를 확인합니다.

$ yarn rmadmin -getServiceState rm1
2020-09-10 12:44:27,784 INFO ipc.Client: Retrying connect to server: hadoop01/192.168.35.81:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hadoop01/192.168.35.81 to hadoop01:8033 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
 
$ yarn rmadmin -getServiceState rm2
active

위와 같이 rm1 에서는 실패하고 rm2에서는 active 로 표시되면 정상입니다.

4.2 Job 실행

다음 명령으로 Sample Job 을 실행해 봅니다.

yarn jar  $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000

정상적으로 실행이 되면 Fail-over 가 성공한 겁니다.

 

Hadoop Namenode HA 구성하기

Hadoop/설치

기존에 설치했던 Hadoop은 멀티 노드 구성이지만 Namenode가 1개로 Namenode에 문제가 생길 경우 서비스를 계속할 수 없습니다. 따라서 Namenode를 2개로 구성하여 문제 발생 시에도 계속 서비스가 가능하도록 설정하도록 하겠습니다.

1. 서버 구성

서버는 Multi-Server 구성 그대로 4대를 이용하며, 2대는 Namenode 로 3대는 Datanode로 구성합니다. 물리 서버는 4대인데 역할은 5대가 되므로 hadoop02는 Namenode 와 Datanode 를 겸합니다.

1.1 core-site.xml

core-site.xml 파일을 아래와 같이 변경해 줍니다.

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-cluster</value>
        </property>

        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
</configuration>

fs.defaultFS 부분에 나오는 hadoop-cluster 가 namenode 클러스터명이 됩니다. 이 값은 임의로 원하는 값으로 바꾸면 됩니다.

ha.zookeeper.quorum 부분에 저널노드의 서버명:포트 순으로 넣어 줍니다. 저널노드는 3, 5, 7등 복수의 홀수개로 구성되어야 합니다. 여기서는 hadoop01~03을 이용합니다.

1.2 hdfs-site.xml

hdfs-site.xml을 아래와 같이 변경해 줍니다

<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/datanode</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/journalnode</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>hadoop-cluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.hadoop-cluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
    <value>hadoop01:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
    <value>hadoop02:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
    <value>hadoop01:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
    <value>hadoop02:50070</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hadoop-cluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(/bin/true)</value>
  </property>
  <!-- Automatic failover configuration -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>

dfs.nameservices에는 namenode 클러스터 명을 기입합니다.

이 후 나오는 dfs.ha.nameservices.<cluster-id> 와 dfs.namenode.xxx.<cluster-id> 부분에도 namenode 클러스터명을 기입합니다.

dfs.namenode.rpc-address 는 네임노드 서비스의 Host address 와 port 입니다. 네임노드는 2개 까지 가능하므로 nn1 과 nn2의 호스트가 되는 hadoop01 과 hadoop02 를 기입합니다.

dfs.namenode.http-address 는 웹 서비스 어드레스와 port입니다.

dfs.namenode.shared.edits.dir 에는 저널노드를 입력합니다. 여기서는 저널노드가 hadoop01~03이므로 위와 같이 입력합니다.

dfs.ha.fencing.methods 부분은 주키퍼가 담당하므로 shell(/bin/true)로 변경해 줍니다.

1.3 yarn-env.sh

yarn-env.sh파일은 아래와 같이 Heap 사이즈만 수정해 줍니다. 최대값을 1기가로 설정하겠다는 의미입니다.

JAVA_HEAP_MAX=Xmx1000m

1.4 yarn-site.xml

yarn-site.xml파일을 아래와 같이 수정해 줍니다.

<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/home/hadoop/hadoopdata/yarn/nm-local-dir</value>
  </property>
  <property>
        <name>yarn.resourcemanager.fs.state-store.uri</name>
        <value>/home/hadoop/hadoopdata/yarn/system/rmstore</value>
  </property>
  <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
  </property>
  <property>
        <name>yarn.web-proxy.address</name>
        <value>0.0.0.0:8089</value>
  </property>

</configuration>

1.5 설정파일 전송

모든 설정 파일을 다른 hadoop 서버로 전송해 줍니다. 아래 명령을 이용합니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

2. 하둡 실행

2.1 기존 데이터 제거

기존 구성의 데이터와 충돌이 발생할 수 있으므로 아래 명령으로 모든 데이터를 제거합니다.

이 작업은 4대의 서버 모두에서 각각 수행합니다.

cd ~
rm -rf hadoopdata/*/*

2.2 주키퍼 포맷

하둡 실행 전에 먼저 주키퍼를 초기화 해 줍니다.

아래 명령으로  주키퍼를 포맷합니다. (이 작업은 hadoop01에서만 합니다).

$HADOOP_HOME/bin/hdfs zkfc -formatZK

2.3 저널노드 시작

다음 명령으로 저널 노드 서비스를 시작합니다.

이 작업은 hadoop01 ~ 03 까지 저널노드 서버 모두에서 각각 수행합니다.

$HADOOP_HOME/bin/hdfs --daemon start journalnode

2.4 Active 네임노드 실행

hadoop01 서버에서만 실행합니다.

먼저 다음 명령으로 hdfs를 포맷해 줍니다.

 

hdfs namenode -format

이제 Active 네임노드를 실행합니다.

$HADOOP_HOME/bin/hdfs --daemon start namenode

2.5 Standby 네임노드 실행

이제 대기중인 Standby 네임노드를 실행합니다. 이 작업은 hadoop02 서버에서 실행합니다.

먼저 아래 명령으로 Active 네임노드의 메타데이터를 복사해 옵니다.

hdfs namenode -bootstrapStandby

이 명령이 성공하면 아래와 같이 나옵니다.

=====================================================
About to bootstrap Standby ID nn2 from:
           Nameservice ID: hadoop-cluster
        Other Namenode ID: nn1
  Other NN's HTTP address: http://hadoop01:50070
  Other NN's IPC  address: hadoop01/192.168.35.122:8020
             Namespace ID: 455152348
            Block pool ID: BP-1247003603-192.168.35.122-1563595795113
               Cluster ID: CID-143cb533-296b-4297-9b48-dd7749f351f1
           Layout version: -63
       isUpgradeFinalized: true
=====================================================

메타데이터 복사가 완료되면 네임노드를 실행합니다.

$HADOOP_HOME/bin/hdfs --daemon start namenode

2.6 ZooKeeper 장애 컨트롤러 (zkfc) 시작

이제 네임노드 2군데(hadoop01, hadoop02)에서 zkfc를 시작해 줍니다. 주키퍼가 장애여부를 판단하여 장애 발생 시 Standby 네임노드를 Active로 바꾸어 줍니다.

 

$HADOOP_HOME/bin/hdfs --daemon start zkfc

2.7 데이터노드 시작

hadoop02 ~ 04 까지 데이터 서버에서 각각 아래 명령을수행합니다.

$HADOOP_HOME/bin/hdfs --daemon start datanode

2.8 yarn 서비스 시작

다음 명령으로 yarn서비스를 시작합니다.

이 작업은 hadoop01서버에서 실행합니다.

start-yarn.sh

2.9 히스토리 서버 시작

hadoop01,02 서버 에서 아래 명령으로 히스토리 서버를 시작합니다.

$HADOOP_HOME/bin/mapred --daemon start historyserver

3. 서버 구동 확인

3.1 commnd-line 확인

jps 명령으로 서버들이 잘 구동중인지 확인합니다.

아래와 같이 나오면 정상입니다.

<hadoop01>
14960 Jps
13585 WebAppProxyServer
14401 NameNode
12803 JournalNode
13189 ResourceManager
13022 DFSZKFailoverController
<hadoop02>
22949 DFSZKFailoverController
23061 NodeManager
18934 JobHistoryServer
22694 DataNode
22600 NameNode
22809 JournalNode
25305 Jps

3.2 Web 확인

웹브라우저에서 http://hadoop01:50070 과 http://hadoop02:50070 으로 확인합니다.

Active 와 Standby 가 표시 되어야 정상입니다.

Zookeeper 설치

Hadoop/설치

Apache ZooKeeper는 탄력적이고 안정적인 분산 조정을 가능하게하는 오픈 소스 소프트웨어입니다. 일반적으로 분산 시스템에서 구성 정보, 이름 지정 서비스, 분산 동기화, 쿼럼 및 상태를 관리하는 데 사용됩니다. 또한 분산 시스템은 ZooKeeper를 사용하여 합의, 리더 선택 및 그룹 관리를 구현합니다.

RHEL/CentOS 8에 Zookeeper를 설치하는 방법을 정리해 봅니다.

1. 서버 기본 설정

각 서버의 공통 설정은 Hadoop 설치를 참고합니다.

2. Zookeeper 설치

2.1 zookeeper 사용자 생성

보안을 생각해서 별도의 zk 사용자를 생성합니다.

아래 명령어로 새로운 사용자를 생성하고 암호를 설정해 줍니다:

useradd zk
passwd zk

이후에 아래와 같이 sshd_config를 수정해서 sshd를 통해 로그인이 불가능하도록 합니다.:

vi /etc/ssh/sshd_config

내용을 아래와 같이 수정합니다.

PermitRootLogin no
DenyUsers zk

아래와 같이 sshd 를 재시작합니다.

systemctl restart sshd

2.2 zookeeper 데이터 디렉토리 생성

zookeeper 가 사용하는 데이터 디렉토리를 생성합니다.

mkdir -p /data/zookeeper
chown zk:zk /data/zookeeper

2.3 zookeeper 다운로드

아래와 같이 zookeeper 최신 버전을 다운로드 합니다. 바이너리 버전을 다운로드해야 합니다.

wget http://mirror.kakao.com/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz

2.3 zookeeper 압축 해제

/opt 디렉토리에 zookeeper 를 압축해제 합니다.

cd /opt
tar xvzf apache-zookeeper-3.6.1-bin.tar.gz

압축 해제 후 아래와 같이 사용자 권한을 설정해 줍니다.

chown -R zk:zk apache-zookeeper-3.6.1-bin
ln -s apache-zookeeper-3.6.1-bin zookeeper
chown -h zk:zk zookeeper

2.3 zookeeper 설정 파일 생성

아래 명령으로 설정 파일을 편집합니다.

vi /opt/zookeeper/conf/zoo.cfg

아래 내용으로 입력하고 저장합니다.

initLimit=5
syncLimit=2
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

위에서 각각의 내용은 다음과 같습니다.

tickTime: tick 길이를 밀리 초 단위로 설정합니다. 
          tick은 ZooKeeper에서 하트 비트 사이의 길이를 측정하는 데 사용하는 시간 단위입니다.
          최소 세션 시간 제한은 tickTime의 두 배입니다.
dataDir: 메모리 내 데이터베이스의 스냅샷 및 업데이트를위한 트랜잭션 로그를 저장하는 데 사용되는 디렉터리를 지정합니다. 
         트랜잭션 로그에 대해 별도의 디렉터리를 지정하도록 선택할 수 있습니다.
clientPort: 클라이언트 연결을 수신하는 데 사용되는 포트입니다.
maxClientCnxns: 최대 클라이언트 연결 수를 제한합니다.

3. Zookeeper 시작 및 테스트

3.1 zookeeper 서비스 시작

아래 명령어로 zk 사용자로 전환 후 zookeeper 디렉토리로 갑니다.

su -l zk
cd /opt/zookeeper

아래와 같이 zkServer.sh 명령을 실행합니다.

bin/zkServer.sh start

아래와 같은 실행결과가 화면에 표시되면 정상입니다.

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

3.2 zookeeper 테스트

아래 명령어로 로컬 ZooKeeper 서버에 접속합니다.

bin/zkCli.sh -server 127.0.0.1:2181

아래와 같이 CONNECTED 프롬프트가 나오면 정상입니다.

Connecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]

위 프롬프트에서 help 명령어를 입력하고 엔터를 칩니다. 그럼 아래와 같이 표시됩니다.

[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit
    getAcl path
    close
    connect host:port

3.2 zookeeper 서비스 종료

아래 명령어로 ZooKeeper 서비스를 종료합니다.

bin/zkServer.sh stop

4. Zookeeper 시스템 서비스 파일 생성

systemd 서비스를 이용해서 시작/종료를 할 수 있도록 서비스 파일을 생성합니다.

아래 명령어로 시스템 서비스 파일을 편집합니다.

sudo vi /etc/systemd/system/zk.service

아래 내용을 입력합니다.

[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target

[Service]    
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=default.target

이제 다음 명령어로 ZooKeeper를 실행해 봅니다.

 

sudo systemctl start zk​

아래 명령으로 정상적으로 실행 중인지 확인 합니다.

sudo systemctl status zk

정상적으로 실행이 되면, 시스템이 부팅 시에도 자동으로 실행되도록 아래와 같이 등록해 줍니다.

sudo systemctl enable zk

싱글 노드에서의 설치는 완료 되었으므로, 멀티 노드 설정 전에 다음 명령으로 서비스를 종료합니다..

sudo systemctl stop zk

4. Zookeeper 멀티 노드 설정

이제 멀티 노드 설정을 해야 합니다. ZooKeeper 는 홀수대의 노드로 구성을 해야 하므로, 3대 혹은 5대와 같이 구성을 합니다. 여기서는 3대 구성을 설명합니다.

위의 싱글노드 설정을 모든 노드에 대해 한 이후에 아래와 같이 설정을 추가합니다.

아래 명령어로 설정파일을 편집합니다.

sudo vi /opt/zookeeper/conf/zoo.cfg

아래 내용을 입력합니다.

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888

설정이 완료되면 각각의 노드의 /data/zookeeper 아래 myid 라는 파일을 생성하고 차례대로 1, 2, 3 과 같이 입력해 줍니다.

아래 명령어로 myid파일을 생성합니다.

sudo vi /data/zookeeper/myid

아래와 같이 각각의 노드에 따라 숫자를 입력해 줍니다.

1번째 노드 

1

2번째 노드 

2

3번째 노드 

3

5. Zookeeper 멀티 노드 테스트

먼저 1번 2번 노드에서 아래 명령으로 로컬에 접속합니다.

bin/zkCli.sh -server 127.0.0.1:2181

노드 1에서 아래 명령을 입력합니다.

[zkshell:] create /zk_znode_1 sample_data

노드 1에서 다음 명령으로 생성된 내용을 확인해 봅니다.

[zkshell: ] get /zk_znode_1

노드 2에서 다음 명령으로 생성된 내용을 확인해 봅니다.

[zkshell: ] get /zk_znode_1

노드 1, 노드 2 양쪽 모두 동일한 결과가 나와서 동기화가 되는 것을 확인하면 정상입니다.

아래 명령으로 znode를 삭제해 줍니다.

[zkshell: ] delete /zk_znode_1

CentOS/RHEL 8에 Hadoop 설치하기

Hadoop/설치

Hadoop은 머신 클러스터에서 대규모 데이터 세트를 저장하고 처리하는 데 사용되는 무료 오픈 소스 및 Java 기반 소프트웨어 프레임 워크입니다. HDFS를 사용하여 데이터를 저장하고 MapReduce를 사용하여 이러한 데이터를 처리합니다. 주로 데이터 마이닝 및 머신 러닝에 사용되는 빅 데이터 도구의 생태계입니다. Hadoop Common, HDFS, YARN 및 MapReduce와 같은 네 가지 주요 구성 요소가 있습니다.

RHEL/CentOS 8에 Apache Hadoop을 설치하는 방법을 정리해 봅니다.

1. 서버 기본 설정

각각의 서버에서 공통적으로 해야 하는 설치 및 설정입니다

1.1 고정IP 설정

각각의 서버에 고정IP를 설정해 줍니다. (고정IP는 각각의 서비스 상황에 맞게 IP를 설정합니다. 여기서는 81~84를 부여합니다)

고정IP 설정을 위해 아래 명령으로 파일을 수정합니다:

vi /etc/sysconfig/network-scripts

수정할 내용은 아래와 같습니다:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"                            <-- dhcp 를 none로 변경
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp1s0"
UUID="d5f41bf4-de0a-43b3-b633-7e2ec6212e58"
DEVICE="enp1s0"
ONBOOT="yes"

IPADDR=192.168.122.81                       <-- 여기서 아래 부분 추가 
PREFIX=24
GATEWAY=192.168.122.1
DNS1=192.168.122.1
DNS2=1.1.1.1

파일을 저장한 후 위의 DEVICE 부분의 인터페이스를 재시작 해서 IP를 변경내용을 적용합니다.

ifdown enp1s&& ifup enp1s0

바뀐 IP가 제대로 적용되었는 지 아래 명령으로 확인합니다.

ip addr | grep enp1s0

2.2 hostname 설정

서비스를 구성하는 각각의 서버의 서버명을 설정합니다. (여기서는 4대의 서버로 hadoop01 ~ hadoop04로 설정합니다)

아래 명령으로 각각의 서버명을 설정해 줍니다:

hostnamectl set-hostname hadoop01

hostname 설정이 되었다면 이제 각 서버마다 host명으로 접근이 가능하도록 /etc/hosts 파일에 추가해 줍니다.

다음 명령으로 /etc/hosts 파일을 수정합니다.

vi /etc/hosts

아래와 같이 수정해 줍니다.

127.0.0.1   localhost

192.168.122.81 hadoop01
192.168.122.82 hadoop02
192.168.122.83 hadoop03
192.168.122.84 hadoop04

1.3 Java 설치

Hadoop 은 Java로 작성되었고 최신 버전은 Java11도 지원하지만 아직은 Java 8에서 안정적입니다. 아래와 같이 DNF를 이용해서 OpenJDK 8을 설치합니다:

dnf install java-1.8.0-openjdk.x86_64 ant -y

설치 후 아래 명령으로 제대로 설치 되었는 지를 테스트 합니다:

java -version

다음 출력이 나오면 OK:

openjdk version "1.8.0_262" 
OpenJDK Runtime Environment (build 1.8.0_262-b10) 
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

1.4 Hadoop 사용자 생성

보안을 생각해서 별도의 Hadoop 사용자를 생성합니다.

아래 명령어로 새로운 사용자를 생성합니다:

useradd -m hadoop

다음으로 생성한 사용자의 암호를 설정해 줍니다:

passwd hadoop

아래와 같이 사용자에 대한 암호를 2번 입력합니다:

Changing password for user hadoop. 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

1.5 Configure SSH Key-based Authentication

패스워드 없이 접속이 가능하도록 ssh 키를 설정합니다.

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

다음 명령으로 공개키와 개인키를 생성합니다.

ssh-keygen -t rsa

아래와 같이 물어 보게 되는 데 엔터만 치면 됩다.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a/og+N3cNBssyE1ulKK95gys0POOC0dvj+Yh1dfZpf8 hadoop@centos8
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              .  |
|    .   o o o    |
| . . o S o o     |
| o = + O o   .   |
|o * O = B =   .  |
| + O.O.O + +   . |
|   +=*oB.+  o   E|
+----[SHA256]-----+

생성된 공개키를 로컬의 authorized_keys 에 추가하고 권한을 변경해 줍니다.

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

다음 명령으로 패스워드 없이 접속이 되는 지 확인해 봅니다.

ssh localhost

처음 1번은 아래와 같이 호스트를 등록할 거냐고 물어 본니다. yes를 하고 엔터를 누르면 정상적으로 접속됩니다.

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:0YR1kDGu44AKg43PHn2gEnUzSvRjBBPjAT3Bwrdr3mw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sat Feb 1 02:48:55 2020
[hadoop@centos8 ~]$

1.6 Hadoop 설치

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

아래 명령어로 하둡 최신 버전(여기서는 3.3.0)을 다운 받습니다.

wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

다운이 완료되면 아래 명령어로 압축을 풀어 줍니다.

tar -xvzf hadoop-3.3.0.tar.gz

아래와 같이 심볼릭 링크를 생성해 줍니다.

ln -s hadoop-3.3.0 hadoop

이제 시스템의 Hadoop 과 Java 환경 변수를 설정해 줍니다.

아래 명령으로 ~/.bashrc 파일을 편집해 줍니다.

vi ~/.bashrc

다음 라인을 추가해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/
export HADOOP_HOME=/home/hadoop/hadoop 
export HADOOP_INSTALL=$HADOOP_HOME 
export HADOOP_MAPRED_HOME=$HADOOP_HOME 
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export HADOOP_YARN_HOME=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

파일을 저장하고 다음 명령으로 스크립트를 실행해 줍니다.

source ~/.bashrc

이번엔 하둡 환경변수 파일을 편집합니다.

vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

아래와 같이 JAVA_HOME 변수를 찾아 수정해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/

저장하고 닫아 줍니다. 이걸로 환경 설정은 끝입니다.

2. Single Node Cluster (유사분산 모드)

2.1 Configure Hadoop

먼저 Hadoop 홈 디렉토리 아래 namenode and datanode 디렉토리를 생성해야 합니다.

아래 명령으로 2개의 디렉토리를 생성해 줍니다:

mkdir -p ~/hadoopdata/hdfs/namenode 
mkdir -p ~/hadoopdata/hdfs/datanode

다음은 core-site.xml 파일에서 시스템 호스트명을 설정해 줍니다.:

vi $HADOOP_HOME/etc/hadoop/core-site.xml

아래와 같이 자신의 시스템 호스트명을 설정해 줍니다.

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop01:9000</value>
        </property>
</configuration>

파일을 저장 후 hdfs-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래 처럼 NameNode 와 DataNode 디렉토리를 설정해 줍니다:

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/datanode</value>
        </property>
</configuration>

파일을 저장합니다. mapred-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

아래처럼 수정합니다:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
</configuration>

파일을 저장하고, 이번에는 yarn-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

다음과 같이 변경합니다:

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

저장하면 이제 다 되었습니다.

2.2 Start Hadoop Cluster

Hadoop 클러스터를 시작하기 전에 먼저 hadoop 사용자로 Namenode를 포맷해야 합니다.

Namenode를 포맷하기 위해 아래 명령어를 실행합니다:

hdfs namenode -format

아래 내용이 표시되면 성공입니다:

2020-02-05 03:10:40,380 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 
2020-02-05 03:10:40,389 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown. 
2020-02-05 03:10:40,389 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************ 
SHUTDOWN_MSG: Shutting down NameNode at hadoop.tecadmin.com/45.58.38.202
************************************************************/

Namenode 포맷 후에, 아래 명령으로 hadoop 클러스트를 시작합니다:

start-dfs.sh

HDFS 성공적으로 시작되면, 아래와 같은 내용이 표시됩니다:

Starting namenodes on [hadoop.tecadmin.com] 
hadoop.tecadmin.com: Warning: Permanently added 'hadoop.tecadmin.com,fe80::200:2dff:fe3a:26ca%eth0' (ECDSA) to the list of known hosts. 
Starting datanodes 
Starting secondary namenodes [hadoop.tecadmin.com]

다음으로 YARN 서비스를 시작합니다:

start-yarn.sh

아래와 같은 메시지가 출력됩니다:

Starting resourcemanager 
Starting nodemanagers

2.2 상태 및 동작 확인

jps 명령으로 Hadoop 서비스의 상태를 체크해 볼 수 있습니다:

jps

다음과 같이 실행중인 서비스가 표시됩니다:

7987 DataNode 
9606 Jps
8183 SecondaryNameNode
8570 NodeManager
8445 ResourceManager 
7870 NameNode

아래 명령을 실행해서 잘 동작하는 지 확인해 봅니다:

cd $HADOOP_HOME
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000

정상적으로 실행되었다면 아래와 같이 표시 됩니다.

Job Finished in 36.294 seconds
Estimated value of Pi is 3.14250000000000000000

2.3 Configure Firewall

Hadoop은 포트 9870 과 8088을 사용하므로 이 포트들을 방화벽에서 허용해 주어야 합니다.

아래 명령으로 방화벽에서 허용해 줍니다:

firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8088/tcp

그리고 방화벽 규칙을 다시 로드해서 적용해 줍니다:

firewall-cmd --reload

2.4 Access Hadoop Namenode and Resource Manager

웹브라우저를 열어 http://your-server-ip:9870 으로 Namenode에 접속합니다. 그럼 아래와 같은 화면이 표시됩니다:

리소스 관리자에 접근하려면 http://your-server-ip:8088 로 접속합니다. 아래 화면이 표시됩니다:

2.5 Verify the Hadoop Cluster

Hadoop cluster 에 대한 설치 및 설정은 완료되었습니다. 이제 Hadoop을 테스트 하기 위해 HDFS 에 일부 디렉토리를 생성합니다.

다음 명령으로 테스트 디렉토리를 생성합니다:

hdfs dfs -mkdir /test1
hdfs dfs -mkdir /test2

그리고 아래 명령으로 위 디렉토리를 표시합니다:

hdfs dfs -ls /

다음과 같이 표시됩니다:

Found 2 items 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:25 /test1 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:35 /test2

웹의 Hadoop Namenode에서도 위 디렉토리가 표시되어야 합니다.

Namenode 웹페이지에서, Utilities => Browse the file system 을 클릭합니다. 아래와 같이 디렉토리가 표시되는 것을 확인할 수 있습니다:

2.6 분석 프로그램 실행

테스트를 위해 단어개수를 분석하는 예제를 실행합니다. 맵리듀스 job을 실행하기 위해서 HDFS 디렉토리를 생성합니다.

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /user/root/conf
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal $HADOOP_HOME/README.txt /input
hdfs dfs -ls /input

다음 명령으로 단어 개수를 분석하는 프로그램을 실행합니다:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input/README.txt ~/wordcount-output

실행이 완료되면 아래 명령으로 결과를 확인합니다:

hdfs dfs -ls ~/wordcount-output
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-09-03 03:43 /home/hadoop/wordcount-output/_SUCCESS
-rw-r--r--   1 hadoop supergroup        188 2020-09-03 03:43 /home/hadoop/wordcount-output/part-r-00000

hdfs dfs -cat ~/wordcount-output/part-r-00000

다음과 같이 표시됩니다:

For     1
Hadoop, 1
about   1
and     1
at:     2
http://hadoop.apache.org/       1
https://cwiki.apache.org/confluence/display/HADOOP/     1
information     1
latest  1
our     2
please  1
the     1
visit   1
website 1
wiki,   1

2.7 Stop Hadoop Cluster

Hadoop Namenode 와 Yarn 서비스는 stop-dfs.sh  stop-yarn.sh 명령으로 중지할 수 있습니다.

아래 명령으로 Hadoop Namenode 서비스를 중지합니다:

stop-dfs.sh

아래 명령으로 Hadoop Resource Manager  서비스를 중지합니다:

stop-yarn.sh

3. Multi Node Cluster (완전 분산 모드)

지금까지의 작업으로 Single Node Cluster 로 동작하는 Hadoop 설치는 완료되었습니다. 이제는 여러대의 노드로 구성된 Hadoop 설정을 하도록 하겠습니다.

3.1 ssh 공개키 설정

아래 명령으로 master(hadoop01)의 공개키를 모든 datanode로 복사합니다:

scp -rp ~/.ssh/authorized_keys hadoop@hadoop02:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop03:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop04:~/.ssh/authorized_keys

3.2 하둡 설정

3.2.1 master (마스터 노드) 설정

master 노드에서 hdfs-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래의 내용을 설정합니다.

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/namenode</value>
                <final>true</final>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/datanode</value>
                <final>true</final>
        </property>
</configuration>

master 노드에서 yarn-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

아래의 내용을 설정합니다.

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>hadoop01:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address</name>
                <value>hadoop01:8030</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address</name>
                <value>hadoop01:8031</value>
        </property>

</configuration>

아래 명령으로 workers 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/workers

아래와 같이 설정해 줍니다.

hadoop02
hadoop03
hadoop04

3.2.1 slaves (슬레이브 노드) 설정

Master 설정 파일을 모두 슬레이브로 복사해 주어야 합니다.

아래 명령으로 복사해 줍니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

아래 명령으로 기존 HDFS 저장소를 제거해 줍니다.

rm -rf ~/hadoopdata/hdfs/*

3.3 방화벽 설정

Hadoop 은 내부적으로 랜덤하게 포트를 오픈하고 사용하므로, 다음 명령으로 같은 IP 대역에 대해 방화벽을 오픈해 줍니다. (Master/Slave 모두)

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.122.0/24 port port="80-65535" protocol="tcp" accept'

다음 명령으로 방화벽을 다시 로드합니다.

firewall-cmd --reload

3.4 동작

다음 명령으로 마스터 노드에서 Hadoop을 실행합니다.

start-dfs.sh

정상적으로 실행되면 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop01 ~]$ jps
43112 SecondaryNameNode
43241 Jps
42876 NameNode

각가의 Slave에서도 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop02 ~]$ jps
36262 Jps
36207 DataNode

3.5 Multi Node 확인

웹브라우저에서 data node를 확인합니다. 아래처럼 3개가 표시되면 정상입니다.