Apache ZooKeeper는 탄력적이고 안정적인 분산 조정을 가능하게하는 오픈 소스 소프트웨어입니다. 일반적으로 분산 시스템에서 구성 정보, 이름 지정 서비스, 분산 동기화, 쿼럼 및 상태를 관리하는 데 사용됩니다. 또한 분산 시스템은 ZooKeeper를 사용하여 합의, 리더 선택 및 그룹 관리를 구현합니다.
RHEL/CentOS 8에Zookeeper를 설치하는 방법을 정리해 봅니다.
1. 서버 기본 설정
각 서버의 공통 설정은 Hadoop 설치를 참고합니다.
2. Zookeeper 설치
2.1 zookeeper 사용자 생성
보안을 생각해서 별도의 zk 사용자를 생성합니다.
아래 명령어로 새로운 사용자를 생성하고 암호를 설정해 줍니다:
useradd zk
passwd zk
이후에 아래와 같이 sshd_config를 수정해서 sshd를 통해 로그인이 불가능하도록 합니다.:
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
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 파일에 추가해 줍니다.
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]-----+
처음 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 ~]$
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]