2.5.1.HttpToMongodbExample.md 6.44 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
html:
  toc: true
  offline: true
export_on_save:
  html: true
---
# 스트림 데이터 적재하기 (HttpToMongodbExample)
---

HTTP restful 인터페이스를 통해서 스트림으로 입력되는 데이터를 MongoDB에 저장하는 예제를 설명합니다.

## 입력 데이터 준비하기
본 예제에서는 스트림 데이터를 생성해야 합니다. 이를 위해 **KSB 클라이언트 SDK** 를 다운로드 하십시오. 프로젝트에 포함된 테스트 스크립트를 이용하여 시뮬레이션 할 수 있습니다.

- 테스트 스크립트에서 사용하는 ubuntu utility를 설치합니다.
```sh
$ sudo apt-get install curl
```

- 테스트 스트립트가 위치한 디렉터리로 이동합니다.
```sh
$ cd ~/ksb-csle/examples
```

- HTTP 스트림 데이터를 생성합니다.
  - HTTP_IP: KSB 인공지능 프레임워크 IP 주소
  - HTTP_PORT: 워크플로우 작성시, 입력한 HTTP 서버 포트번호
```sh
$ ./send-data-via-http.sh ${HTTP_IP}:${HTTP_PORT}
```


##워크플로우 생성하기
워크플로우 편집화면을 이용하여 아래의 과정을 통해 워크플로우를 생성합니다.

- 워크플로우 속성

속성  | 값  | 비고
--|---|--
name  | HttpToMongodbExample | 워크플로우 이름     
description  | 스트림 데이터를 MongoDB에 적재하는 예제  | 워크플로우를 설명하는 글
isBatch  | false | 스트림 처리를 하는 워크플로우 이므로, false 로 지정
verbose  | false | 디버깅을 위해 로그정보를 보고자할 경우, true 로 지정

###엔진 선택
본 예제에서는 스트림 데이터를 입력받아 처리한 뒤 MongoDB에 적재하므로 **StreamToBatch** 엔진을 드래그앤 드롭합니다.

- 엔진 속성

순번  | 엔진 Type | NickName  | RunType | 설명
--|---|---|---|--
1  | StreamToBatch  | ProcessingEngine  | 즉시실행  | 스트림 데이터를 MongoDB에 적재

####Reader
HTTP 서버로부터 전달되어 오는 데이터를 입력 받기 위해 **HttpServerReader** 를 드래그 앤 드롭한 후 아래표와 같은 속성을 지정합니다.

field  |value   | 설명
--|---|--
ip  |  0.0.0.0 |  HTTP 서버의 주소를 입력합니다.
port  |  53001 |  HTTP 서버의 포트번호를 입력합니다.


####Writer
**MongodbWriter** 를 드래그앤 드롭한 후 아래표와 같은 속성을 지정합니다.

field  |value   | 설명
--|---|--
serverAddress  | localhost:27017  |  MongoDB 서버 주소 및 포트  
dbName  |  examples |   DB 명  
collectionName  |  data_from_http |  생성할 테이블 명
cleaningDataInconsistency  |  true |  기존 테이블 삭제 및 재생성 여부

####Controller
**SparkSessionOrStreamController** 를 드래그앤 드롭한 후 아래 표와 같은 속성을 지정합니다.

field  |value   | 설명
--|---|--
setOperationPeriod  |  3 |  스트리밍 처리 주기 (초 단위)

####Runner
**SimpleSparkRunner** 를 드래그앤 드롭합니다. 디폴트 속성값을 사용합니다.


####Operator
본 예제에서는 스트림 입력을 그대로 MongoDB에 적재하므로 Operator를 사용하지 않습니다. 만약 스트림 입력 데이터를 가공해야 할 경우, 필요한 Operator를 드래그앤 드롭하여 속성값을 지정한 후 사용할 수 있습니다.

<br>

![워크플로우 완성 화면](./images/2.5.1_workflow.png)

ksbuser@etri.re.kr 계정으로 접속하면 예제 워크플로우가 만들어져있습니다. **HttpToMongodbExample** 을 불러오기하여 사용할 수 있습니다.

![워크플로우 불러오기](./images/2.5.1_workflowLoad.png)

##워크플로우 실행 및 모니터링하기
### 워크플로우 실행하기
위에서 작성한 워크플로우를 실행하기 위해서는 워크플로우 편집기 상단의 실행 버튼(<span style="color:#000000">&#9654;</span>)을 클릭합니다. 본 예제는 스트림 데이터를 처리하므로 **Batch** 체크 박스를 해제하고 워크플로우를 실행합니다.

![워크플로우 실행화면](./images/2.5.1_workflowStart.png)


### 워크플로우 모니터링 하기

#### 워크플로우 상태 확인
KSB 웹툴킷 상단의 **Monitoring** 메뉴를 클릭하여 진행내역/상태모니터링 화면으로 이동합니다. **Workflow** 탭에서 작성한 워크플로우가 실행 중 (<span style="color:#6698FF">Inprogress</span>)인 것을 확인할 수 있습니다. 이 화면에서 실행 중인 워크플로우를 종료(<span style="color:red">&#9724;</span>)하거나, 다시 실행(<span style="color:#6698FF">&#9654;</span>)할 수 있습니다.

![워크플로우 동작 상태 확인](./images/2.5.1_workflowMonitoring.png)

#### 워크플로우 로그 보기
**WorkFlow History** 탭을 선택하면, KSB 인공지능 프레임워크에서 워크플로우가 동작하며 발생시킨 로그 정보를 확인 할 수 있습니다.

![워크플로우 히스토리](./images/2.5.1_workflowHistory.png)

![워크플로우 동작 로그](./images/2.5.1_workflowLog.png)

## 데이터 적재 결과 확인하기
**입력 데이터 준비하기** 에서 설명한 방법대로
./send-data-via-http.sh를 이용하여 http로 데이터를 전송합니다.
```sh
csle@csle1:~/ksb-csle/examples$ ./send-data-via-http.sh localhost:53001
send data to: localhost:53001
OK! I got it.
```

MongoDB 클라이언트 프로그램을 이용하여, 위에서 발생한 스트림 데이터가 MongoDB에 적재되었는지 확인합니다.

 - 먼저 새로운 터미널을 열어 docker 컨테이너에 추가로 접속합니다.
 - 그리고, MongoDB 클라이언트 프로그램이 설치된 디렉터리로 이동합니다.

```sh
docker exec -it csle1 bash
csle@csle1:/$ cd /home/csle/mongodb/bin
```
 - MongoDB에 접속합니다.
```sh
$ mongo
```
![MongoDB](./images/2.5.1_mongoDB.png)

 - 데이터베이스를 확인한 후 선택합니다.
```sh
> show dbs
> use examples
```
![MongoDB](./images/2.5.1_mongoDB3.png)

 - 테이블 생성을 확인합니다.
```sh
> show collections
```
![MongoDB](./images/2.5.1_mongoDB4.png)

 - 적재된 데이터를 확인합니다.
```sh
> db.data_from_http.find()
```
![MongoDB](./images/2.5.1_mongoDB5.png)


## 워크플로우 종료하기
본 예제는 지속적으로 스트림데이터가 입력되므로 사용자가 워크플로우를 종료해야 합니다.
KSB 웹툴킷 상단의 **Monitoring** 메뉴를 클릭하여 진행내역/상태모니터링 화면으로 이동합니다. **Workflow** 탭에서 실행 중인 워크플로우를 종료(<span style="color:red">&#9724;</span>)합니다.