High Availability(HA) Hadoop Cluster를 설치하는 방법에 대해 알아본다.
총 세 대의 CentOS 서버를 사용하여 설치한다.
node1 (192.168.56.102) | node2 (192.168.56.103) | node3 (192.168.56.104) |
zookeeper | zookeeper | zookeeper |
NameNode | NameNode | JournalNode |
JournalNode | JournalNode | Node Manager |
Resource Manager | Node Manager | DataNode |
DataNode | DataNode |
<사전작업>
root 계정으로도 설치가 가능하지만 되도록 hadoop 계정을 새로 만들어서 설치하는 것을 권장한다.
adduser hadoop
passwd hadoop
모든 서버에서 다음과 같이 IP와 호스트네임을 적어준다.
[root@node1 ~]# vi /etc/hosts
192.168.56.102 hadoop01
192.168.56.103 hadoop02
192.168.56.104 hadoop03
jdk 다운로드 후 /etc/profile 에 java 경로 관련 환경변수를 적용한다.
[root@node1 ~]# vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASS_PATH="."
[root@node1 ~]# java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)
SSH 공개키를 네임노드가 설치될 hadoop01, hadoop02 호스트에 각각 설정해준다. 비밀번호 없이 Enter.
hadoop@node1 ~:$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
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.
hadoop@node2 ~:$ ssh-keygen -t rsa
공개키는 사용자 계정의 홈 디렉터리에 있는 .ssh 폴더에 생성된다. 이렇게 생성된 공개키를 다른 서버에 복사한다.
ssh-copy-id -i [복사할 공개키 경로] [대상 서버 계정]@[대상 서버]
hadoop@node1 ~:$ ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@hadoop02
Are you sure you want to continue connecting (yes/no)? yes
hadoop@node1 ~:$ ssh hadoop02
Last login: Thr Mar 10 16:57:59 2022 from hadoop01
위와 같이 비밀번호를 묻지 않고 바로 다른 서버에 접속하는 것을 볼 수 있다.
따라서 ssh-copy-id 명령어를 통해 모든 서버에 공개키 복사(hadoop02, hadoop03)
<Zookeeper 설치>
네임노드 HA를 구성하려면 zookeeper를 우선적으로 설치해야한다. 모든 서버(hadoop01, hadoop02, hadoop03)에 설치
모든 서버에 zookeeper 계정 생성
adduser zookeeper
passwd zookeeper
zookeeper 계정에도 SSH 공개키를 설정해준다.
zookeeper@node1 ~:$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zookeeper/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/zookeeper/.ssh/id_rsa.
Your public key has been saved in /home/zookeeper/.ssh/id_rsa.pub.
zookeeper@node2 ~:$ ssh-keygen -t rsa
zookeeper@node1 ~:$ ssh-copy-id -i /home/zookeeper/.ssh/id_rsa.pub zookeeper@hadoop02
Are you sure you want to continue connecting (yes/no)? yes
zookeeper@node1 ~:$ ssh hadoop02
Last login: Thr Mar 10 17:25:16 2022 from hadoop01
zookeeper 홈디렉터리에 설치파일 다운로드 후 압축 풀기
zookeeper@node1 ~:$ wget "https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3.tar.gz"
zookeeper@node1 ~:$ tar -xvzf zookeeper-3.6.3.tar.gz
bin 디렉터리에는 zookeeper 클라이언트와 서버를 실행하기 위한 셸 스크립트 파일이 들어 있고 zookeeper 환경 설정을 위한 파일은 conf에 있다. zookeeper를 실행하려면 zoo.cfg 파일이 conf에 있어야 하기 때문에 zoo.cfg 를 작성한다.
zookeeper@node1:~$ cd /home/zookeeper/zookeeper-3.6.3
zookeeper@node1 zookeeper-3.6.3:~/zookeeper-3.6.3$ cp conf/zoo_sample.cfg conf/zoo.cfg
zookeeper@node1 zookeeper-3.6.3:~/zookeeper-3.6.3$ vi conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/zookeeper/apache-zookeeper-3.6.3-bin/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
maxClientCnxns=0
maxSessionTimeout=180000
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
- dataDir : zookeeper 스냅샷 저장 경로. zookeeper 계정의 홈 디렉터리로 경로를 변경한다.
- server.X : 멀티서버로 구성할 서버를 등록하는 옵션. "server. " 뒤의 숫자는 해당 서버의 아이디를 의미한다. 첫번째 포트인 2888은 zookeeper의 리더에 접속하기 위한 포트이며 두번째 포트 3888은 리더를 결정하는데 사용한다.
server.X 포트 뒤에 공백이 들어가지 않도록 주의하자. zookeeper 서버가 정상적으로 실행되지 않는다.
위에서 부여한 서버별 아이디(숫자)는 zookeeper 홈 디렉터리에도 저장되어 있어야 한다.
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ mkdir data
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ vi data/myid
1
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ cat data/myid
1
위의 설정을 세 개의 서버 모두 적용(zookeeper 계정으로 로그인)
[zookeeper@node1 ~]$ tar zvcf zookeeper.tar.gz zookeeper-3.6.3-bin
[zookeeper@node1 ~]$ scp zookeeper.tar.gz zookeeper@hadoop02:/home/zookeeper
[zookeeper@node1 ~]$ scp zookeeper.tar.gz zookeeper@hadoop03:/home/zookeeper
[zookeeper@node1 ~]$ ssh hadoop02 "cd /home/zookeeper; tar zxvf zookeeper.tar.gz; mkdir data"
[zookeeper@node1 ~]$ ssh hadoop03 "cd /home/zookeeper; tar zxvf zookeeper.tar.gz; mkdir data"
마지막으로 zookeeper 서버를 실행하면 zookeeper 클러스터 구성이 완료된다.
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-3.6.3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
서버 상태 확인. 각 서버에서 다음 명령어를 통해 어떤 서버가 leader인지 follower 인지 알 수 있다.
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-3.6.3/bin/../conf/zoo.cfg Mode: leader
<Hadoop version3 설치>
모든 서버에 hadoop 계정으로 로그인하여 다운로드 후 압축 해제.
[hadoop@node1 ~]$ wget "apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz"
[hadoop@node1 ~]$ tar zxvf hadoop-3.2.1.tar.gz
모든 서버에 HADOOP_HOME 추가(root 계정으로 수정)
홈 디렉터리는 무조건 PATH 위에 적어주어야 한다. 그렇지 않으면 정상적으로 PATH가 잡히지 않는다.
[root@node1 ~]# vi /etc/profile
export HADOOP_HOME=/home/hadoop/hadoop-3.2.1
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
[root@node1 ~]# source /etc/profile //적용
모든 서버에서 환경설정 파일 수정.
[hadoop@node1 ~]# vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export HADOOP_PID_DIR=/home/hadoop/hadoop-3.2.1/pids
export HADOOP_SECURE_PID_DIR=${HADOOP_PID_DIR}
worker로 사용할 호스트명 설정. master 파일은 HA를 구성하기 때문에 작성할 필요가 없다.
[hadoop@node1 ~]# vi $HADOOP_HOME/etc/hadoop/workers
hadoop01
hadoop02
hadoop03
<core-site.xml>
[hadoop@node1 ~]# vi $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
<hdfs-site.xml>
[hadoop@node1 ~]# vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/dfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dfs/datanode</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/dfs/journalnode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
<yarn-site.xml>
[hadoop@node1 ~]# vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmcluster</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>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
NameNode가 동작하는 서버 하나 위에서 zookeeper 초기화.
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs zkfc-formatZK
이렇게 되면 zookeeper 내부에 automatic failover system 에 대한 znode가 생성된다.
위와 같은 설정을 모든 서버에 적용시켜주고 나면 Hadoop 설치는 완료된다. 이제 실행.
모든 서버에서 zookeeper 데몬 중지.
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ ./bin/zkServer.sh stop
Journal node가 동작하는 세 대의 서버에서 데몬 구동.
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs --daemon start journalnode
hadoop01에서(Active가 될) Name node format.
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs namenode -format
Name node 시작(hadoop01)
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs --daemon start namenode
hadooop02에서(Standby가 될) Active name node의 meta data를 standby namenode로 가져옴.
[hadoop@node2 ~]# $HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
Standby name node 구동.
[hadoop@node2 ~]# $HADOOP_HOME/bin/hdfs --daemon start namenode
서버 세 대 모두 zookeeper 서버 구동.
[zookeeper@node1 apache-zookeeper-3.6.3-bin]$ ./bin/zkServer.sh start
data node가 동작하는 서버에서 data node 구동 (여기선 세 대 모두)
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs --daemon start datanode
각 name node가 구동되는 서버에서 zkfc(zookeeper failover controller)를 포맷하고 구동.
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs zkfc -formatZK //hadoop01 or hadoop02
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs --daemon start zkfc //hadoop01, hadoop02 모두
hadoop01에서 start-all.sh하여 모든 데몬 실행.
[hadoop@node1 ~]# $HADOOP_HOME/sbin/start-all.sh
실행 후 각 서버에서 jps 결과가 다음과 같아야 한다.
hadoop01 | hadoop02 | hadoop03 |
ResourceManager DFSZKFailoverController NodeManager DataNode NameNode JournalNode |
ResourceManager DFSZKFailoverController NodeManager DataNode NameNode JournalNode |
NodeManager DataNode JournalNode |
각 name node가 동작하는 hadoop01, hadoop02에서 어떤 name node가 Active인지, Standby인지 알 수 있다.
[hadoop@node1 ~]# $HADOOP_HOME/bin/hdfs haadmin -getServiceState nn1 //hadoop01
active
[hadoop@node2 ~]# $HADOOP_HOME/bin/hdfs haadmin -getServiceState nn2 //hadoop02
standby
각 Resource Manager가 동작하는 hadoop01, hadoop02에서 어떤 RM이 Active인지, Standby인지 알 수 있다.
[hadoop@node1 ~]# $HADOOP_HOME/bin/yarn rmadmin -getServiceState rm1 //hadoop01
standby
[hadoop@node2 ~]# $HADOOP_HOME/bin/yarn rmadmin -getServiceState rm2 //hadoop02
active
'Hadoop' 카테고리의 다른 글
Name node is in safe mode (0) | 2022.05.18 |
---|