---
html:
toc: true
offline: true
export_on_save:
html: true
---
# KSB toolbox(docker image)를 이용한 HOST 서버(VirtualBox VM)에 KSB 프레임워크 구축 방법
---
본 메뉴얼은 KSB toolbox(docker image)를 이용한 HOST 서버(VirtualBox VM)에 KSB 프레임워크 구축 방법을 설명합니다.
빅데이터 프레임워크와 기타 툴들을 각각 설치하는 대신, 도커에 탑재된 설정 파일을 사용함으로써 서버 구축을 좀 더 쉽게 가능합니다.
VM에 설치를 위해 toolbox cpu 버전을 기준으로 설명하며, gpu 버전은 도커 이미지와 파일명이 일부 다를 뿐 동일한 절차로 진행하면 쉽게 구축이 가능합니다.
## 환경 구축 방안
먼저 우분투 16.04 호스트 서버를 준비합니다.
호스트 서버에 kSB 툴박스 (docker버전)을 설치하여 도커안에 있는 설정파일들을 호스트 서버에 복사하는 방법으로 호스트 서버에 KSB 프레임워크 환경을 구축하는 방법에 대해서 설명합니다.
## 호스트 PC 환경
호스트 PC 환경을 아래와 같이 가정합니다.
```sh
ssh 포트 : ssh 서버를 구동하지 말 것
hostname : csle1
사용자 : csle
IP : 192.168.1.13
```
중요한 점은 ssh 서버를 구동하지 말아야 합니다.
일반적으로 호스트 서버에서 ssh 포트 22번으로 구동되어 있는 상태가 많습니다.
이러한 경우, 아래의 과정 중 KSB 도커 컨테이너에서 ssh 서버를 구동할 경우 22번 포트 충돌이 발생합니다.
따라서, 호스트 PC의 ssh 서버를 임시로 중지합니다.
```sh
sudo service ssh stop
```
## [Host PC] /etc/sudoers를 열어 csle 계정에 administrator 권한을 추가
```sh
sudo vi /etc/sudoers
```
```sh
# 맨 아래줄에 내용을 추가합니다.
#includedir /etc/sudoers.d
csle ALL=(ALL) NOPASSWD: ALL
```
## [Host PC] hostname을 csle1으로 변경
```sh
sudo vi /etc/hostname
csle1
```
PC 재부팅하기
## [Host PC] /etc/hosts 수정
```sh
127.0.0.1 localhost
# [중요] 주석처리
#127.0.1.1 testuser-VirtualBox
# 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
# [중요] 각 사용자의 Host PC IP 주소에 맞게 아래 내용 추가
192.168.1.13 csle1 master
```
## [Host PC] openjdk 8 설치하기
도커 컨테이너 내에 hadoop, hbase에서 사용하는 java path가 java-8-oracle로 설정되어 있습니다. (라이센스 문제로 1.0 버전 이후로 java-8-openjdk-amd64 링크를 걸어서 사용하고 있습니다.)
따라서, hadoop/etc/hadoop 폴더와 hbase/conf 폴더에서 java 관련 path를 openjdk로 수정하거나, 아래와 같이 심볼릭 링크만 추가해서 hadoop, hbase 설정 파일을 수정없이 사용가능합니다.
```sh
sudo apt-get update && \
sudo apt-get -y install openjdk-8-jre && \
sudo apt-get -y install openjdk-8-jdk && \
sudo rm -rf /usr/lib/jvm/java-8-oracle && \
cd /usr/lib/jvm/ && \
sudo ln -s java-8-openjdk-amd64/ java-8-oracle
```
## [Host PC] KSB 관련 프로그램 설치
```sh
sudo apt-get update && \
sudo apt-get install -y --no-install-recommends apt-utils curl bc jq && \
sudo apt-get install -y openssh-server locales wget git vim rsync locales \
filezilla python3-pip && \
sudo apt-get install -y net-tools && \
pip3 install kafka-python pillow requests numpy
```
호스트 서버의 ssh 서버를 중지합니다.
```sh
sudo service ssh stop
```
## [Host PC] docker 설치
```sh
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo apt-key add - && \
sudo add-apt-repository \
"deb [arch=amd64]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
apt-cache policy docker-ce && \
sudo apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu && \
sudo systemctl status docker
```
```sh
sudo usermod -aG docker csle
# 사용자가 로그인 중이라면 다시 로그인 후 권한이 적용됩니다.
## 단, 현재 터미널에서만 적용됩니다.
sudo su csle
```
PC 재부팅
## [Host PC] 도커 컨테이너에서 파일 다운로드
HOST PC가 VM인 경우, tensorflow gpu를 사용하지 않기 때문입니다.
따라서, gpu 버전이 아닌 cpu 버전에 탑재된 파일들을 복사해서 사용해야 합니다.
cpu 버전 toolbox를 다운받아 꼭 실행해야 합니다.
## [Host PC] startDockerCsle.sh를 실행하여 도커 컨테이너를 실행
```sh
cd ~/ksb-csle/docker/19.03-host/
./startDockerCsle.sh
```
## [Docker 컨테이너] ssh 서버 구동
먼저 도커 컨테이너안에서 ssh 서버를 구동합니다.
```sh
sudo service ssh start
```
## [Host PC] Docker 컨테이너의 파일/폴더를 host PC의 csle home에 다운로드
filezilla를 이용하여 아래의 정보를 입력해서 도커 컨테이너 내에 접속합니다.
```sh
호스트 : localhost
포트 : 22
프로토콜 : SFTP
사용자 : csle 암호 csle
```
csle 홈디렉토리내에 아래의 파일과 폴더를 Host PC의 csle 홈디렉토리에 다운로드합니다.
```sh
.ssh
.ivy2
.conda
.bashrc
hadoop-2.7.3
hbase-1.2.4
kafka_2.11-0.10.0.1
mongodb-linux-x86_64-ubuntu1404-3.4.1
zookeeper-3.4.9
spark-2.3.0-bin-hadoop2.7
miniconda3
ui_of_csle
activator-dist-1.3.12
ksb-knowledge
start-mongo.sh
startService.sh
stop-mongo.sh
stopService.sh
```
## [Host PC] bashrc 경로 확인 및 수정 필요
host pc의 csle 사용자의 bashrc 파일에서 아래와 같이 python 경로를 확인하여야 함.
```sh
vi ~/.bashrc
```
```sh
export PYSPARK_PYTHON=/home/csle/miniconda3/envs/tensorflow/bin/python
export PYSPARK_DRIVER_PYTHON=/home/csle/miniconda3/envs/tensorflow/bin/python
```
```sh
source ~/.bashrc
```
## [Host PC] 링크 추가
```sh
cd ~
ln -s hadoop-2.7.3/ hadoop
ln -s hbase-1.2.4/ hbase
ln -s kafka_2.11-0.10.0.1/ kafka
ln -s mongodb-linux-x86_64-ubuntu1404-3.4.1/ mongodb
ln -s spark-2.3.0-bin-hadoop2.7/ spark
ln -s zookeeper-3.4.9/ zookeeper
```
## [Host PC] postgresql 설치
```sh
sudo apt-get update && \
sudo apt-get install -y software-properties-common && \
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" && \
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - && \
sudo apt-get update && \
sudo apt-get install -y postgresql-9.6 && \
sudo apt-get clean && \
sudo rm -rf /var/lib/apt/lists/* && \
sudo service postgresql restart
```
```sh
sudo sed -ri "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/g" /etc/postgresql/9.6/main/postgresql.conf
```
```sh
sudo vi /etc/postgresql/9.6/main/pg_hba.conf
```
```sh
# IPv4 local connections:
host all all 0.0.0.0/0 md5
host all all ::0/0 md5
host all all all md5
```
```sh
sudo service postgresql restart
```
또한 Postgresql DB 접근 및 이용을 편리하게 하기 위해 Pgadmin을 설치하여 사용합니다. pgadmin3는 1.22.2 이상을 설치합니다. (ostgresql 9.6.8 이상을 설치해야 잘 동작합니다.)
```sh
sudo apt-get update
sudo apt-get install -y pgadmin3
```
## [Host PC] postgresql db 설정
```sh
sudo -u postgres bash -c "psql -c \"CREATE USER csle password 'csle1234' superuser;\""
sudo -u postgres bash -c "psql -c \"ALTER USER csle WITH CREATEROLE REPLICATION CREATEDB SUPERUSER;\""
sudo -u postgres bash -c "psql -c \"CREATE DATABASE csledb WITH OWNER = csle ENCODING = 'UTF-8' CONNECTION LIMIT = -1;\""
wget https://csleoss.etri.re.kr/images/contents/manual_1903/csledb_v1903_20190710.backup --no-check-certificate
PGPASSWORD=csle1234 pg_restore -h localhost -U csle -C -d csledb /home/csle/csledb_v1903_20190710.backup
sudo -u postgres bash -c "psql -c \"CREATE DATABASE uidb WITH OWNER = csle ENCODING = 'UTF-8' CONNECTION LIMIT = -1;\""
wget https://csleoss.etri.re.kr/images/contents/manual_1903/uidb_v1903_20190710.backup --no-check-certificate
PGPASSWORD=csle1234 pg_restore -h localhost -U csle -C -d uidb /home/csle/uidb_v1903_20190710.backup
```
설치도중 "경고: 복원작업에서의 오류들이 무시되었음: 1" 에러는 무시하면 됩니다.
## [Host PC] SSH port 확인 및 root 로그인 가능하도록 SSHD config 수정
호스트 PC의 ssh 서버 포트를 default 값 22를 사용합니다. hadoop과 hbase에서 사용하는 ssh 포트값이 22번으로 설정되어 있습니다.
```sh
sudo sed -ri \
's/^PermitRootLogin prohibit-password/PermitRootLogin yes/g' \
/etc/ssh/sshd_config
```
## [Host PC] SSH config 수정하기 (known_hosts에 호스트 저장 질문을 하지 않도록 설정)
아래의 명령을 수행하여 ssh_config의 기존 내용을 모두 삭제하고 설정을 추가합니다. 아래의 내용을 터미널에 복사하여 설정가능합니다.
```sh
sudo truncate -s0 /etc/ssh/ssh_config
echo "Host localhost" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host 0.0.0.0" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host 127.0.0.1" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host csle*" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "UserKnownHostsFile=/dev/null" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host master" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "UserKnownHostsFile=/dev/null" \
| sudo tee -a /etc/ssh/ssh_config >/dev/null
sudo service ssh restart
```
## [Host PC] HDFS 초기화
먼저 아래의 명령으로 도커내에 있던 known_hosts에 저장된 정보를 삭제합니다.
```sh
ssh-keygen -f "/home/csle/.ssh/known_hosts" -R 0.0.0.0
```
HDFS 저장 path는 /home/csle/data 폴더입니다.
혹시 기존에 사용하는 폴더와 충돌되는지 확인한 후 아래의 명령을 수행합니다.
그리고, 하둡 파일 시스템 데몬을 실행하여 필요한 파일들을 업로드 합니다.
```sh
sudo rm -rf /home/csle/data && \
hdfs namenode -format && \
sudo service ssh start && \
start-dfs.sh && \
cd ksb-csle/bin/ && \
./initHdfs.sh
```
하둡 팡리 시스템에 필요한 파일들을 모두 복사했다면 아래와 같이 데몬들 중지합니다.
```sh
stop-dfs.sh && \
sudo service ssh stop
```
혹시 아래와 같은 에러가 발생하면,아래의 명령을 수행한다.
```sh
0.0.0.0: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
0.0.0.0: @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
0.0.0.0: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
0.0.0.0: IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
0.0.0.0: Someone could be eavesdropping on you right now (man-in-the-middle attack)!
0.0.0.0: It is also possible that a host key has just been changed.
0.0.0.0: The fingerprint for the ECDSA key sent by the remote host is
0.0.0.0: SHA256:QPK3gL8rM4yDDY6ELtqPnqdILzhlJJmUBCpUWY2aoiI.
0.0.0.0: Please contact your system administrator.
0.0.0.0: Add correct host key in /home/csle/.ssh/known_hosts to get rid of this message.
0.0.0.0: Offending ECDSA key in /home/csle/.ssh/known_hosts:2
0.0.0.0: remove with:
0.0.0.0: ssh-keygen -f "/home/csle/.ssh/known_hosts" -R 0.0.0.0
```
```sh
ssh-keygen -f "/home/csle/.ssh/known_hosts" -R 0.0.0.0
```
## [Host PC] 크롬 설치하기 (optional)
KSB 툴박스의 웹툴킷을 안정적으로 사용하기 위해서 크롬 브라우저를 설치합니다. 아래의 내용을 터미널에 복사하여 설정가능합니다.
```sh
cd && \
wget \
https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt-get update && \
sudo apt-get install -y libxss1 libappindicator1 libindicator7 && \
sudo dpkg -i google-chrome-stable_current_amd64.deb
```
## [Host PC] ksb-csle 폴더 권한 변경하기
KSB 툴박스 docker 컨테이너에서 Host PC의 ksb-csle 폴더를 엑세스 할 수 있도록 폴더 권한을 변경합니다.
```sh
sudo chmod 777 -R /home/csle/ksb-csle/
```
모든 설치가 완료되었습니다.
## [Host PC] 빅데이터 프레임워크 초기화
아래와 같이 빅데이터 프레임워크를 초기화 합니다.
```sh
cd ~
./startService.sh
```
## [Host PC] KSB 인공지능 프레임워크 구동
```sh
cd ~/ksb-csle/bin
./startKsbApiServing.sh
```
## [Host PC] 서버 종료
서버의 전원을 끌 경우, 구동중인 모든 빅데이터 프레임워크를 종료합니다. 특히, hadoop을 정상적으로 종료한 후 전원을 꺼야합니다.
```sh
cd~
./stopService.sh
```
## [Host PC] dockerize 예제 관련 base.py를 hostmode 파일로 변경
docker내에서 dockerize가 불가능하므로 ksbtoolbox docker버전에서는
base-dockermode.py를 사용하며, Host PC에 ksbtoolbox를 직접 설치하는 경우는 base-hostmode.py을 사용해야 합니다. 따라서 아래의 명령을 통해서 base.py 파일을 변경합니다.
```sh
cd ~/ksb-csle/ksblib/ksblib/dockerize/
cp base-hostmode.py base.py
```