Commit 1830da19 authored by HooYoungAhn's avatar HooYoungAhn
Browse files
parents 2799fc83 9ff1a3e9
Pipeline #1125 canceled with stages
...@@ -13,21 +13,23 @@ export_on_save: ...@@ -13,21 +13,23 @@ export_on_save:
## 입력 데이터 준비하기 ## 입력 데이터 준비하기
본 예제에서는 온도 센서 스트림 데이터를 HTTP로 입력 받는 것을 가정합니다. 이를 위해 Jmeter 도구를 활용합니다. 본 예제에서는 온도 센서 스트림 데이터를 HTTP로 입력 받는 것을 가정합니다. 이를 위해 Jmeter 도구를 활용합니다.
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/jmeter.html">Jmeter 설명 바로가기</a> <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/jmeter.html">Jmeter 설명 바로가기</a>
### 온도 스트림데이터 생성하기 ### 온도 스트림데이터 생성하기
워크플로우 실행 결과를 확인하기 위해서는 온도데이터를 스트림 형태로 발생시켜야합니다. Jmeter를 활용한 온도 스트림데이터 생성하는 방법은 메뉴얼 하단의 "결과 확인하기" 를 확인해주시기 바랍니다. 워크플로우 실행 결과를 확인하기 위해서는 온도데이터를 스트림 형태로 발생시켜야합니다. Jmeter를 활용한 온도 스트림데이터 생성하는 방법은 메뉴얼 하단의 "결과 확인하기" 를 확인해주시기 바랍니다.
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 두 개의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 두 개의 엔진을 생성합니다.
### 첫 번째 엔진 생성하기 ### 첫 번째 엔진 생성하기
####엔진 선택 #### 엔진 선택
스트림형태로 제공되는 온도 데이터를 입력받아 실시간 온도 예측을 하는 서빙 엔진으로 전달하기 위해 Streamtostream 엔진을 선택합니다. 스트림형태로 제공되는 온도 데이터를 입력받아 실시간 온도 예측을 하는 서빙 엔진으로 전달하기 위해 Streamtostream 엔진을 선택합니다.
#####Reader
##### Reader
HTTP 서버로부터 전달되어 오는 센서데이터를 입력 받기 위해 HttpServerReader를 선택하고 아래표와 같은 속성을 지정합니다. HTTP 서버로부터 전달되어 오는 센서데이터를 입력 받기 위해 HttpServerReader를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
ip | 0.0.0.0 | HTTP 서버의 IP 주소 ip | 0.0.0.0 | HTTP 서버의 IP 주소
...@@ -35,8 +37,9 @@ path | / | HTTP 서버의 URL ...@@ -35,8 +37,9 @@ path | / | HTTP 서버의 URL
port | 53002 | HTTP 서버의 포트 번호 port | 53002 | HTTP 서버의 포트 번호
#####Writer ##### Writer
StreamToStream엔진에서 처리된 결과를 다음 엔진에게 Stream 형태로 전달해야 하므로 KafkaWriter를 선택합니다. StreamToStream엔진에서 처리된 결과를 다음 엔진에게 Stream 형태로 전달해야 하므로 KafkaWriter를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
topic | test3 | 온도 예측 결과를 받아 올때 사용할 Kafka 큐의 이름 topic | test3 | 온도 예측 결과를 받아 올때 사용할 Kafka 큐의 이름
...@@ -45,8 +48,9 @@ groupId | group3 | Kafka writer topic 그룹 아이디 ...@@ -45,8 +48,9 @@ groupId | group3 | Kafka writer topic 그룹 아이디
bootStrapServer | csle1:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServer | csle1:9092 | Kafka 접속 주소(IP, 포트번호)
#####Controller ##### Controller
Controller 로는 WindowedSparkSessionOrStreamController 를 선택합니다. WindowedSparkSessionOrStreamController 는 스트림으로 입력되는 데이터를 큐에 저장하고, 일정 주기 마다 정해진 윈도우 크기로 잘라서 operator 에게 전달합니다. Controller 로는 WindowedSparkSessionOrStreamController 를 선택합니다. WindowedSparkSessionOrStreamController 는 스트림으로 입력되는 데이터를 큐에 저장하고, 일정 주기 마다 정해진 윈도우 크기로 잘라서 operator 에게 전달합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
operationPeriod | 2 | Reader로 부터 데이터를 읽어올 주기 | 53002 | HTTP 서버의 포트번호를 입력합니다. operationPeriod | 2 | Reader로 부터 데이터를 읽어올 주기 | 53002 | HTTP 서버의 포트번호를 입력합니다.
...@@ -54,14 +58,16 @@ inputQueSize | 1 | 입력 큐의 크기 | | ...@@ -54,14 +58,16 @@ inputQueSize | 1 | 입력 큐의 크기 | |
selectedColumnName | temperature | Spark dataframe에서 추출할 컬럼의 이름 | | selectedColumnName | temperature | Spark dataframe에서 추출할 컬럼의 이름 | |
windowSize | 10 | 큐에서 사용할 윈도우의 크기 | | windowSize | 10 | 큐에서 사용할 윈도우의 크기 | |
#####Runner ##### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드 라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드 라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | master | 아래의 표 참고 sparkArgs | master | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
...@@ -72,7 +78,7 @@ driverMemory | 1g | Spark 드라이버 메모리 ...@@ -72,7 +78,7 @@ driverMemory | 1g | Spark 드라이버 메모리
#####Operator ##### Operator
첫번째 엔진에서는 센서로부터 입력되는 온도 데이터를 여섯가지 전처리 기법을 적용하여 정제합니다. 본 예제에서 사용한 전처리 기법은 ColumnSelectOperator, MinMaxScalingOperator, TransposeOperator, SparkMLPredictOperator, MinMaxScalingOperator, ColumnSelectOperator 입니다. 첫번째 엔진에서는 센서로부터 입력되는 온도 데이터를 여섯가지 전처리 기법을 적용하여 정제합니다. 본 예제에서 사용한 전처리 기법은 ColumnSelectOperator, MinMaxScalingOperator, TransposeOperator, SparkMLPredictOperator, MinMaxScalingOperator, ColumnSelectOperator 입니다.
- ColumnSelectOperator - ColumnSelectOperator
...@@ -126,11 +132,12 @@ field |value | 설명 ...@@ -126,11 +132,12 @@ field |value | 설명
selectedColumnId | 13 | 선택할 칼럼 ID selectedColumnId | 13 | 선택할 칼럼 ID
### 두 번째 엔진 생성하기 ### 두 번째 엔진 생성하기
####엔진 선택 #### 엔진 선택
스트림 형태로 전달되는 온도 예측값을 온디맨드 서빙을 하기 위해 OnDemandStreamServing 엔진을 선택합니다. (KSB프레임워크에서는 도커 컨테이너 내부의 지식베이스(KB)가 실행되고 있습니다.) 스트림 형태로 전달되는 온도 예측값을 온디맨드 서빙을 하기 위해 OnDemandStreamServing 엔진을 선택합니다. (KSB프레임워크에서는 도커 컨테이너 내부의 지식베이스(KB)가 실행되고 있습니다.)
#####Reader ##### Reader
첫번째 엔진에서 입력되는 실시간 온도 예측값을 입력 받기 위해 KafkaOnDemandReader 를 선택합니다. 첫번째 엔진에서 입력되는 실시간 온도 예측값을 입력 받기 위해 KafkaOnDemandReader 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
topic | test3 | 실시간 온도 예측값을 받아올때 사용할 Kafka 큐의 이름 topic | test3 | 실시간 온도 예측값을 받아올때 사용할 Kafka 큐의 이름
...@@ -139,18 +146,19 @@ groupId | group3 | Kafka writer topic 그룹 아이디 ...@@ -139,18 +146,19 @@ groupId | group3 | Kafka writer topic 그룹 아이디
bootStrapServer | csle1:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServer | csle1:9092 | Kafka 접속 주소(IP, 포트번호)
#####Writer ##### Writer
이 엔진에서는 Writer를 사용하지 않습니다. 이 엔진에서는 Writer를 사용하지 않습니다.
#####Controller ##### Controller
Controller 로는 servingWithkbController를 선택합니다. servingWithkbController는 추가적인 속성을 설정하지 않습니다. Controller 로는 servingWithkbController를 선택합니다. servingWithkbController는 추가적인 속성을 설정하지 않습니다.
#####Runner ##### Runner
REST 방식으로 엔진을 실행 하기위해서는 ServingRunner를 선택합니다. REST 방식으로 엔진을 실행 하기위해서는 ServingRunner를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- | --|---|-- |
port | 18080 | 최적의 제어값을 서빙할 포트번호 | port | 18080 | 최적의 제어값을 서빙할 포트번호 |
...@@ -158,7 +166,7 @@ host | 0.0.0.0 | 최적의 제어값을 서빙할 IP | ...@@ -158,7 +166,7 @@ host | 0.0.0.0 | 최적의 제어값을 서빙할 IP |
#####Operator ##### Operator
두 번째 엔진에서는 ControlContextQueryOperator를 사용합니다. 두 번째 엔진에서는 ControlContextQueryOperator를 사용합니다.
field |value | 설명 field |value | 설명
...@@ -184,7 +192,7 @@ values(name) | temperature | 질의 속성 | ...@@ -184,7 +192,7 @@ values(name) | temperature | 질의 속성 |
ksbuser@etri.re.kr 계정으로 접속하면 예제 워크플로우가 만들어져있습니다. 불러오기해서도 돌려볼 수 있습니다. ksbuser@etri.re.kr 계정으로 접속하면 예제 워크플로우가 만들어져있습니다. 불러오기해서도 돌려볼 수 있습니다.
##워크플로우 실행 및 모니터링하기 ## 워크플로우 실행 및 모니터링하기
### 워크플로우 실행하기 ### 워크플로우 실행하기
위에서 작성한 워크플로우를 실행하기 위해서는 워크플로우 편집기 상단의 실행 버튼을 누릅니다. 이 때, StreamToStream 엔진과 OnDemandStreamServing 엔진은 배치형태로 실행되지 않는 엔진들이므로 Batch 체크 박스는 해제하고 워크플로우를 제출해야합니다. 위에서 작성한 워크플로우를 실행하기 위해서는 워크플로우 편집기 상단의 실행 버튼을 누릅니다. 이 때, StreamToStream 엔진과 OnDemandStreamServing 엔진은 배치형태로 실행되지 않는 엔진들이므로 Batch 체크 박스는 해제하고 워크플로우를 제출해야합니다.
...@@ -213,7 +221,7 @@ WorkFlow History 탭을 선택하면, KSB프레임워크에서 워크플로우 ...@@ -213,7 +221,7 @@ WorkFlow History 탭을 선택하면, KSB프레임워크에서 워크플로우
![워크플로우 동작 로그](./images/2.5.9_06.png) ![워크플로우 동작 로그](./images/2.5.9_06.png)
##결과 확인하기 ## 결과 확인하기
#### 온도 스트림데이터 생성하기 #### 온도 스트림데이터 생성하기
워크플로우 실행 결과를 확인하기 위해서는 온도데이터를 스트림 형태로 발생시켜야 합니다. 이를 위해 위에서 설명한 Jmeter 도구를 활용합니다. 워크플로우 실행 결과를 확인하기 위해서는 온도데이터를 스트림 형태로 발생시켜야 합니다. 이를 위해 위에서 설명한 Jmeter 도구를 활용합니다.
...@@ -229,7 +237,7 @@ Method: GET ...@@ -229,7 +237,7 @@ Method: GET
URL: http://localhost:18080/query URL: http://localhost:18080/query
``` ```
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/postman.html">Postman 설명 바로가기</a> <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/postman.html">Postman 설명 바로가기</a>
![Jmeter로 온도 스트림데이터 입력하기](./images/2.5.9_08.png) ![Jmeter로 온도 스트림데이터 입력하기](./images/2.5.9_08.png)
......
...@@ -52,7 +52,7 @@ python3 kangnam_producer.py ./input/201601_kangnam.csv localhost:9092 traffic 0. ...@@ -52,7 +52,7 @@ python3 kangnam_producer.py ./input/201601_kangnam.csv localhost:9092 traffic 0.
![파일 업로드](./images/2.6_fileUpload.png) ![파일 업로드](./images/2.6_fileUpload.png)
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 하나의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 하나의 엔진을 생성합니다.
- 워크플로우 속성 - 워크플로우 속성
...@@ -115,12 +115,14 @@ slidingSize | 1360 | 윈도우를 sliding 하는 크기 <br> 170 x 8 ...@@ -115,12 +115,14 @@ slidingSize | 1360 | 윈도우를 sliding 하는 크기 <br> 170 x 8
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
......
...@@ -10,11 +10,11 @@ export_on_save: ...@@ -10,11 +10,11 @@ export_on_save:
텐서플로우 기반 딥러닝 모델을 이용한 교통 속도 예측 RESTful 서비스 예제를 설명합니다. 텐서플로우 기반 딥러닝 모델을 이용한 교통 속도 예측 RESTful 서비스 예제를 설명합니다.
## 입력 데이터 준비하기 ## 입력 데이터 준비하기
<a href="http://csleoss.etri.re.kr:8088/images/contents/manual_1.0/2.6.2.TrafficTraining.html">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있다고 가정합니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.2.TrafficTraining.md">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있다고 가정합니다.
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 하나의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 하나의 엔진을 생성합니다.
- 워크플로우 속성 - 워크플로우 속성
...@@ -44,6 +44,7 @@ TensorflowServingController 를 선택합니다. ...@@ -44,6 +44,7 @@ TensorflowServingController 를 선택합니다.
#### Runner #### Runner
TensorflowServingRunner 를 선택하고 아래표와 같은 속성을 지정합니다. TensorflowServingRunner 를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
port | 8001 | RESTful 서비스 포트번호 port | 8001 | RESTful 서비스 포트번호
......
...@@ -10,7 +10,7 @@ export_on_save: ...@@ -10,7 +10,7 @@ export_on_save:
교통센서로부터 시계열 속도 데이터를 수집한 후 전처리를 수행하고, 텐서플로우 기반 딥러닝 모델에 의해 예측된 속도를 클라이언트로 전달하는 예제를 설명합니다. 교통센서로부터 시계열 속도 데이터를 수집한 후 전처리를 수행하고, 텐서플로우 기반 딥러닝 모델에 의해 예측된 속도를 클라이언트로 전달하는 예제를 설명합니다.
## 입력 데이터 준비하기 ## 입력 데이터 준비하기
본 예제에서는 교통센서로부터 시계열 속도 데이터(LINK_ID, 속도, 날짜)를 Kafka로 입력 받는 것을 가정합니다. 5분 단위로 측정된 센서 데이터가 시간 순으로 들어온다고 가정합니다. 또한, <a href="http://csleoss.etri.re.kr:8088/images/contents/manual_1.0/2.6.2.TrafficTraining.html">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있다고 가정합니다. 본 예제에서는 교통센서로부터 시계열 속도 데이터(LINK_ID, 속도, 날짜)를 Kafka로 입력 받는 것을 가정합니다. 5분 단위로 측정된 센서 데이터가 시간 순으로 들어온다고 가정합니다. 또한, <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.2.TrafficTraining.html">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있다고 가정합니다.
### 시계열 속도 스트림데이터 생성하기 ### 시계열 속도 스트림데이터 생성하기
본 예제를 위해 준비된 파일로부터 시계열 속도 데이터를 한줄씩 읽어 Kafka로 보내주는 파이썬 프로그램을 제공합니다. 본 예제를 위해 준비된 파일로부터 시계열 속도 데이터를 한줄씩 읽어 Kafka로 보내주는 파이썬 프로그램을 제공합니다.
...@@ -112,12 +112,14 @@ slidingSize | 170 | 윈도우를 sliding 하는 크기 ...@@ -112,12 +112,14 @@ slidingSize | 170 | 윈도우를 sliding 하는 크기
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
......
...@@ -52,7 +52,7 @@ python3 kangnam_producer.py ./input/201601_kangnam_orgarnized_new.csv localhost: ...@@ -52,7 +52,7 @@ python3 kangnam_producer.py ./input/201601_kangnam_orgarnized_new.csv localhost:
![파일 업로드](./images/2.6_fileUpload.png) ![파일 업로드](./images/2.6_fileUpload.png)
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 두 개의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 두 개의 엔진을 생성합니다.
- 워크플로우 속성 - 워크플로우 속성
...@@ -80,6 +80,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true ...@@ -80,6 +80,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true
#### Reader #### Reader
KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호)
...@@ -95,6 +96,7 @@ failOnDataLoss | false | ...@@ -95,6 +96,7 @@ failOnDataLoss | false |
#### Writer #### Writer
KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
mode | append | 새로 들어온 입력데이터에 대해서 처리함 mode | append | 새로 들어온 입력데이터에 대해서 처리함
...@@ -112,12 +114,14 @@ StreamingGenericController 를 선택합니다. ...@@ -112,12 +114,14 @@ StreamingGenericController 를 선택합니다.
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
...@@ -145,6 +149,7 @@ groupby | AVG | 평균 계산 ...@@ -145,6 +149,7 @@ groupby | AVG | 평균 계산
window | | 아래의 표 참고 window | | 아래의 표 참고
window 설정은 다음과 같이 합니다. window 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
key | PRCS_DATE | 윈도우를 사용할 칼럼 이름 key | PRCS_DATE | 윈도우를 사용할 칼럼 이름
...@@ -173,6 +178,7 @@ field |value | 설명 ...@@ -173,6 +178,7 @@ field |value | 설명
selectedColumn | | 아래의 표 참고 selectedColumn | | 아래의 표 참고
selectedColumn 설정은 다음과 같이 합니다. selectedColumn 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함) selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함)
...@@ -196,6 +202,7 @@ missing value를 채우고 잡음을 smoothing 하기 위해, 한번 더 카프 ...@@ -196,6 +202,7 @@ missing value를 채우고 잡음을 smoothing 하기 위해, 한번 더 카프
#### Reader #### Reader
KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호)
...@@ -210,6 +217,7 @@ failOnDataLoss | false | ...@@ -210,6 +217,7 @@ failOnDataLoss | false |
#### Writer #### Writer
KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
mode | append | 새로 들어온 입력데이터에 대해서 처리함 mode | append | 새로 들어온 입력데이터에 대해서 처리함
...@@ -227,12 +235,14 @@ StreamingGenericController 를 선택합니다. ...@@ -227,12 +235,14 @@ StreamingGenericController 를 선택합니다.
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
...@@ -260,6 +270,7 @@ groupby | AVG | 평균 계산 ...@@ -260,6 +270,7 @@ groupby | AVG | 평균 계산
window | | 아래의 표 참고 window | | 아래의 표 참고
window 설정은 다음과 같이 합니다. window 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
key | PRCS_DATE | 윈도우를 사용할 칼럼 이름 key | PRCS_DATE | 윈도우를 사용할 칼럼 이름
...@@ -288,6 +299,7 @@ field |value | 설명 ...@@ -288,6 +299,7 @@ field |value | 설명
selectedColumn | | 아래의 표 참고 selectedColumn | | 아래의 표 참고
selectedColumn 설정은 다음과 같이 합니다. selectedColumn 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함) selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함)
...@@ -334,9 +346,8 @@ cd /home/csle/ksb-csle/tools/kafka_2.11-0.10.0.1 ...@@ -334,9 +346,8 @@ cd /home/csle/ksb-csle/tools/kafka_2.11-0.10.0.1
./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --bootstrap-server localhost:9092 --topic traffic_output2 ./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --bootstrap-server localhost:9092 --topic traffic_output2
``` ```
아래 그림과 같이 전처리한 속도값을 Kafka로 보내는 것을 확인할 수 있습니다. 전처리한 속도값을 Kafka로 보내는 것을 확인할 수 있습니다.
![전처리 결과 확인](./images/2.6.5_predictResult.png)
## 워크플로우 종료하기 ## 워크플로우 종료하기
......
...@@ -45,7 +45,8 @@ python3 kangnam_producer.py ./input/201601_kangnam_orgarnized_new.csv localhost: ...@@ -45,7 +45,8 @@ python3 kangnam_producer.py ./input/201601_kangnam_orgarnized_new.csv localhost:
### 학습된 모델 업로드 ### 학습된 모델 업로드
<a href="http://csleoss.etri.re.kr:8088/images/contents/manual_1.0/2.6.2.TrafficTraining.html">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있을 경우, 아래 과정을 생략합니다.
<a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.2.TrafficTraining.md">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있을 경우, 아래 과정을 생략합니다.
그렇지 않을 경우, Host PC의 /home/csle/ksb-csle/examples/models/kangnam/model 폴더에 있는 텐서플로우 서빙용으로 export 한 모델을 HDFS repository에 웹툴킷을 이용하여 업로드합니다. 그렇지 않을 경우, Host PC의 /home/csle/ksb-csle/examples/models/kangnam/model 폴더에 있는 텐서플로우 서빙용으로 export 한 모델을 HDFS repository에 웹툴킷을 이용하여 업로드합니다.
model/kangnam 위치에 model 폴더를 업로드 합니다. model/kangnam 위치에 model 폴더를 업로드 합니다.
...@@ -64,7 +65,7 @@ model/kangnam 위치에 model 폴더를 업로드 합니다. ...@@ -64,7 +65,7 @@ model/kangnam 위치에 model 폴더를 업로드 합니다.
![파일 업로드](./images/2.6_fileUpload.png) ![파일 업로드](./images/2.6_fileUpload.png)
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 세 개의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 세 개의 엔진을 생성합니다.
- 워크플로우 속성 - 워크플로우 속성
...@@ -92,6 +93,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true ...@@ -92,6 +93,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true
#### Reader #### Reader
KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호)
...@@ -107,6 +109,7 @@ failOnDataLoss | false | ...@@ -107,6 +109,7 @@ failOnDataLoss | false |
#### Writer #### Writer
KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
mode | append | 새로 들어온 입력데이터에 대해서 처리함 mode | append | 새로 들어온 입력데이터에 대해서 처리함
...@@ -124,12 +127,14 @@ StreamingGenericController 를 선택합니다. ...@@ -124,12 +127,14 @@ StreamingGenericController 를 선택합니다.
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
...@@ -157,6 +162,7 @@ groupby | AVG | 평균 계산 ...@@ -157,6 +162,7 @@ groupby | AVG | 평균 계산
window | | 아래의 표 참고 window | | 아래의 표 참고
window 설정은 다음과 같이 합니다. window 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
key | PRCS_DATE | 윈도우를 사용할 칼럼 이름 key | PRCS_DATE | 윈도우를 사용할 칼럼 이름
...@@ -185,6 +191,7 @@ field |value | 설명 ...@@ -185,6 +191,7 @@ field |value | 설명
selectedColumn | | 아래의 표 참고 selectedColumn | | 아래의 표 참고
selectedColumn 설정은 다음과 같이 합니다. selectedColumn 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함) selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함)
...@@ -208,6 +215,7 @@ missing value를 채우고 잡음을 smoothing 하기 위해, 한번 더 카프 ...@@ -208,6 +215,7 @@ missing value를 채우고 잡음을 smoothing 하기 위해, 한번 더 카프
#### Reader #### Reader
KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeReader를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호) bootStrapServers | localhost:9092 | Kafka 접속 주소(IP, 포트번호)
...@@ -222,6 +230,7 @@ failOnDataLoss | false | ...@@ -222,6 +230,7 @@ failOnDataLoss | false |
#### Writer #### Writer
KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
mode | append | 새로 들어온 입력데이터에 대해서 처리함 mode | append | 새로 들어온 입력데이터에 대해서 처리함
...@@ -239,12 +248,14 @@ StreamingGenericController 를 선택합니다. ...@@ -239,12 +248,14 @@ StreamingGenericController 를 선택합니다.
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
...@@ -272,6 +283,7 @@ groupby | AVG | 평균 계산 ...@@ -272,6 +283,7 @@ groupby | AVG | 평균 계산
window | | 아래의 표 참고 window | | 아래의 표 참고
window 설정은 다음과 같이 합니다. window 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
key | PRCS_DATE | 윈도우를 사용할 칼럼 이름 key | PRCS_DATE | 윈도우를 사용할 칼럼 이름
...@@ -300,6 +312,7 @@ field |value | 설명 ...@@ -300,6 +312,7 @@ field |value | 설명
selectedColumn | | 아래의 표 참고 selectedColumn | | 아래의 표 참고
selectedColumn 설정은 다음과 같이 합니다. selectedColumn 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함) selectedColIndex | 1 | window.start 칼럼 선택 (0번부터 시작함)
...@@ -355,13 +368,16 @@ slidingSize | 170 | 윈도우를 sliding 하는 크기 ...@@ -355,13 +368,16 @@ slidingSize | 170 | 윈도우를 sliding 하는 크기
본 예제에서는 5초 주기마다 1530 개의 데이터를 잘라서 operator에게 전달합니다. 입력데이터는 총 170개의 LINK_ID 를 가집니다. 따라서 5분 간격으로 170개의 데이터가 들어오는 셈입니다. 그런데 170개 데이터의 순서는 무작위로 들어옵니다. 또한 스트림 데이터는 계속해서 들어오고 있으므로 첫 시작 데이터가 어디일지 가늠하기 어렵습니다. 따라서 필요한 8 주기 보다 한 주기를 더 가져와서 처리하고 (170 x 9 = 1530 개), 1 주기 씩 슬라이딩 합니다. 아래에서 설명할 GroupByFilterOperator 및 OrderByFilterOperator 를 이용하여 170 x 8 = 1360 개 데이터를 필터링해서 사용합니다. 본 예제에서는 5초 주기마다 1530 개의 데이터를 잘라서 operator에게 전달합니다. 입력데이터는 총 170개의 LINK_ID 를 가집니다. 따라서 5분 간격으로 170개의 데이터가 들어오는 셈입니다. 그런데 170개 데이터의 순서는 무작위로 들어옵니다. 또한 스트림 데이터는 계속해서 들어오고 있으므로 첫 시작 데이터가 어디일지 가늠하기 어렵습니다. 따라서 필요한 8 주기 보다 한 주기를 더 가져와서 처리하고 (170 x 9 = 1530 개), 1 주기 씩 슬라이딩 합니다. 아래에서 설명할 GroupByFilterOperator 및 OrderByFilterOperator 를 이용하여 170 x 8 = 1360 개 데이터를 필터링해서 사용합니다.
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
......
...@@ -15,7 +15,7 @@ export_on_save: ...@@ -15,7 +15,7 @@ export_on_save:
<br> <br>
본 예제는 <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/2.6.6.TrafficStreamingPredict.html">실시간 시계열 교통속도 센서스트림 처리 및 텐서플로우 모델 서빙하기</a> 매뉴얼에 따라 워크플로우를 작성하였다고 가정하고 이어서 설명을 합니다. 본 예제는 <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.6.TrafficStreamingPredict.md">실시간 시계열 교통속도 센서스트림 처리 및 텐서플로우 모델 서빙하기</a> 매뉴얼에 따라 워크플로우를 작성하였다고 가정하고 이어서 설명을 합니다.
## 입력 데이터 준비하기 ## 입력 데이터 준비하기
...@@ -60,10 +60,10 @@ dataset/tensorflowTrainSource 위치에 폴더를 업로드 합니다. ...@@ -60,10 +60,10 @@ dataset/tensorflowTrainSource 위치에 폴더를 업로드 합니다.
![코드 업로드](./images/2.6.2_codeUpload2.png) ![코드 업로드](./images/2.6.2_codeUpload2.png)
`tensorflow_train.py` 파일은 텐서플로우 기반의 15분 뒤 속도를 예측하는 모델을 학습하는 코드가 구현되어 있는 파일입니다. (본 예제에서는 LSTM 알고리즘을 이용하여 15분 뒤 속도를 예측하는 모델을 사용합니다.) 프레임워크와 연동하여 학습이 되도록 파이썬 코드에 input 과 output 경로 등을 argument 로 받는 부분이 코딩되어야 합니다. 자세한 내용은 <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/2.7.2.KSB_TfPyCoding_Guide.html">KSB 프레임워크과 연동을 위한 tensorflow 학습코드 작성하기</a> 를 참고합니다. `tensorflow_train.py` 파일은 텐서플로우 기반의 15분 뒤 속도를 예측하는 모델을 학습하는 코드가 구현되어 있는 파일입니다. (본 예제에서는 LSTM 알고리즘을 이용하여 15분 뒤 속도를 예측하는 모델을 사용합니다.) 프레임워크와 연동하여 학습이 되도록 파이썬 코드에 input 과 output 경로 등을 argument 로 받는 부분이 코딩되어야 합니다. 자세한 내용은 <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.7.2.KSB_TfPyCoding_Guide.md">KSB 프레임워크과 연동을 위한 tensorflow 학습코드 작성하기</a> 를 참고합니다.
### 학습된 모델 업로드 ### 학습된 모델 업로드
<a href="http://csleoss.etri.re.kr:8088/images/contents/manual_1.0/2.6.2.TrafficTraining.html">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있을 경우, 아래 과정을 생략합니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.2.TrafficTraining.md">교통속도예측 텐서플로우 모델 학습하기</a> 매뉴얼에서 학습한 후 export 된 모델이 ``hdfs://csle1:9000/user/ksbuser_etri_re_kr/model/kangnam`` 위치에 저장되어 있을 경우, 아래 과정을 생략합니다.
그렇지 않을 경우, Host PC의 /home/csle/ksb-csle/examples/models/kangnam/model 폴더에 있는 텐서플로우 서빙용으로 export 한 모델을 HDFS repository에 웹툴킷을 이용하여 업로드합니다. 그렇지 않을 경우, Host PC의 /home/csle/ksb-csle/examples/models/kangnam/model 폴더에 있는 텐서플로우 서빙용으로 export 한 모델을 HDFS repository에 웹툴킷을 이용하여 업로드합니다.
model/kangnam 위치에 model 폴더를 업로드 합니다. model/kangnam 위치에 model 폴더를 업로드 합니다.
...@@ -83,7 +83,7 @@ model/kangnam 위치에 model 폴더를 업로드 합니다. ...@@ -83,7 +83,7 @@ model/kangnam 위치에 model 폴더를 업로드 합니다.
![파일 업로드](./images/2.6_fileUpload.png) ![파일 업로드](./images/2.6_fileUpload.png)
##워크플로우 생성하기 ## 워크플로우 생성하기
워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 다섯 개의 엔진을 생성합니다. 워크플로우 편집화면에서 워크플로우를 작성합니다. 본 예제에서는 다섯 개의 엔진을 생성합니다.
- 워크플로우 속성 - 워크플로우 속성
...@@ -105,7 +105,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true ...@@ -105,7 +105,7 @@ verbose | false | 디버깅을 위해 로그정보를 보고자할 경우, true
4 | StreamToBatch | PreprocessingEngine | 즉시실행 | 딥러닝 모델 학습을 위한 전처리 4 | StreamToBatch | PreprocessingEngine | 즉시실행 | 딥러닝 모델 학습을 위한 전처리
5 | Batch | TrainEngine | 반복실행 | 딥러닝 모델 학습 5 | Batch | TrainEngine | 반복실행 | 딥러닝 모델 학습
앞의 세 개 엔진은 <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/2.6.6.TrafficStreamingPredict.html">실시간 시계열 교통속도 센서스트림 처리 및 텐서플로우 모델 서빙하기</a> 매뉴얼을 참고하여 생성합니다. 워크플로우 편집화면 상단의 **Load Workflow** 메뉴를 이용하여 *TrafficStreamingPredict* 워크플로우를 불러옵니다. 앞의 세 개 엔진은 <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.6.6.TrafficStreamingPredict.md">실시간 시계열 교통속도 센서스트림 처리 및 텐서플로우 모델 서빙하기</a> 매뉴얼을 참고하여 생성합니다. 워크플로우 편집화면 상단의 **Load Workflow** 메뉴를 이용하여 *TrafficStreamingPredict* 워크플로우를 불러옵니다.
![워크플로우 불러오기](./images/2.6.7_workflowLoad.png) ![워크플로우 불러오기](./images/2.6.7_workflowLoad.png)
...@@ -121,6 +121,7 @@ KafkaPipeWriter를 하나 더 추가합니다. StreamJoin 엔진은 여러 개 ...@@ -121,6 +121,7 @@ KafkaPipeWriter를 하나 더 추가합니다. StreamJoin 엔진은 여러 개
#### Writer #### Writer
KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다. KafkaPipeWriter를 선택하고 아래표와 같은 속성을 지정합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
mode | append | 새로 들어온 입력데이터에 대해서 처리함 mode | append | 새로 들어온 입력데이터에 대해서 처리함
...@@ -176,12 +177,14 @@ slidingSize | 1360 | 윈도우를 sliding 하는 크기 <br> 170 x 8 ...@@ -176,12 +177,14 @@ slidingSize | 1360 | 윈도우를 sliding 하는 크기 <br> 170 x 8
#### Runner #### Runner
SimpleSparkRunner 를 선택합니다. SimpleSparkRunner 를 선택합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달. inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달.
sparkArgs | | 아래의 표 참고 sparkArgs | | 아래의 표 참고
sparkArgs 설정은 다음과 같이 합니다. sparkArgs 설정은 다음과 같이 합니다.
field |value | 설명 field |value | 설명
--|---|-- --|---|--
master | local[\*] | YARN 의 마스터 master | local[\*] | YARN 의 마스터
......
...@@ -41,7 +41,7 @@ print_background: true ...@@ -41,7 +41,7 @@ print_background: true
$> python setup.py install $> python setup.py install
``` ```
KSB 프레임워크가 설치되어있지 않다면 설치매뉴얼 (https://csleoss.etri.re.kr/kor/sub05_01.do)을 참고하여 KSB 프레임워크를 설치합니다. KSB 프레임워크가 설치되어있지 않다면 설치매뉴얼을 참고하여 KSB 프레임워크를 설치합니다.
### 2. base.py 와 main_func 생성하기 ### 2. base.py 와 main_func 생성하기
......
...@@ -10,7 +10,7 @@ export_on_save: ...@@ -10,7 +10,7 @@ export_on_save:
이 예제에서는 CSV 자료를 Batch 형태로 입력받아 Parquet 파일로 저장하는 방법에 대해 설명합니다. 이 예제에서는 CSV 자료를 Batch 형태로 입력받아 Parquet 파일로 저장하는 방법에 대해 설명합니다.
<b>참고</b>: Parquet 파일은 KSB 프레임워크가 제공하는 <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/2.5.5.BatchAutoMLTrainInSingleEngine.html">AutoML 기능</a> 혹은 <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/2.5.4.BatchMLTrainInSingleEngine.html">ML학습 기능</a>을 사용하기 위해 필요한 입력자료 형태입니다. <b>참고</b>: Parquet 파일은 KSB 프레임워크가 제공하는 <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.5.5.BatchAutoMLTrainInSingleEngine.md">AutoML 기능</a> 혹은 <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/2.5.4.BatchMLTrainInSingleEngine.md">ML학습 기능</a>을 사용하기 위해 필요한 입력자료 형태입니다.
## 입력 데이터 준비하기 ## 입력 데이터 준비하기
입력데이터는 헤더 정보를 포함하는 CSV 파일이어야 합니다. 본 예제에서는 Host PC의 "/home/csle/ksb-csle/examples/input/iris.csv" 를 사용자 HDFS repository 의 "dataset/input" 폴더에 업로드하여 사용합니다. 입력데이터는 헤더 정보를 포함하는 CSV 파일이어야 합니다. 본 예제에서는 Host PC의 "/home/csle/ksb-csle/examples/input/iris.csv" 를 사용자 HDFS repository 의 "dataset/input" 폴더에 업로드하여 사용합니다.
......
# KSB 프레임워크 SW 개발환경 구성 # KSB 프레임워크 SW 개발환경 구성
KSB 프레임워크를 이용한 신규 컴퍼넌트의 개발과 scala clientSDK를 이용한 워크플로우 실행 시나리오 작성 및 실행을 요청하기 위한 개발환경 구성방법을 설명합니다. KSB 프레임워크를 이용한 신규 컴퍼넌트의 개발과 scala clientSDK를 이용한 워크플로우 실행 시나리오 작성 및 실행을 요청하기 위한 개발환경 구성방법을 설명합니다.
KSB 프레임워크 SW 개발을 위한 환경을 구성하기 위한 절차는 다음과 같습니다. KSB 프레임워크 SW 개발을 위한 환경을 구성하기 위한 절차는 다음과 같습니다.
- KSB 프레임워크 실행 및 테스트 환경구성 ( <a href="https://csleoss.etri.re.kr/images/contents/manual_1903/1.2.HowToInstallKsbToolBox-1903.html">툴박스 설치</a> 참조 ) - KSB 프레임워크 실행 및 테스트 환경구성 ( <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/1.2.HowToInstallKsbToolBox-1903.md">툴박스 설치</a> 참조 )
- Scala IDE 설치 - Scala IDE 설치
- Java8 sdk 설치 - Java8 sdk 설치
- Maven 빌드도구 설치 - Maven 빌드도구 설치
...@@ -19,7 +18,7 @@ KSB 프레임워크 SW 개발을 위한 환경을 구성하기 위한 절차는 ...@@ -19,7 +18,7 @@ KSB 프레임워크 SW 개발을 위한 환경을 구성하기 위한 절차는
## KSB 프레임워크 실행(테스트) 환경구성 ## KSB 프레임워크 실행(테스트) 환경구성
[KSB 툴박스 설치][c87a2fc0] 에서 제시하는 절차에 따라 KSB 프레임워크 실행(테스트) 환경을 구성합니다. [KSB 툴박스 설치][c87a2fc0] 에서 제시하는 절차에 따라 KSB 프레임워크 실행(테스트) 환경을 구성합니다.
[c87a2fc0]: https://csleoss.etri.re.kr/images/contents/manual_1903/1.2.HowToInstallKsbToolBox-1903.html "KSB 툴박스 설치" [c87a2fc0]: https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/1.2.HowToInstallKsbToolBox-1903.md "KSB 툴박스 설치"
## Scala IDE (개발도구) 설치 ## Scala IDE (개발도구) 설치
...@@ -122,9 +121,6 @@ $ brew intall maven ...@@ -122,9 +121,6 @@ $ brew intall maven
[다운로드][3c996289] 에 로그인하여 KSB 인공지능 프레임워크 오픈소스인 ksb-oss_dist (실행 바이너리 포함)를 다운로드 합니다. [다운로드][3c996289] 에 로그인하여 KSB 인공지능 프레임워크 오픈소스인 ksb-oss_dist (실행 바이너리 포함)를 다운로드 합니다.
- ksb_oss_v1_0.tar.gz : KSB 인공지능 프레임워크 오픈소스 압축파일 - ksb_oss_v1_0.tar.gz : KSB 인공지능 프레임워크 오픈소스 압축파일
[3c996289]: https://csleoss.etri.re.kr/kor/sub02_01.do "KSB 프레임워크 다운로드 페이지"
다운로드한 파일을 압축해제하면 ksb-oss_dist 디렉토리가 생성되며, 다음과 같이 출력되는 것을 확인합니다. 다운로드한 파일을 압축해제하면 ksb-oss_dist 디렉토리가 생성되며, 다음과 같이 출력되는 것을 확인합니다.
......
...@@ -7,7 +7,7 @@ export_on_save: ...@@ -7,7 +7,7 @@ export_on_save:
--- ---
# KSB 웹툴킷에 새로 개발한 Operator 컴퍼넌트 등록하기 # KSB 웹툴킷에 새로 개발한 Operator 컴퍼넌트 등록하기
--- ---
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.2.1.HowToDevelopOperator.html">Operator 컴퍼넌트 개발하기 매뉴얼</a> 에서 SW 개발자가 만든 **MyColumnSelectWithFileOperator** 를 웹툴킷에서 사용할 수 있도록 등록하는 방법을 설명합니다. **Component** 메뉴를 클릭하여 Component 관리화면 으로 이동합니다. 컴포넌트를 등록하기 위한 절차는 다음과 같습니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.2.1.HowToDevelopOperator.md">Operator 컴퍼넌트 개발하기 매뉴얼</a> 에서 SW 개발자가 만든 **MyColumnSelectWithFileOperator** 를 웹툴킷에서 사용할 수 있도록 등록하는 방법을 설명합니다. **Component** 메뉴를 클릭하여 Component 관리화면 으로 이동합니다. 컴포넌트를 등록하기 위한 절차는 다음과 같습니다.
1. 컴퍼넌트를 등록할 버전 선택 1. 컴퍼넌트를 등록할 버전 선택
2. Enum Component 등록하기 2. Enum Component 등록하기
...@@ -17,7 +17,7 @@ export_on_save: ...@@ -17,7 +17,7 @@ export_on_save:
## 컴퍼넌트를 등록할 버전 선택 ## 컴퍼넌트를 등록할 버전 선택
**Revision** 탭으로 이동합니다. *Version Map* 표에서 웹툴킷의 *Component Version* 과 프레임워크의 *KSB Version* 목록을 확인할 수 있습니다. 본 예제에서는 SW 개발자가 만든 신규 컴퍼넌트를 웹툴킷의 *Component Version* = 1.0.1 에 등록합니다. 따라서 1.0.1 버전을 *Working version* 으로 선택합니다. 1.0.1 버전이 없을 경우, <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.4.HowToUseComponent.html">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 생성합니다 (복제 기능 이용). **Revision** 탭으로 이동합니다. *Version Map* 표에서 웹툴킷의 *Component Version* 과 프레임워크의 *KSB Version* 목록을 확인할 수 있습니다. 본 예제에서는 SW 개발자가 만든 신규 컴퍼넌트를 웹툴킷의 *Component Version* = 1.0.1 에 등록합니다. 따라서 1.0.1 버전을 *Working version* 으로 선택합니다. 1.0.1 버전이 없을 경우, <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.4.HowToUseComponent.md">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 생성합니다 (복제 기능 이용).
![버전 선택](./images/3.4.1_revision.png) ![버전 선택](./images/3.4.1_revision.png)
...@@ -38,7 +38,7 @@ message MySelectColumnsWithFileInfo { ...@@ -38,7 +38,7 @@ message MySelectColumnsWithFileInfo {
} }
``` ```
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.4.HowToUseComponent.html">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 입력합니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.4.HowToUseComponent.md">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 입력합니다.
![메세지 입력화면](./images/3.4.1_component.png) ![메세지 입력화면](./images/3.4.1_component.png)
......
...@@ -7,7 +7,7 @@ export_on_save: ...@@ -7,7 +7,7 @@ export_on_save:
--- ---
# KSB 웹툴킷에 새로 개발한 Reader 컴퍼넌트 등록하기 # KSB 웹툴킷에 새로 개발한 Reader 컴퍼넌트 등록하기
--- ---
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.2.2.HowToDevelopReader.html">Reader 컴퍼넌트 개발하기 매뉴얼</a> 에서 SW 개발자가 만든 **MyFileReader** 를 웹툴킷에서 사용할 수 있도록 등록하는 방법을 설명합니다. **Component** 메뉴를 클릭하여 Component 관리화면 으로 이동합니다. 컴포넌트를 등록하기 위한 절차는 다음과 같습니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.2.2.HowToDevelopReader.md">Reader 컴퍼넌트 개발하기 매뉴얼</a> 에서 SW 개발자가 만든 **MyFileReader** 를 웹툴킷에서 사용할 수 있도록 등록하는 방법을 설명합니다. **Component** 메뉴를 클릭하여 Component 관리화면 으로 이동합니다. 컴포넌트를 등록하기 위한 절차는 다음과 같습니다.
1. 컴퍼넌트를 등록할 버전 선택 1. 컴퍼넌트를 등록할 버전 선택
2. Enum Component 등록하기 2. Enum Component 등록하기
...@@ -17,7 +17,8 @@ export_on_save: ...@@ -17,7 +17,8 @@ export_on_save:
## 컴퍼넌트를 등록할 버전 선택 ## 컴퍼넌트를 등록할 버전 선택
**Revision** 탭으로 이동합니다. *Version Map* 표에서 웹툴킷의 *Component Version* 과 프레임워크의 *KSB Version* 목록을 확인할 수 있습니다. 본 예제에서는 SW 개발자가 만든 신규 컴퍼넌트를 웹툴킷의 *Component Version* = 1.0.1 에 등록합니다. 따라서 1.0.1 버전을 *Working version* 으로 선택합니다. 1.0.1 버전이 없을 경우, <a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.4.HowToUseComponent.html">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 생성합니다 (복제 기능 이용). **Revision** 탭으로 이동합니다. *Version Map* 표에서 웹툴킷의 *Component Version* 과 프레임워크의 *KSB Version* 목록을 확인할 수 있습니다. 본 예제에서는 SW 개발자가 만든 신규 컴퍼넌트를 웹툴킷의 *Component Version* = 1.0.1 에 등록합니다. 따라서 1.0.1 버전을 *Working version* 으로 선택합니다. 1.0.1 버전이 없을 경우,
<a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.4.HowToUseComponent.md"> KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 생성합니다 (복제 기능 이용).
![버전 선택](./images/3.4.1_revision.png) ![버전 선택](./images/3.4.1_revision.png)
...@@ -55,7 +56,7 @@ message MyFileInfo { ...@@ -55,7 +56,7 @@ message MyFileInfo {
} }
``` ```
<a href="https://csleoss.etri.re.kr/images/contents/manual_1.0/3.4.HowToUseComponent.html">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 입력합니다. <a href="https://etrioss.kr/thkimetri/ksb19.03-manual/blob/master/manual1903/3.4.HowToUseComponent.md">KSB 웹툴킷 컴퍼넌트 등록 매뉴얼</a>을 참고하여 입력합니다.
![메세지 입력화면](./images/3.4.2_component.png) ![메세지 입력화면](./images/3.4.2_component.png)
<!--![메세지 입력화면](./images/3.4.2_component2.png) --> <!--![메세지 입력화면](./images/3.4.2_component2.png) -->
......
...@@ -13,7 +13,7 @@ export_on_save: ...@@ -13,7 +13,7 @@ export_on_save:
</br> </br>
</br> </br>
- 아래 그림의 경우 최소 포인트가 6일 경우 클러스터 할당 모습이다. Epsilon 만큼 범위를 확대해 나가고 있다. - 아래 그림의 경우 최소 포인트가 6일 경우 클러스터 할당 모습이다. Epsilon 만큼 범위를 확대해 나가고 있다.
<img src=/images/4.1.1.1.DBSCAN.png> <img src=./images/4.1.1.1.DBSCAN.png>
- 클러스터에 할당하기 위한 최소 조건이 min point가 6이상이어야 한다 - 클러스터에 할당하기 위한 최소 조건이 min point가 6이상이어야 한다
하지만 z는 이웃이 5개, 2개 이므로 noise 포인트가 된다. 하지만 z는 이웃이 5개, 2개 이므로 noise 포인트가 된다.
## Operator 파라미터 설명 ## Operator 파라미터 설명
......
...@@ -11,7 +11,7 @@ export_on_save: ...@@ -11,7 +11,7 @@ export_on_save:
- 한번에 하나씩의 설명변수를 사용하여 예측 가능한 규칙들의 집합을 생성하는 알고리즘이다. - 한번에 하나씩의 설명변수를 사용하여 예측 가능한 규칙들의 집합을 생성하는 알고리즘이다.
- 입력한 데이터 중 DecisionTree의 결과를 토대로 주요한 column을 추출하는 기능이다. - 입력한 데이터 중 DecisionTree의 결과를 토대로 주요한 column을 추출하는 기능이다.
<img src=/images/4.1.1.20.Decision_tree.png width="500" align="center" > <br> <img src=./images/4.1.1.20.Decision_tree.png width="500" align="center" > <br>
wikipedia,2018년8월20일,https://ko.wikipedia.org/wiki/결정_트리_학습법 wikipedia,2018년8월20일,https://ko.wikipedia.org/wiki/결정_트리_학습법
......
...@@ -10,8 +10,8 @@ export_on_save: ...@@ -10,8 +10,8 @@ export_on_save:
## Operator 설명 ## Operator 설명
- 데이터의 분산(variance)을 최대한 보존하면서 서로 직교하는 새 축을 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법이다. - 데이터의 분산(variance)을 최대한 보존하면서 서로 직교하는 새 축을 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법이다.
<img src="/images/4.1.1.23.PCA1.PNG"> <img src="./images/4.1.1.23.PCA1.PNG">
<img src="/images/4.1.1.23.PCA2.PNG"> <img src="./images/4.1.1.23.PCA2.PNG">
## Operator 파라미터 설명 ## Operator 파라미터 설명
......
...@@ -11,7 +11,7 @@ export_on_save: ...@@ -11,7 +11,7 @@ export_on_save:
- 입력 데이터를 분포도(fraction)만큼 무작위로 sampling을 하는 방법이다. - 입력 데이터를 분포도(fraction)만큼 무작위로 sampling을 하는 방법이다.
구현 알고리즘은 SSRWR와 SSRWOR가 있으며 Replacement에 따라 sampling을 중복으로 뽑힐지 설정할 수 있다. (withReplacement가 true 면 중복 sampling 가능하다.) 구현 알고리즘은 SSRWR와 SSRWOR가 있으며 Replacement에 따라 sampling을 중복으로 뽑힐지 설정할 수 있다. (withReplacement가 true 면 중복 sampling 가능하다.)
<img src="/images/4.1.1.24.randomSampling.png" width="600"> <img src="./images/4.1.1.24.randomSampling.png" width="600">
......
...@@ -10,7 +10,7 @@ export_on_save: ...@@ -10,7 +10,7 @@ export_on_save:
## Operator 설명 ## Operator 설명
- 모든 설명 변수를 고려한 모형에서 유의하지 않은 설명 변수를 하나씩 제거하는 방법이다. - 모든 설명 변수를 고려한 모형에서 유의하지 않은 설명 변수를 하나씩 제거하는 방법이다.
Spark ml의 LinearRegeression을 사용하여 P-Value를 구하여 유의성 검증 하게 된다. 입력 받은 기준 P-Value보다 클 경우 적합하지 않은 칼럼으로 제거 처리하도록 구현하였다. Spark ml의 LinearRegeression을 사용하여 P-Value를 구하여 유의성 검증 하게 된다. 입력 받은 기준 P-Value보다 클 경우 적합하지 않은 칼럼으로 제거 처리하도록 구현하였다.
<img src=/images/4.1.1.25.backward.PNG width="700"> <img src=./images/4.1.1.25.backward.PNG width="700">
## Operator 파라미터 설명 ## Operator 파라미터 설명
- labelName: 라벨 이름 (required) - labelName: 라벨 이름 (required)
- pValue: 귀무가설이 맞다고 가정했을 때 해당 관측치와 그것보다 더 극단적인 관측치가 나올 확률 (required) - pValue: 귀무가설이 맞다고 가정했을 때 해당 관측치와 그것보다 더 극단적인 관측치가 나올 확률 (required)
......
...@@ -10,7 +10,7 @@ export_on_save: ...@@ -10,7 +10,7 @@ export_on_save:
## Operator 설명 ## Operator 설명
- 고려된 설명변수 중 설명력이 가장 높고 설명력이 유의한 설명변수를 하나씩 선택하는 방법이다. - 고려된 설명변수 중 설명력이 가장 높고 설명력이 유의한 설명변수를 하나씩 선택하는 방법이다.
Spark ml의 LinearRegeression을 사용하여 P-Value를 구하여 유의성 검증 하게 된다. 입력 받은 기준 P-Value보다 작을 경우 적합한 칼럼으로 선택 처리하도록 구현하였다. Spark ml의 LinearRegeression을 사용하여 P-Value를 구하여 유의성 검증 하게 된다. 입력 받은 기준 P-Value보다 작을 경우 적합한 칼럼으로 선택 처리하도록 구현하였다.
<img src=/images/4.1.1.26.forward.PNG width="700"> <img src=./images/4.1.1.26.forward.PNG width="700">
## Operator 파라미터 설명 ## Operator 파라미터 설명
- labelName: 라벨 이름 (required) - labelName: 라벨 이름 (required)
- pValue: 귀무가설이 맞다고 가정했을 때 해당 관측치와 그것보다 더 극단적인 관측치가 나올 확률 (required) - pValue: 귀무가설이 맞다고 가정했을 때 해당 관측치와 그것보다 더 극단적인 관측치가 나올 확률 (required)
......
...@@ -11,7 +11,7 @@ export_on_save: ...@@ -11,7 +11,7 @@ export_on_save:
- 모집단을 먼저 중복되지 않도록 층으로 나눈 다음 각 층에서 표본을 추출하는 방법이다. 층을 나눌 때 층내는 동질적, 층간은 이질적 특성을 가지도록 하면 적은 비용으로 더 정확한 추정을 할 수 있으며, 전체 모집단뿐만 아니라 각 층의 특성에 대한 추정도 할 수 있다는 장점이 있다. - 모집단을 먼저 중복되지 않도록 층으로 나눈 다음 각 층에서 표본을 추출하는 방법이다. 층을 나눌 때 층내는 동질적, 층간은 이질적 특성을 가지도록 하면 적은 비용으로 더 정확한 추정을 할 수 있으며, 전체 모집단뿐만 아니라 각 층의 특성에 대한 추정도 할 수 있다는 장점이 있다.
&emsp;&emsp;&emsp;&emsp;&emsp;<img src="/images/4.1.1.27.Stratified_sampling.PNG" width="500" align="center"> &emsp;&emsp;&emsp;&emsp;&emsp;<img src="./images/4.1.1.27.Stratified_sampling.PNG" width="500" align="center">
slideshare,2018년8월20일,https://www.slideshare.net/Newsjelly/1-50965379 slideshare,2018년8월20일,https://www.slideshare.net/Newsjelly/1-50965379
## Operator 파라미터 설명 ## Operator 파라미터 설명
......
...@@ -13,7 +13,7 @@ export_on_save: ...@@ -13,7 +13,7 @@ export_on_save:
- NEAREST: 가장 가까운 점의 값을 선택하는 방법이다. - NEAREST: 가장 가까운 점의 값을 선택하는 방법이다.
- PREV_COPY: 이전 값을 선택하는 방법이다. - PREV_COPY: 이전 값을 선택하는 방법이다.
<img src="/images/4.1.1.29.interpolation.jpg" ><br> <img src="./images/4.1.1.29.interpolation.jpg" ><br>
위키피디아,2018년8월20일,https://ko.wikipedia.org/wiki/선형_보간법 위키피디아,2018년8월20일,https://ko.wikipedia.org/wiki/선형_보간법
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment