SAS Viya (92)

教學目標

初步了解 SAS Event Stream Processing 的基本概念。

重點概念

首先當我們在 Kubernetes 平台上部署完成 SAS Event Stream Processing 6.1,並且在登入 SAS Event Stream Processing Studio 打開或建立模型之前,我們必須啟動 SAS Event Stream Processing (ESP) 伺服器,此時我們主要能夠在安裝 Kubectl 工具的客戶端執行以下指令,登入至 sas-viya-espserver 容器中啟動 ESP 伺服器,其中 http 參數主要用於設定 HTTP REST API 連接埠,pubsub 參數主要用於設定伺服器使用的發佈/訂閱連接埠,並且當我們成功啟動 ESP 伺服器之後,就能夠透過 ifconfig 指令查看 ESP 伺服器的 IP 位置,此時就能夠登入 SAS Event Stream Processing Studio 新增 ESP 伺服器 。

登入至 sas-viya-espserver 容器

1
$ kubectl -n sas-esp exec -it $(kubectl -n sas-esp get po | grep espserver| awk '{print $1}') -- bash

設定 ESP 指令環境變數

1
2
3
4
$ cd /opt/sas/viya/home/SASEventStreamProcessingEngine/6.1/bin
$ export DFESP_HOME=/opt/sas/viya/home/SASEventStreamProcessingEngine/6.1
$ export LD_LIBRARY_PATH=$DFESP_HOME/lib:/opt/sas/viya/home/SASFoundation/sasexe
$ export PATH=$PATH:$DFESP_HOME/bin

(註:當發生 bash: dfesp_xml_client: command not found 錯誤資訊,就必須設定 ESP 指令環境變數。)

啟動 ESP 伺服器

1
$ dfesp_xml_server -pubsub 31415 -http 31416

接著我們就能夠在 SAS Event Stream Processing Studio 新增專案,所謂專案主要是由一個或多個連續查詢所組成,我們能夠透過 SAS Event Stream Processing Studio 來創立、上載、下載和刪除專案,並且將輸入資料流中的來源窗口拖拉至畫布中,並且將專案、查詢和來源名稱修改為英文,像是專案為 project、查詢為 query 和來源為 input,並且設定來源的輸出結構描述,當我們設定完成之後就能點選專案的 XML 編輯器,將 XML 編輯器中的所有內容在 sas-viya-espserver 的容器中建立「/model/model.xml」設定檔,執行以下指令將專案部署至 ESP 伺服器中。

專案設定檔內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<project name="Project" threads="1" pubsub="auto" heartbeat-interval="1">
<metadata>
<meta id="studioUploadedBy">sasboot</meta>
<meta id="studioUploaded">1562558125036</meta>
<meta id="studioModifiedBy">sasboot</meta>
<meta id="studioModified">1562599945761</meta>
<meta id="layout">{"Query":{"Input":{"x":30,"y":-705},"Transfer":{"x":30,"y":-610}}}</meta>
</metadata>
<contqueries>
<contquery name="Query">
<windows>
<window-source pubsub="true" name="Input">
<schema>
<fields>
<field name="id" type="string" key="true"/>
<field name="name" type="string"/>
<field name="score" type="int64"/>
</fields>
</schema>
</window-source>
<window-compute pubsub="true" name="Transfer">
<schema>
<fields>
<field name="id" type="string" key="true"/>
<field name="score" type="int64"/>
</fields>
</schema>
<output>
<field-expr><![CDATA[score + 1000]]></field-expr>
</output>
</window-compute>
</windows>
<edges>
<edge source="Input" target="Transfer"/>
</edges>
</contquery>
</contqueries>
</project>

部署專案至 ESP 伺服器中

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/eventStreamProcessing/v1/projects/Project" -put "file:///model/model.xml"

啟動 ESP 伺服器中的專案

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/eventStreamProcessing/v1/projects/Project/state?value=running" -put

查看 ESP 伺服器中的專案

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/SASESP/projects/"

停止 ESP 伺服器中的專案

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/eventStreamProcessing/v1/stoppedProjects/Project" -post

刪除 ESP 伺服器中的專案

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/eventStreamProcessing/v1/projects/Project" -delete

再來我們能夠透過 ESP 客戶端存取 WebSockets API,而 ESP 客戶端主要設定在指定 URI 中定義的訂戶,然後等待接收事件,這些事件將會以指定的格式輸出在控制台上,我們主要會先執行以下指令建立 WebSocket 訂閱 ESP 伺服器中的事件。

建立 WebSocket 訂閱 ESP 伺服器中的事件

1
$ dfesp_xml_client -url "ws://10.244.1.3:31415/eventStreamProcessing/v1/subscribers/Project/Query/Transfer"

當我們建立完成 WebSocket 訂閱事件之後,我們就能夠建立輸入事件資料「/model/input.csv」資料檔,並且執行以下指令建立 WebSocket 發佈事件至 ESP 伺服器中,主要會將事件的輸入資料經過專案中的轉換窗口處理之後,產生結果並會以指定的格式輸出在 WebSocket 訂閱事件的控制台上。

建立事件的輸入資料

1
2
3
1,image001.png,100
2,image002.png,200
3,image003.png,300

建立 WebSocket 發佈事件至 ESP 伺服器中

1
$ dfesp_xml_client -url "ws://10.244.1.3:31415/eventStreamProcessing/v1/publishers/Project/Query/Input/" -data "file:///data/input.csv"

最後因為 WebSocket 訂閱僅會輸出窗回當下立即處理的發佈事件,但是若我們需要針對處理之後的事件再進行後續整合第三方工具的處理和分析,則我們就能夠透過以下指令查看 ESP 伺服器所有事件,以及查看 ESP 伺服器特定窗口中的所有事件,以利進行後續處理和分析。

查看 ESP 伺服器所有事件

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/SASESP/events/"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<events count="6">
<event window="Project/Query/Input">
<id>3</id>
<name>image003.png</name>
<score>300</score>
</event>
<event window="Project/Query/Input">
<id>2</id>
<name>image002.png</name>
<score>200</score>
</event>
<event window="Project/Query/Input">
<id>1</id>
<name>image001.png</name>
<score>100</score>
</event>
<event window="Project/Query/Transfer">
<id>3</id>
<score>1300</score>
</event>
<event window="Project/Query/Transfer">
<id>2</id>
<score>1200</score>
</event>
<event window="Project/Query/Transfer">
<id>1</id>
<score>1100</score>
</event>
</events>

查看 ESP 伺服器特定窗口中的所有事件

1
$ dfesp_xml_client -url "http://10.244.1.3:31415/SASESP/events/Project/Query/Transfer/"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<events count="3">
<event window="Project/Query/Transfer">
<id>3</id>
<score>1300</score>
</event>
<event window="Project/Query/Transfer">
<id>2</id>
<score>1200</score>
</event>
<event window="Project/Query/Transfer">
<id>1</id>
<score>1100</score>
</event>
</events>

相關資源