---
html:
toc: true
offline: true
export_on_save:
html: true
---
# KSB 인공지능 프레임워크 설치
-----------
제공된 KSB 툴박스 docker image를 사용하지 않고, 직접 Host PC에 KSB 인공지능 프레임워크를 설치하기 위해서 아래의 오픈소스 프레임워크들을 설치합니다. 사용자 csle 계정을 생성한 후 아래 프로그램들을 설치합니다.
## [Host PC] csle 사용자 계정(권한 : administrator) 생성하기
Host PC에 기존 Ubuntu 사용자와 설치환경을 분리하기 위해 아래의 명령으로 csle 계정을 추가 생성합니다.
```sh
sudo adduser csle
Adding user 'csle' ...
Adding new group 'csle' (1001) ...
Adding new user 'csle' (1001) with group 'csle' ...
Creating home directory '/home/csle' ...
Copying files from '/etc/skel' ...
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: password updated successfully
Changing the user information for csle
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
```
/etc/sudoers를 열어 csle 계정에 administrator 권한을 추가합니다.
"경고: 읽기 전용 파일을 고치고 있습니다" 경고는 무시하고 저장하고 나옵니다.
```sh
sudo vi /etc/sudoers
# User privilege specification
root ALL=(ALL:ALL) ALL
# 맨 아래줄에 내용을 추가합니다.
#includedir /etc/sudoers.d
csle ALL=(ALL) NOPASSWD: ALL
```
## [Host PC] hostname을 csle1으로 변경하기
docker 컨테이너가 호스트 pc의 네트워크를 동일하게 사용하는 host 모드로 동작하기 위해 docker 컨테이너와 호스트 pc의 호스트네임을 동일하게 합니다.
```sh
sudo vi /etc/hostname
csle1
```
PC를 재부팅하여 csle 계정으로 로그인합니다.
## [Host PC] /etc/hosts 수정하기
KSB 툴박스의 docker 컨테이너 주소에 쉽게 접근하기 위해 아래와 같이 /etc/hosts 내용을 수정합니다.
**
[중요]
아래의 설정은 사용자의 host pc의 IP를 192.168.0.5로 가정하였을때입니다.
따라서, 자신의 HOST PC IP에 맞게 설정합니다.**
```sh
127.0.0.1 localhost
# 아래 주석처리. Hdfs 연동시 문제가 생김.
#127.0.1.1 csle1
# 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.0.5 csle1 master
```
## [Host PC] openjdk-8 설치하기
Host PC에 Ubuntu 16.04.5를 처음 설치한 경우 java openjdk 8을 설치합니다. 아래의 내용을 터미널에 복사하여 설정 가능합니다.
```sh
sudo apt-get update && \
sudo apt-get -y install openjdk-8-jre && \
sudo apt-get -y install openjdk-8-jdk
```
터미널을 다시 시작한 후, 아래의 명령으로 java 설치 여부를 확인합니다.
```sh
csle@csle1:~$ java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
```
## [Host PC] KSB 관련 프로그램 설치하기
Host PC에 아래의 명령으로 KSB 관련 프로그램을 설치합니다. 아래의 내용을 터미널에 복사하여 설정가능합니다.
```sh
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
```
## [Host PC] SSH port 변경 및 root 로그인 가능하도록 SSHD config 수정하기
아래의 명령을 수행하여 포트 정보를 2243로 수정하고, root 로그인을 허용합니다.
```sh
sudo sed -ri 's/^Port 22/Port 2243/g' /etc/ssh/sshd_config
sudo sed -ri \
's/^PermitRootLogin prohibit-password/PermitRootLogin yes/g' \
/etc/ssh/sshd_config
```
**
[참고사항]
사용자의 우분투 환경에 따라 위의 스크립트가 적용되지 않는 경우가 간혹 발생합니다.
sudo vi /etc/ssh/sshd_config 명령을 통해 ssh port 2243 번호와 PermitRootLogin yes로 수정되었는지 확인합니다.**
```sh
# What ports, IPs and protocols we listen for
Port 2243
# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
```
## [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] Hadoop 2.7.3 설치하기
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://hadoop.apache.org/docs/r2.7.3/
다운로드 링크 : https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/
**[KSB 툴박스를 이용한 설치 방법]**
KSB 툴박스를 동작시킨 상태에서 docker 컨테이너로부터 hadoop 설정 파일을 복사하여 설치할 수도 있습니다.
먼저 도커에 접속하는 방법을 참고하여 접속합니다. ( Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 hadoop-2.7.3 폴더를 Host PC의 /home/csle 폴더에 복사합니다.
또한, /home/csle/data 폴더의 hdfs 관련 정보저장 폴더를 /home/csle 폴더에 복사합니다.
그리고, ssh 포트 정보를 'hadoop-env.sh'파일에 추가합니다.
```sh
vi /home/csle/hadoop-2.7.3/etc/hadoop/hadoop-env.sh
export HADOOP_SSH_OPTS="-p 2243"
```
마지막으로 심볼릭링크을 설정합니다.
```sh
ln -s /home/csle/hadoop-2.7.3 /home/csle/hadoop
```
## [Host PC] spark-2.3.0-bin-hadoop2.7 설치하기
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://spark.apache.org/downloads.html
다운로드 링크 : https://spark.apache.org/downloads.html
**[KSB 툴박스를 이용한 설치 방법]**
KSB 툴박스를 동작시킨 상태에서 docker 컨테이너로부터 spark 설정 파일을 복사하여 설치할 수도 있습니다.
먼저 도커에 접속하는 방법을 참고하여 접속합니다. ( Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 spark-2.3.0-bin-hadoop2.7 폴더를 /home/csle 폴더에 복사합니다.
그리고 심볼릭링크을 설정합니다.
```sh
ln -s /home/csle/spark-2.3.0-bin-hadoop2.7 /home/csle/spark
```
## [Host PC] hbase 1.2.4(optional) 설치하기
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://hbase.apache.org/book.html
다운로드 링크 : https://archive.apache.org/dist/hbase/1.2.4/
**[KSB 툴박스를 이용한 설치 방법]**
KSB 툴박스를 동작시킨 상태에서 docker 컨테이너로부터 hbase 설정 파일을 복사하여 설치할 수도 있습니다.
먼저 도커에 접속하는 방법을 참고하여 접속합니다. (Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 hbase-1.2.4 폴더를 /home/csle 폴더에 폴더에 복사합니다.
그리고, ssh 포트 정보를 'hbase-env.sh'파일에 추가합니다.
```sh
vi /home/csle/hbase-1.2.4/conf/hbase-env.sh
export HBASE_SSH_OPTS="-p 2243"
```
그리고 심볼릭링크을 설정합니다.
```sh
ln -s /home/csle/hbase-1.2.4 /home/csle/hbase
```
## [Host PC] kafka 2.11-0.10.0.1(optional) 설치하기
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://kafka.apache.org/
다운로드 링크 : https://kafka.apache.org/downloads
**[KSB 툴박스를 이용한 설치 방법]**
KSB 툴박스를 동작시킨 상태에서 docker 컨테이너로부터 kafka 설정 파일을 복사하여 설치할 수도 있습니다.
먼저 도커에 접속하는 방법을 참고하여 접속합니다. ( Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 kafka_2.11-0.10.0.1 폴더를 /home/csle 폴더에 복사합니다.
그리고 심볼릭링크을 설정합니다.
```sh
ln -s /home/csle/kafka_2.11-0.10.0.1 /home/csle/kafka
```
## [Host PC] zookeeper 3.4.9(optional) 설치하기
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://zookeeper.apache.org/
다운로드 링크 : https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/
**[KSB 툴박스를 이용한 설치 방법]**
KSB 툴박스를 동작시킨 상태에서 docker 컨테이너로부터 zookeeper 설정 파일을 복사하여 설치할 수도 있습니다.
먼저 도커에 접속하는 방법을 참고하여 접속합니다. ( Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 zookeeper-3.4.9 폴더를 /home/csle 폴더에 복사합니다.
그리고 심볼릭링크을 설정합니다.
```sh
ln -s /home/csle/zookeeper-3.4.9 /home/csle/zookeeper
```
## [Host PC] bashrc 설정 추가하기
csle 계정의 bashrc 파일을 업데이트 합니다.
```sh
echo "export JAVA_HOME=/usr/lib/jvm/java-8-oracle" >> ~/.bashrc
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bashrc
echo "export PATH=/opt/apache-maven-3.3.9/bin:\$PATH" >> ~/.bashrc
echo "export HADOOP_HOME=/home/csle/hadoop-2.7.3" >> ~/.bashrc
echo "export HADOOP_PREFIX=\$HADOOP_HOME" >> ~/.bashrc
echo "export PATH=\$PATH:\$HADOOP_PREFIX/bin" >> ~/.bashrc
echo "export PATH=\$PATH:\$HADOOP_PREFIX/sbin" >> ~/.bashrc
echo "export HADOOP_CONF_DIR=\$HADOOP_HOME/etc/hadoop" >> ~/.bashrc
echo "export YARN_CONF_DIR=\$HADOOP_HOME/etc/hadoop" >> ~/.bashrc
echo "export HADOOP_MAPRED_HOME=\${HADOOP_PREFIX}" >> ~/.bashrc
echo "export HADOOP_COMMON_HOME=\${HADOOP_PREFIX}" >> ~/.bashrc
echo "export HADOOP_HDFS_HOME=\${HADOOP_PREFIX}" >> ~/.bashrc
echo "export YARN_HOME=\${HADOOP_PREFIX}" >> ~/.bashrc
echo "export HADOOP_COMMON_LIB_NATIVE_DIR=\${YARN_HOME}/lib/native">>\
~/.bashrc
echo \
"export HADOOP_OPTS="-Djava.library.path=\$YARN_HOME/lib/native"" >>\
~/.bashrc
echo "export ZOOKEEPER_HOME=/home/csle/zookeeper-3.4.9" >> ~/.bashrc
echo "export ZOOKEEPER_PREFIX=\$ZOOKEEPER_HOME" >> ~/.bashrc
echo "export ZOO_LOG_DIR=\$ZOOKEEPER_HOME/logs" >> ~/.bashrc
echo "export PATH=\$PATH:\$ZOOKEEPER_HOME/bin" >> ~/.bashrc
echo "export SPARK_HOME=/home/csle/spark-2.3.0-bin-hadoop2.7" >>\
~/.bashrc
echo "export PATH=\$PATH:\$SPARK_HOME/bin" >> ~/.bashrc
echo "export HBASE_HOME=/home/csle/hbase-1.2.4" >> ~/.bashrc
echo "export PATH=\$PATH:\$HBASE_HOME/bin" >> ~/.bashrc
echo "export KAFKA_HOME=/home/csle/kafka_2.11-0.10.0.1" >> ~/.bashrc
echo "export PATH=\$PATH:\$KAFKA_HOME/bin" >> ~/.bashrc
echo "export \
MONGODB_HOME=/home/csle/mongodb-linux-x86_64-ubuntu1404-3.4.1" >>\
~/.bashrc
echo "export PATH=\$PATH:\$MONGODB_HOME/bin" >> ~/.bashrc
echo "export LANGUAGE=ko_KR.UTF-8" >> ~/.bashrc
echo "export LANG=ko_KR.UTF-8" >> ~/.bashrc
echo "export PATH=/home/csle/anaconda3/bin:\$PATH" >> ~/.bashrc
echo "export ACTIVATOR_HOME=/home/csle/activator-dist-1.3.12" >>\
~/.bashrc
echo "export PATH=\$PATH:\$ACTIVATOR_HOME/bin" >> ~/.bashrc
echo "export PATH=\$PATH:/home/csle/KBE" >> ~/.bashrc
echo "export KSB_HOME=/home/csle/ksb-csle" >> ~/.bashrc
echo "export PYTHONPATH=/home/csle/ksb-csle/pyML/:\$PYTHONPATH" >>\
~/.bashrc
echo "export PYTHONPATH=./:/home/csle/ksb-csle/ksblib:\$PYTHONPATH" >>\
~/.bashrc
echo "export PYSPARK_PYTHON=/home/csle/anaconda3/bin/python" >>\
~/.bashrc
echo "export PYSPARK_DRIVER_PYTHON=/home/csle/anaconda3/bin/python" >>\
~/.bashrc
echo "export PATH=\$PATH:/home/csle/anaconda3/bin/" >> ~/.bashrc
source ~/.bashrc
```
## [Host PC] Anaconda3 설치하기
가상환경을 이용하여 tensorflow cpu버전을 설치하기 위해 anaconda3를 홈페이지(https://repo.anaconda.com/archive/)에서
"Anaconda3-4.2.0-Linux-x86_64.sh"버전을 다운받습니다.
아래의 명령을 이용하여 csle 홈 폴더에 anaconda3를 설치합니다.
```sh
bash Anaconda3-4.2.0-Linux-x86_64.sh -b -p /home/csle/anaconda3
```
### [Host PC] 기타 라이브러리 설치하기
pyspark에서 사용하는 python에 관련 라이브러리를 설치합니다.
```sh
conda update -y conda && \
conda install -c conda-forge protobuf && \
pip install py4j && \
pip install --upgrade pip && \
pip install hdfs && \
conda install -y hdfs3 libhdfs3 -c conda-forge
```
## [Host PC] tensorflow 설치하기 (cpu버전)
tensorflow 설치를 위한 가상환경을 설치합니다.
```sh
conda update -y conda && \
conda create -y -n tensorflow python=3.5
```
```sh
source activate tensorflow
pip install "tensorflow==1.6.0" && \
pip install setuptools && \
pip install matplotlib && \
pip install pandas && \
pip install scikit-optimize && \
pip install hdfs && \
conda install -y hdfs3 libhdfs3 -c conda-forge
source deactivate
```
## [Host PC] KSB 툴박스 파일 설치하기
KSB 프레임워크를 호스트 서버에 직접 설치하는 경우에도 ksb_toolbox_v1903.tar.gz 파일이 필요합니다.
다운로드 페이지로부터 KSB 툴박스 파일을 다운로드합니다.
- ksb_toolbox_v1903.tar.gz : KSB 툴박스 파일
csle 사용자 계정의 home에 ksb_toolbox_v1903.tar.gz 압축을 해제합니다. 결과적으로 /home/csle/ksb-csle 폴더가 생성됩니다.
```sh
csle@csle1:~$ tar zxvf ksb_toolbox_v1903.tar.gz -C /home/csle/
```
/home/csle/ksb-csle 폴더는 다음의 하위 폴더들로 구성됩니다.
- /bin : KSB 프레임워크 shell 스크립트 파일 저장 폴더
- /components : tensorflow train 예제 프로그램 저장 폴더
- /conf : KSB 프레임워크 환경설정 파일 저장 폴더
- /docker : KSB 툴박스 docker 컨테이너 실행 스크립트 저장 폴더
- /examples : CLI(Command Line Interface)를 통해 워크플로우 생성 및 submit 할 수 있는 프로젝트 폴더
- /jars : KSB 프레임워크 19.03 버전의 jar 파일 저장 폴더
- /ksblib : python 전처리 라이브러리 폴더
- /kubernetes : 쿠버네티스 환경설정 폴더
- /logs : log 저장 폴더
- /pyML : autoML python 프로젝트 폴더
- /tools: 예제 테스트를 위한 프로그램(jmeter, hadoop, kafka, maven, .ssh, webToolkit_db)
## [Host PC] ksb-csle config 파일 설정하기
/home/csle/ksb-csle/conf/ksb.conf 파일을 사용자 PC에 맞게 수정합니다.
```sh
csle {
user {
home = "/home/csle" # 사용자 home 디렉토리를 지정합니다.
}
home = "/home/csle/ksb-csle" # KSB home 디렉토리를 지정합니다.
submit.cli = "true"
scheduler.initialization = "false"
}
servers {
gateway {
baseUrl = "http://KSB_GATEWAY:SERVICEPORT"
}
kubernetes {
enable = "false"
baseUrl = "http://SERVICENAME.ksb.local:30100"
imgRepositoryUrl = "docker.io"
kubernetes_yaml_path = "/kubernetes"
masterIp = "csle1" # Kubernetes 마스터 도메인 이름 혹은 IP를 지정합니다.
masterPort = "2243" # Kubernetes SSH 포트 번호를 지정합니다.
nodesIp = "csle2, csle3"
# Kubernetes 노드들의 도메인 이름 혹은 IP들을 지정합니다.
user = "csle" # Kubernetes 서버의 사용자 ID를 지정합니다.
externalKafka {
brokerHostName = "csle1"
# 외부 Kafka broker서버 도메인 이름을 지정합니다.
brokerHostIp = "192.168.0.5"
# 외부 Kafka broker서버 IP을 지정합니다.
}
}
```
```sh
tensorflow {
enable = "true"
python_path = "/anaconda3/envs/tensorflow/bin/python"
# 사용자 PC의 tensorflow python 위치를 지정합니다.
python_code_project_path = "/analysis"
}
pyspark {
python_path = "/anaconda3/bin/python"
# 사용자 PC의 python 위치를 지정합니다.
python_code_project_path = "/pyML"
}
spark {
home = "/spark" # 사용자 PC의 spark home 위치를 지정합니다.
bin = "/spark/bin/spark-submit"
master = "local[*]" # spark master 모드를 지정합니다.
deploy = "client" # spark deploy 모드를 지정합니다.
logging = "true"
autoIncreaseModelPath = "true"
}
yarn {
home = "/hadoop/bin" # 사용자 PC의 yarn 위치를 지정합니다.
}
postgres {
db = "csledb"
uri = "jdbc:postgresql://localhost:5432/csledb"
user = "csle"
password = "csle1234"
}
webtoolkit {
db = "ui"
uri = "jdbc:postgresql://localhost:5432/uidb"
user = "csle"
password = "csle1234"
}
hadoop {
home = "/hadoop/" # 사용자 PC의 hadoop 위치를 지정합니다.
master = "csle1" # 사용자 PC의 hadoop master 이름을 지정합니다.
port = "9000" # 사용자 PC의 hadoop master port를 지정합니다.
hdfs {
activated = "true"
baseDir = "/user/"
modelPath = "/model"
datasetPath = "/dataset"
}
webhdfs {
port = "50070"
baseDir = "/webhdfs/v1"
}
}
hbase.zookeeper.quorum = "localhost"
kbe {
serverIp = "localhost"
serverPort = "9876"
serverType = "jena"
}
}
```
## [Host PC] startService.sh, stopService.sh 생성하기
/home/csle에 startService.sh, stopService.sh 파일을 생성합니다.
```sh
cat <> ~/startService.sh
#!/bin/bash
sudo service ssh restart
sudo service postgresql restart
bash /home/csle/zookeeper-3.4.9/bin/zkServer.sh start
ssh csle@master -p 2243 "cd /home/csle/zookeeper-3.4.9/bin; \
./zkServer.sh start"
ssh csle@csle1 -p 2243 "cd /home/csle/zookeeper-3.4.9/bin; \
./zkServer.sh start"
start-dfs.sh
start-yarn.sh
start-hbase.sh
/home/csle/kafka/bin/kafka-server-start.sh \
/home/csle/kafka/config/server.properties &
/home/csle/ui_of_csle/apache-tomcat-7.0.81/bin/catalina.sh start &
/home/csle/start-mongo.sh &
sleep 5
cd /home/csle/ksb-csle/bin
/home/csle/ksb-csle/bin/startKnowledge_service.sh localhost 9876
EOT
chmod +x /home/csle/startService.sh
cat <> ~/stopService.sh
#!/bin/bash
stop-hbase.sh
bash /home/csle/kafka/bin/kafka-server-stop.sh
stop-yarn.sh
stop-dfs.sh
bash /home/csle/zookeeper-3.4.9/bin/zkServer.sh stop
/home/csle/ui_of_csle/apache-tomcat-7.0.81/bin/catalina.sh stop
/home/csle/stop-mongo.sh
cd /home/csle/ksb-csle/bin
/home/csle/ksb-csle/bin/stopKnowledge_service.sh
sudo service postgresql stop
EOT
chmod +x /home/csle/stopService.sh
```
## [Host PC] KSB 툴박스 docker 이미지내 SSH 키를 host pc에 복사하기
KSB 툴박스 docker 컨테이너의 인증키를 공유하기 위해 ksb-csle/tools 폴더에 있는 .ssh 폴더를 csle 홈에 카피합니다.
```sh
cp -r ~/ksb-csle/tools/.ssh/ /home/csle/
```
authorized_keys를 다른 계정이 읽고 쓸 수 없게 600 mode(소유자만 rw 가능)로 변경합니다.
```sh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
## [Host PC] SSH 재시작하기
```sh
sudo service ssh restart
```
## [Host PC] Hadoop Hdfs 사용자 계정 추가하기
사용자 환경에 맞게 설치되어 있는 Hadoop Hdfs를 가동한 후, 아래 명령을 이용하여 hdfs에 ksbuser_etri_re_kr 사용자 폴더를 추가합니다.
만약 Hadoop 2.7.3 설치하기에서 도커 컨테이너로부터 /home/csle/data 폴더를 복사한 경우, 이미 사용자 폴더가 생성된 hdfs을 복사한 상태이므로 이 절차를 생략합니다.
```sh
su - csle
hdfs dfs -mkdir -p /user/ksbuser_etri_re_kr/dataset
hdfs dfs -mkdir -p /user/ksbuser_etri_re_kr/model
```
## [Host PC] KSB 지식베이스 엔진 설치하기
KSB 지식베이스엔진(KSB-Knowledge Engine)을 사용하기 위한 절차 및 예제를 소개합니다.
### 지식베이스 엔진 가져오기
KSB 지식베이스엔진은 현재 Docker 컨테이너에 포함되어 배포 되고 있습니다.
도커에 접속하는 방법을 참고하여 접속합니다. ( Filezilla를 이용하여 KSB 툴박스 docker 컨테이너에 접속하기 )
도커에 있는 ksb-knowledge 폴더를 Host PC의 /home/csle 폴더에 복사합니다.
### Play framework Activator 설치하기
KSB 지식베이스 엔진은 Play framework 기반 엔진이며, 이를 실행하기 위해서는 [Play framework Activator][8580869d]를 사전에 설치해야 합니다.
[8580869d]:
https://downloads.typesafe.com/typesafe-activator/1.3.12/typesafe-activator-1.3.12.zip "Play framework Activator"
```sh
# Play framework Activator 다운로드
wget https://downloads.typesafe.com/typesafe-activator/1.3.12/\
typesafe-activator-1.3.12.zip
# 압축해제
unzip typesafe-activator-1.3.12.zip
# Activator bin 경로를 환경변수에 등록
export PATH="/home/csle/activator-dist-1.3.12/bin:$PATH"
```
### KSB 지식베이스 엔진 시작 및 종료 하기
KSB 지식베이스 엔진을 시작하려면, 해당폴더 (/home/csle/ksb-csle/bin)로 이동하여, startknowledge_service.sh 스크립트를 ip address와 port 번호와 함께 실행합니다.
```sh
# KSB 지식베이스 실행 스크립트가 있는 경로로 이동
cd /home/csle/ksb-csle/bin
# KSB 지식베이스 엔진 시작
#(./startknowledge_service.sh ip_address port_number)
./startknowledge_service.sh 127.0.0.1 9876
```
KSB 지식베이스 엔진을 종료하려면, 해당폴더 (/home/csle/ksb-csle/bin)로 이동하여, stopKnowledge_service.sh 스크립트를 실행합니다.
```sh
# KSB 지식베이스 엔진 종료
./stopKnowledge_service.sh
```
### 온톨로지 파일 Upload 하기
KSB 지식베이스 엔진이 Start 되어 있는 상황에서, 사용자가 로컬 파일에 작성된 온톨로지 파일(.owl, .rdf, .rdfs)을 KSB 지식베이스 엔진에 Upload 하는 기능을 설명합니다. 본 예제에서는 KSB 지식베이스 엔진 내부 폴더에 제공하는 공통 온톨로지 파일을 이용합니다.
```sh
# 예제 수행 온톨로지 확인을 위해 해당 경로로 이동
cd /home/csle/ksb-knowledge/KBE/ontologies
```
![KSB 공통 온톨로지](./images/1.3_HowToInstallKsbFrameWork_02.png "KSB 공통 온톨로지")
```sh
# Curl 명령어 restful request 수행 (url: /loadOntologies, parameter: 온톨로지 경로)
curl -X POST http://127.0.0.1:9876/loadOntologies -H 'Cache-Control: \
no-cache' -H 'Content-Type: text/plain' -d ./ontologies
```
![KSB 지식베이스 엔진 온톨로지 upload 화면](./images/1.3_HowToInstallKsbFrameWork_03.png "KSB 지식베이스 엔진 온톨로지 upload 화면")
KSB 지식베이스 엔진에 Upload된 온톨로지는 KSB 지식베이스 엔진이 제공하는 쿼리 Restful API(``http://127.0.0.1:9876/query``)를 통해 확인할 수 있습니다. 이를 위해 Restful Client(본 예제에서는 Postman)를 실행하고, URL과 질의 쿼리 내용을 아래와 같이 입력하여 실행합니다.
```sh
# 본 쿼리는 SPAQRL 1.1의 형태의 질의이며,
# 이는 온톨로지 thing:Thing 클래스의 서브 클래스를 검색하기 위한 쿼리입니다.
PREFIX rdfs:
PREFIX owl:
PREFIX workflow:
PREFIX thing:
select * where {
?s rdfs:subClassOf thing:Thing.
FILTER (!isBlank(?s))
}
```
![온톨로지 Upload 결과 확인 화면](./images/1.3_HowToInstallKsbFrameWork_04.png "온톨로지 Upload 결과 학인 화면")
## IoE 사물 등록
KSB 지식베이스 엔진은 IoE 정보를 지식화하여 정보의 연계, 추론을 통한 지식정보를 사용자에게 제공하는 기능이 있습니다. IoE 표준(oneM2M)의 사물 스펙을 지식화하는 기능을 제공합니다.
본 예제에서는 Json 포맷의 사물 스펙을 사용합니다.
```sh
# Json 포맷의 사물 스펙(예제로 사용한 IoE 사물의 id는 a1234이며,
# indoor temperature and humidity 센서입니다.)
{
"version": "1.0",
"id": "a1234",
"registrationTime": "20170102112233",
"properties": {
"name": "indoor_env_1",
"owner": "foo@gmail.com",
"description": "indoor temperature and humidity",
"gid": "global_unique_id_1",
"model": "modelA",
"coordinates": {
"latitude": 33.3,
"longitude": 122.2,
"altitude": 0
},
"location": "seoul korea",
"users": ["bar@gmail.com"],
"tag": ["my room", "temperature", "humidity"],
"madeBy": "companyA",
"hostedBy": "companyB"
},
"resources": [
{
"name": "sensors",
"description": "temperature and humidity in my room",
"attributes": [
{
"name": "temperature",
"dataType": "double",
"unit": "celsius",
"min": "-80",
"max": "80",
"description": "temperature in my room"
},
{
"name": "humidity",
"dataType": "double",
"unit": "percent",
"min": "0",
"max": "100",
"description": "humidity in my room"
}
],
"operations": [
{
"opType": "get",
"args": ["temperature", "humidity"],
"description": "get current temperature and humidity"
}
]
}
]
}
```
KSB 지식베이스 엔진이 제공하는 사물등록 Restful API (``http://127.0.0.1:9876/registThing``)를 통해 KSB 지식베이스 엔진에 사물 스펙정보를 등록 할 수 있습니다.
![사물등록 화면](./images/1.3_HowToInstallKsbFrameWork_05.png "사물등록 화면")
다음과 같은 쿼리 Restful API을 수행하여 결과를 확인합니다.
```sh
# 본 쿼리는 SPAQRL 1.1의 형태의 질의이며,
# 이는 온톨로지 thing:Thing 클래스의 인스턴스를 검색하기 위한 쿼리입니다.
PREFIX rdf:
PREFIX owl:
PREFIX workflow:
PREFIX thing:
select * where {
?s rdf:type thing:Thing.
}
```
![사물등록확인화면](./images/1.3_HowToInstallKsbFrameWork_06.png "사물등록확인화면")
## IoE 사물 센서데이터를 통해 지식추론하기
KSB 지식베이스 엔진은 IoE 디바이스의 센서데이터를 이용하여, 상황을 추론할 수 있는 기능을 제공합니다.
본 예제의 시나리오는 앞에서 등록된 온도센서(thing id : a1234)로부터 온도가 28도 이상이면 더운 상황(HotContext)을 추론하고,
추론된 정보를 통해 Hue(thing id : S_HUE_light_3)를 파란색으로 켜는 동작을 하는 간단한 시나리오 입니다.
이를 위해 Hue의 제어 명령을 등록합니다. (Restful API: ``http://127.0.0.1:9876/addDeviceControl``)
```sh
# Json 포맷의 사물제어 스펙(id S_HUE_light_3의 Hue)
[
{"id":"hue_turnon_Blue",
"thingId":"S_HUE_light_3",
"resourceId":"controller",
"operationId":"setState",
"controlContents":[
{"name":"on","value":"true"},
{"name":"bri","value":"254"},
{"name":"hue","value":"46920"},
{"name":"sat","value":"254"}
]
},
{"id":"hue_turnon_Red",
"thingId":"S_HUE_light_3",
"resourceId":"controller",
"operationId":"setState",
"controlContents":[
{"name":"on","value":"true"},
{"name":"bri","value":"254"},
{"name":"hue","value":"65535"},
{"name":"sat","value":"254"}
]
},
{"id":"hue_turnon_Green",
"thingId":"S_HUE_light_3",
"resourceId":"controller",
"operationId":"setState",
"controlContents":[
{"name":"on","value":"true"},
{"name":"bri","value":"254"},
{"name":"hue","value":"25500"},
{"name":"sat","value":"254"}
]
}
]
```
추론 규칙을 적용하기 위해, KSB-Knowledge/KBE/rules 폴더의 "KBE.rues" 파일을 열고 아래와 같이 추론 규칙을 추가합니다.
```sh
# 온도센서의 센싱값이 28이상이면 이벤트 Temp_HOT을 생성합니다.
[domain_temperature_hot:
(?e event:hasEventValue ?v),
(?v thing:hasType ?t),
(?t thing:attributeName ?name),
equal(?name, "temperature"),
(?v thing:hasValue ?value),
ge(?value, 28)
->
(?e event:hasEventStatus domain:Temp_HOT)
]
# 이벤트 Temp_HOT이면 더운 상황(HotContext)을 생성합니다.
[HotContext_context:
(?e event:hasEventStatus domain:Temp_HOT)
-> (?e rdf:type domain:HotContext)
]
# 더운 상황(HotContext)이면 Hue를 파란색으로 켭니다.
[HotContext_service:
(?e rdf:type domain:HotContext)
->
(?e service:derives domain:hue_turnon_Blue)
]
```
본 예제를 실행하기 위해 온도센서(thing id: a1234)의 값을 32.6으로 설정하고, Restful API(``http://127.0.0.1:9876/recommendDeviceControl``)를 실행합니다.
```sh
# 온도센서(thingId : a1234)의 센싱값이 32.6으로 설정합니다.
{
"thingId": "a1234",
"resourceId": "sensors",
"time": "20170330103347",
"values": [
{
"name": "temperature",
"value": "32.6"
}
]
}
```
Restful API를 실행한 결과는 다음과 같습니다.
```sh
# 상황(context)가 "HotContext"이고, 상황에 따른 서비스(service)가
# "hue_turnon_Blue"이며 그것에 해당하는 사물 제어정보를 리턴합니다.
[
{
"thingId": "S_HUE_light_3",
"resourceId": "controller",
"context": [
"HotContext"
],
"service": "hue_turnon_Blue",
"controls": {
"sat": "254",
"hue": "46920",
"bri": "254",
"on": "true"
}
}
]
```
![사물추론 확인화면](./images/1.3_HowToInstallKsbFrameWork_07.png "사물추론 확인화면")