03. Kafka 설치 - YBIGTA/EngineeringTeam GitHub Wiki

개요

  • 이 문서는 AWS EC2 서버 3대에 각각 Zookeeper, Kafka, Python을 설치하여 Kafka를 이용해 개발하기 위한 개발 환경 구축 과정을 담은 문서입니다.
  • 자세한 설명은 생략하고 최대한 명령어 위주로 담았습니다.
  • EC2 운영체제의 버전은 Ubuntu Server 16.04 LTS입니다.
  • 이 문서는 엔지니어링팀 깃헙위키와 카프카, 데이터 플랫폼의 최강자를 참고하여 작성되었습니다.


설치할 소프트웨어

  • Java
  • Apache Zookeeper
  • Apache Kafka
  • Anaconda for Python3


설치

다음의 단계로 나누어 설치를 진행한다. 이때, 1,2,3 단계는 모두 0단계를 참고하여 만들어진 서로 다른 인스턴스에서 진행한다.

  1. 인스턴스 생성
  2. Zookeeper 서버 구축
  3. Kafka 서버 구축
  4. Producer, Consumer 서버 구축


0. 인스턴스 생성

0.1. AWS 가입 & EC2 인스턴스 생성

0.2. SSH를 이용해 EC2 인스턴스에 접속

# https://aws.amazon.com/ko/getting-started/tutorials/launch-a-virtual-machine/ 에서 참고했습니다.

c. SSH를 사용하여 인스턴스에 연결합니다.
이 사례에서는 사용자 이름이 ec2-user이고, SSH 키는 2단계 파트 d에서 저장한 디렉터리에 보관되어 있으며,
IP 주소는 2단계 파트 f에서 적어두었습니다. 형식은 ssh -i {.pem 파일의 전체 경로} ec2-user@{인스턴스 IP 주소}입니다.

- Windows 사용자: ssh -i 'c:\Users\yourusername\.ssh\MyKeyPair.pem' ec2-user@{IP_Address}
(예: ssh -i 'c:\Users\adamglic\.ssh\MyKeyPair.pem' [email protected])를 입력합니다.

- Mac/Linux 사용자: ssh -i ~/.ssh/MyKeyPair.pem ec2-user@{IP_Address}
(예: ssh -i ~/.ssh/MyKeyPair.pem [email protected])를 입력합니다.

참고: Amazon Linux 이외에 다른 Linux 인스턴스를 시작한 경우, 다른 사용자 이름이 사용될 수 있습니다. 일반적인 사용자 이름에는 ec2-user, root, ubuntu 및 fedora가 있습니다. 로그인 사용자 이름을 알 수 없는 경우, AMI 공급자에게 문의하십시오.

다음과 유사한 응답이 표시됩니다.

The authenticity of host 'ec2-198-51-100-1.compute-1.amazonaws.com (10.254.142.33)' can't be established. RSA key fingerprint is 1f:51:ae:28:df:63:e9:d8:cf:38:5d:87:2d:7b:b8:ca:9f:f5:b1:6f. Are you sure you want to continue connecting (yes/no)?

Yes를 입력하고 Enter 키를 누릅니다.

0.3. 기본 셋팅

$ cd $HOME

# 파일은 다운로드해 저장할 디렉터리 생성
$ mkdir downloads

# package manager(apt-get)을 최신화
$ sudo apt-get update


1. Zookeeper 서버 구축

1.1 인스턴스 준비

1.2 Java 설치

# 우선 자바를 설치해줍니다.
$ cd $HOME
$ sudo apt-get install openjdk-8-jdk

1.3 Zookeeper 설치

# wget, tar을 이용하여 Zookeeper를 다운받아 설치합니다.
$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
$ tar zxf zookeeper-3.4.10.tar.gz

# 설치 파일을 downloads 파일로 옮깁니다.
$ mv zookeeper-3.4.10.tar.gz ./downloads

# symbolic link를 생성한 후에 확인해줍니다.
$ ln -s zookeeper-3.4.10 zookeeper
$ ls -la zookeeper

1.4 Zookeeper 데이터 디렉토리 생성

# Zookeeper가 사용할 데이터 디렉토리를 만들어준 후, vi를 이용해 myid라는 파일을 만들어줍니다.
$ cd $HOME
$ mkdir zookeeper_data

$ echo 1 > ./zookeeper_data/myid
$ cat ./zookeeper_data/myid

1.5 Zookeeper 환경설정

# 환경설정을 해줍니다.
$ vi ./zookeeper/conf/zoo.cfg

zoo.cfg 내부에 아래와 같이 적어줍니다. 이때, 인스턴스를 종료하였다 재시작하면 ip주소가 바뀌므로 항상 수정해줘야 합니다.

trickTime=2000
initLimit=10
syncLimit=5
dataDir=~/zookeeper_data
clientPort=2181
server.1={Zookeeper 서버의 ip주소}:2888:3888

1.6 Zookeeper 실행 및 종료

$ cd ~/zookeeper

# Zookeeper 실행
$ ./bin/zkServer.sh start

# Zookeeper 종료
$ ./bin/zkServer.sh stop


2. Kafka 서버 구축

2.1 인스턴스 준비

2.2 Java 설치

# 우선 자바를 설치해줍니다.
$ cd $HOME
$ sudo apt-get install openjdk-8-jdk

2.3 Kafka 설치

# wget, tar을 이용하여 Kafka를 다운받아 설치합니다.
$ wget http://apache.mirror.cdnetworks.com/kafka/1.0.0/kafka_2.11-1.0.0.tgz
$ tar zxf kafka_2.11-1.0.0.tgz

# 설치 파일을 downloads 파일로 옮깁니다.
$ mv kafka_2.11-1.0.0.tgz ./downloads

# symbolic link를 생성한 후에 확인해줍니다.
$ ln -s kafka_2.11-1.0.0 kafka
$ ls -la kafka

2.4 Kafka 데이터 디렉토리 생성

# Kafka가 사용할 데이터 디렉토리를 만들어줍니다.
$ cd $HOME
$ mkdir kafka_data1
$ mkdir kafka_data2

2.5 Kafka 환경설정

# 환경설정을 해줍니다.
$ vi ~/kafka/config/server.properties

server.properties 파일의 아래 값들만 찾아서 변경해줍니다. 이때, ip 주소는 인스턴스 재시작시 변경되므로 항상 변경해줘야 합니다.

broker.id=1
log.dirs=~/kafka_data1,~/kafka_data2
zookeeper.connect={Zookeeper서버의 ip주소}:2181/kafka

server.properties 파일에 아래 내용을 추가해줍니다.

delete.topic.enable=true
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://{Kafka서버의 ip주소}:9092

2.6 Kafka 실행

$ cd ~/kafka

# Kafka 실행
$ ./bin/kafka-server-start.sh ./config/server.properties

# Kafka 종료
$ ./bin/kafka-server-stop.sh


3. Python 서버 구축

편의를 위하여 Anaconda를 이용하여 설치합니다.

3.1 인스턴스 준비

3.2 Anaconda 설치

# wget을 이용해 설치파일을 다운로드 받습니다.
$ cd ~/downloads
$ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh

# bash를 이용해 설치파일을 실행시킵니다.
$ bash Anaconda3-5.1.0-Linux-x86_64.sh

# License 관련된 것을 묻는 화면에서 엔터, 'yes'를 입력해 진행합니다.

# 설치 과정에 아래와 같은 메세지가 나올 것입니다.
# /home/ubuntu/anaconda3 이라는 경로에 anaconda3를 설치할 것이라는 메세지입니다.
# 특별히 선호하는 위치가 없다면 엔터를 눌러 진행합니다.
Anaconda3 will now be installed into this location:
/home/ubuntu/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

# 설치가 완료되면 아래와 같은 메세지가 나옵니다.
# 우리는 별도로 환경변수 설정을 해줄 것이기 때문에 no라고 입력합니다.
installation finished.
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/ubuntu/.bashrc ? [yes|no]
[no] >>>

# 다음에 VSCode를 설치할 것이냐고 묻는 메세지가 나옵니다.
# no라고 입력하고 설치를 종료합니다.

3.3 Jupyter Notebook 비밀번호 설정

# 비밀번호를 설정해줍니다. 
$ cd $HOME
$ jupyter notebook --generate-config
$ jupyter notebook password
Enter password:  ****
Verify password: ****

### 3.4 통신 과정에서 암호화를 위해 SSL 설정하기
```bash
# 인증서를 생성할 디렉터리 만들기
$ mkdir ~/certs
$ cd ~/certs

# 365일동안 유효한 인증서를 작성합니다.
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

3.5 Jupyter Notebook 환경설정

$ cd ~
$ vim ~/.jupyter/jupyter_notebook_config.py

jupyter_notebook_config.py 파일을 열면 많은 내용이 주석처리 되어있습니다. 아래의 내용을 파일에 추가한 뒤 파일을 닫습니다.

c = get_config()

# Notebook config this is where you saved your pem cert
c.NotebookApp.certfile = u'/home/ubuntu/certs/mycert.pem'
c.NotebookApp.keyfile = u'/home/ubuntu/certs/mykey.key'

# Set ip to '*' to bind on all interfaces (ips) for the public server
c.NotebookApp.ip = '*'
# Don't open browser by default
c.NotebookApp.open_browser = False
# Fix port to 10001
c.NotebookApp.port = 10001
# vim으로 bash_profile를 엽니다. 없으면 만듭니다.
$ vim ~/.bash_profile

완성된 ~/.bash_profile의 내용은 아래와 같습니다.

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

## User specific environment and startup programs

# Anaconda
export ANACONDA_HOME="/home/ubuntu/anaconda3"
export PATH=${ANACONDA_HOME}/bin:$PATH

설정을 마친 뒤엔 jupyter를 실행시켜줍니다.

$ jupyter notebook

각자의 ec2 주소로 브라우저를 이용해jupyter에 접속합니다. http가 아닌 https임에 유의합니다. 접속이 되는 것을 확인한 뒤에 Jupyter를 ctrl+c로 종료합니다.

https://${Python서버 ip 주소}:10001

주의

  • 2181, 9092, 10001번 port는 모든 곳에서 접속할 수 있게 보안그룹을 설정해줍니다.
  • zookeeper와 kafka의 ip는 인스턴스 재시작시 바뀌므로 계속 수정해줘야한다.
⚠️ **GitHub.com Fallback** ⚠️