彙整

SAS Viya (56)

教學目標

初步了解如何以 Python 執行 SAS Viya 平台的管理命令列介面 (Command-line Interfaces, CLIs) 解決資訊單位日常維運管理的痛點。

重點概念

首先 SAS Viya 平台提供管理命令列介面 (Command-line Interfaces, CLIs),以利我們直接透過指令的方式管理 SAS Viya 平台,而非透過介面的方式,此外我們更能夠透過 Python 呼叫 CLI 進行 SAS Viya 平台的管理操作。

接著使用 SAS Viya 的管理命令列介面,必須先設定 SAS_CLI_PROFILE 環境變數,此時我們能夠透過以下指令在 Linux 作業系統中自動設定 SAS_CLI_PROFILE 環境變數。

初始設定

1
2
# cd /opt/sas/viya/home/bin/
# ./sas-admin profile init

再來我們可以透過以下 Python 程式碼以系統管理帳號與密碼登入 SAS Viya 的管理命令列介面。

授權登入

1
2
import os
os.system('/opt/sas/viya/home/bin/sas-admin auth login -u [系統管理帳號] -p [系統管理密碼] ');

最後我們就能夠透過以下 Python 程式碼以 SAS Viya 的管理命令列介面將 Anita 這個使用者加入至業務部門的客製群組中,並且列出業務部門客製群組中的前 100 位使用者。

管理操作

1
2
3
os.system('/opt/sas/viya/home/bin/sas-admin identities create-group --id salesgroup --name Salesgroup --description "業務部門"');
os.system('/opt/sas/viya/home/bin/sas-admin identities add-member --user-member-id anita --group-id salesgroup')
os.system('/opt/sas/viya/home/bin/sas-admin identities list-members --group-id salesgroup --limit 100')

執行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NOTE: Grid node action status report: 1 nodes, 8 total actions executed.
Enter credentials for http://ip-xx-xx-xx-xx.ec2.internal:

Login succeeded. Token saved.
{
"description": "Custom sales group",
"id": "salesgroup",
"name": "Salesgroup",
"state": "active"
}
The group was created successfully.
anita has been added to group salesgroup
{
"items": [
{
"id": "anita",
"name": "SAS User",
"type": "user"
}
]
}

總結 SAS Viya 平台提供管理命令列介面 (Command-line Interfaces, CLIs) 理應能夠根據 IT 資訊單位維運管理的需求進行高度彈性的客製開發自動化維運管理,以利解決資訊單位日常維運管理的痛點。

相關資源

SAS Viya (55)

教學目標

初步了解如何在 SAS Viya 平台撰寫 SAS 程式碼的排程工作。

重點概念

首先在 SAS Viya 平台中我們可以透過 SAS Studio V 撰寫 SAS 程式碼,接著透過 SAS Job Execution 網站進行 SAS 程式碼的排程工作,相較於 SAS 9 平台主要是以 Workspace Server 伺服器執行 SAS 程式碼,而在 SAS Viya 平台則是以 Compute Server 伺服器執行 SAS 程式碼,至於 SAS 9 和 SAS Viya 平台的差別,請參考下表。

SAS 9 SAS Viya
Object Spawner Launcher Server + Service
Workspace Server Compute Server + Service
SAS Foundation Programming Runtime Environment (SPRE)

接著我們可以透過 SAS Job Execution 新增工作定義檔案,請注意 SAS Job Execution 必須透過網址 (https:// [SAS Viya 主機名稱] /SASJobExecution) 開啟,預設無法透過 SAS Viya 網站中的功能表開啟,之後我們需要按照以下步驟進行 SAS 程式碼的排程工作,分別為:

  1. 在 SAS Studio V 中撰寫和複製 SAS 程式碼。
  2. 在 SAS Job Execution 中建立和貼上 SAS 程式碼。
  3. 在 SAS Environment Manager 中建立排程工作。

再來目前若以 SAS Viya 平台排定特定時間執行 SAS Job Execution 中的 SAS 程式碼,但是還無法設定多個 SAS 程式碼的相依關係。但是我們則可以在工作定義中撰寫以下 SAS 程式碼,以利按照順序執行 SAS 程式碼,以及更能透過 &sysrc 等系統回傳值判斷 SAS 程式碼是否正常執行,請注意工作定義中不能夠只用「CAS CASAUTO;」,不然會發生「The request to start or connect to a session failed. Specify a UUID to connect to an existing session or specify a session name, port and host name to start a session.」錯誤訊息。

工作定義 SAS 程式碼

1
2
3
4
cas casauto host='<SAS Viya 主機名稱>' port=5570 sessopts=(caslib=Public timout=1000 locale="en_US");
filename <工作排程名稱> FILESRVC folderpath='<SAS 程式碼資料夾>' filename='<SAS 程式碼檔案名稱>';
%include <工作排程名稱> / source;
%put &syscc rc=&sysrc &syserr &syserrortext &syswarningtext;

儲存資料 SAS 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
cas auto;
libname mycas cas caslib=casuser;
data mycas.cars;
set sashelp.cars;
run;
proc casutil incaslib="casuser" outcaslib="casuser";
save casdata="cars" replace;
run;
proc casutil;
droptable casdata="cars" incaslib="casuser";
run;
cas terminate;

儲存資料 SAS 程式碼 (巨集)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* %exportFile(SAS 9 資料集, CAS 資料館, SASHDAT 檔案名稱) */
%macro exportFile(v_sasdata,v_caslib,v_casdata);
cas auto;
libname viyacas cas caslib=&v_caslib;
data viyacas.&v_casdata;
set &v_sasdata;
run;
proc casutil incaslib="&&v_caslib" outcaslib="&&v_caslib";
save casdata="&&v_casdata" replace;
run;
proc casutil;
droptable casdata="&&v_casdata" incaslib="&&v_caslib";
run;
cas terminate;
%mend;

%exportFile(sashelp.cars,casuser,cars);

當我們在 SAS Job Execution 新增完成工作定義之後,在工作定義上按右鍵選取「提交工作」就能夠立即執行工作,請注意每次提交工作系統就會在 SAS Environment Manager 中自動建立工作排程,以利後續設定時間定期執行。

最後當我們透過 SAS Job Execution 執行工作時預設則是會以「cas」系統帳號進行作業系統層的檔案存取操作,若是期望以該執行排程工作的使用者帳號進行檔案存取操作,則需要先建立「CASHostAccountRequired」群組,並且將該使用者帳號加入至該群組中,並且重新登出和登入 SAS Viya 平台,再執行工作排程就能夠以該使用者帳號進行檔案存取操作。

相關資源

SAS Viya (54)

教學目標

初步了解如何將 SAS 9 平台中的報表移轉至 SAS Viya 平台。

重點概念

首先若企業已經採用 SAS 9 平台中製作報表,此時若我們要將報表移轉至 SAS Viya 平台中,則可以透過 SAS Management Console 工具連線至 SAS 9 平台匯出報表的 spk 檔,接著再透過 SAS Viya 平台中的 SAS Environment Manager 網站匯入報表的 spk 檔,此時可能會發生無法正常匯入,請嘗試匯出報表所屬更高上層的資料夾打包為 spk 檔。

接著我們透過 SAS Viya 平台中的 SAS Environment Manager 網站中的內容匯入的過程主要有三個階段,分別為:

  1. 選取來源。
  2. 對應。
  3. 完成。

其中選取來源階段主要是選取包含要匯入之內容的 .json 或 .spk 檔,對應階段主要是我們將會需要設定報表中資料來源對應至 SAS Viya 平台中目前的 CAS 伺服器、CAS 資料館和 CAS 資料表,以利報表正常顯示,完成階段主要是顯示匯入的結果,並且產生 json 檔案。

再來當我們進行報表驗證時,將會發現有些報表無法正常顯示,請依序確認以下三件事,分別為:

  1. 確認資料來源中資料表是否有正常載入記憶體,建議先確認資料來源中是否有資料檔案。
  2. 確認篩選條件使用的資料項目是否存在,建議可以先移除所有圖表中的篩選功能。
  3. 確認自訂的資料項目是否能夠正常顯示,建議針對有問題的資料項目按右鍵進行編輯。

最後以上情況也會發生在 SAS Viya 平台報表移轉至 SAS Viya 平台報表,此外若是有無法編輯自訂的資料項目,並且導致報表中的圖表無法正常顯示,則我們就會需要重新建立與設定資料項目,因此再移轉報表之前建議先詳細列表出所有報表中所有自訂的資料項目,其類型主要有階層、自訂類別、計算項目、地理位置項目和參數。但若無法先進行詳細列表,則建議將 SAS Viya 平台安裝至另一台伺服器,以利後續針對資料項目逐一對應進行修改。

相關資源

SAS Viya (53)

教學目標

初步了解如何解決 SAS Viya 3.4 中 CAS 伺服器無法正常啟動的問題。

重點概念

首先當我們部署完成 SAS Viya 3.4 MPP 架構之後,主要會啟動 Cloud Analytics Services (CAS) 服務,以利進行分散式運算。此時可能會發生雖然 Ansible 工具部署 SAS Viya 3.4 正常完成沒有錯誤,但是以「sasboot」登入至「SAS Environment Manager」管理環境查看伺服器時,將會發現「cas-shared-default」的狀態為灰色無法進行操作,並且也無法進行資料的操作,因為無法選擇資料來源,以及無法正常查看授權產品資訊等情況發生,因此本篇文章主要就是要解決此問題。

接著我們先登入至所有 SAS Viya 伺服器,並且執行「ps aux|grep casluanch」指令確認是否每一台伺服器皆正常啟動 caslaunch 工具,若發現哪一台沒有正常啟動時,請執行「cat /etc/fstab」指令查看安裝 SAS Viya 的儲存空間是否被設定為「nosuid」,預設為「/opt/sas」,若是則請將「/opt/sas」複製至沒有設為「nosuid」的儲存空間,並且建立軟連結「/opt/sas」對應至沒有設為「nosuid」的儲存空間。

確認 caslaunch 是否正常執行

1
# ps aux|grep caslaunch

查看儲存空間是否為 nosuid

1
# cat /etc/fstab

建立對應的軟連結

1
2
3
# cp -Rp /opt/sas /sys/sas
# rm -rf /opt/sas
# ln -s /sys/sas /opt/sas

再來當我們設定完成之後我們在 SAS Viya 的「CAS Controller」伺服器執行「/etc/init.d/sas-viya-cascontroller-default restart」重新啟動 CAS 伺服器,其中包括「CAS Controller」和「CAS Worker」伺服器。至於執行相關記錄我們主要能夠查看 「/opt/sas/viya/config/var/log/cas/default」目錄中的「.log」和「.err」的記錄檔,像是若 CAS Worker 沒有正常啟動,則我們查看「caslaunchdefault_controller_daemon.log」記錄檔,則會發現「Node ‘‘ has not connected to the grid.」和「After 30 seconds nodes have not connected to the grid」的錯誤訊息。此外我們更能夠設定「/opt/sas/viya/config/etc/cas/default/logconfig.trace.xml」設定檔的記錄等級皆為「Trace」,以利查看更多執行詳細資訊,像是當我們設定記錄檔等級為「Trace」,並且重新啟動 CAS 伺服器之後,我們就能夠從「cas.log」記錄檔中查看所有 CAS 伺服器所執行「caslaunch」的完整指令,此時當我們將「caslaunch」的完整指令至對應的 CAS 伺服器執行時就能夠發現更多相關的錯誤訊息,像是以「cas」帳號執行完整指令,此時就會發現「UseHostToken specified in non-root launcher」的錯誤訊息。

重新啟動 CAS 伺服器

1
# /etc/init.d/sas-viya-cascontroller-default restart

查看 CAS 記錄檔

1
2
3
4
5
# cd /opt/sas/viya/config/var/log/cas/default
# ll -ltr
# vi cas_<yyyy-mm-dd>_<server>_<number>.log
# vi caslaunch_default_controller_daemon.log
# vi caslaunch_default_controller_daemon.err

設定 CAS 伺服器記錄檔等級

1
# vi/opt/sas/viya/config/etc/cas/default/logconfig.trace.xml

最後若還是有問題,則請設定 CAS 伺服器相關權限,透過權限的設定我們能夠了解 CAS 伺服器執行「caslaunch」工具主要是透過是以「cas」帳號 SSH 遠端無密碼連線至所有 CAS 伺服器,並且透過「root」帳號進行執行,所以若是部署的儲存空間設為「nosuid」將會導致無法正常執行。

設定 CAS 伺服器相關權限

1
2
3
4
5
6
# chown root:root /opt/sas/viya/home/SASFoundation/utilities/bin/caslaunch
# chmod u+s /opt/sas/viya/home/SASFoundation/utilities/bin/caslaunch
# chown cas:sas /opt/sas/viya/config/etc/cas/default/node.lua
# chown cas:sas /opt/sas/viya/config/etc/SASSecurityCertificateFramework/private/cas/shared/ -R
# chown cas:sas /opt/sas/viya/config/etc/SASSecurityCertificateFramework/tls/certs/cas/shared/default/ -R
# chown cas:sas /opt/sas/viya/config/etc/SASSecurityCertificateFramework/tokens/cas/shared/default/ -R

總結當我們部署 SAS Viya 3.4 時除了注意設定參數和網路連線之外,我們必須確認部署的儲存空間沒有設為「nosuid」,否則將會導致 CAS 伺服器無法正常啟動。

相關資源

SAS Viya (52)

教學目標

在 AWS 雲端平台中以 Kubernetes 容器叢集中部署 SAS Viya 3.4 平台的心得分享。

重點概念

首先我們在企業中部署 SAS Viya 3.4 平台,除了透過 Ansible 工具進行部署之外,當然我們還能夠透過 Docker 和 Kubernetes 進行部署。其中 Docker 部署的部份僅需要按照官方文件的步驟,就能夠順利完成,請注意 Docker 映像檔 (sas-viya-programming)、金鑰檔案 (license.sas) 和特定資料夾 (sasinside、sasdemo 和 cas) 是否已經建立就沒有太大的問題,當 Docker 部署完成之後僅能夠提供給程式設計師和資料科學家進行 SAS Studio 網站透過 SAS 程式碼完成機器學習的應用,至於能夠做到哪些機器學習的應用,請申請免費試用 SAS® ANALYTICS CLOUD 雲端服務,其中就有針對銀行資料進行機器學習演算法的分析應用教學。然而商業分析師和管理階層則會需要查看報表和更多視覺化非程式碼的業務需求等相關應用,此時僅以 Docker 部署是無法滿足業務需求,因此我們就需要透過 Kubernetes 進行完整部署,本篇主要則是針就以在 AWS 環境透過 kops 工具進行 SAS Viya 3.4 的叢集容器部署。

目前官方文件針對 Kubernetes 部署並沒有詳細步驟,僅有關鍵的重點概念,因此我們需要透過 SAS Software Github 上的 SAS Viya Container Recipes 進行部署,請先透過「git clone」指令下載至執行 Kubernetes 指令客戶端,若是以 AWS 雲端服務中的 EC2 伺服器為客戶端時,若發生「permission denied (publickey)」錯誤訊息,則需要將 EC2 伺服器中登入使用者的 SSH 連線公開金鑰檔「.ssh/id_rsa.pub」內容手動設定至登入的 Github 帳號中,若還是有問題則新增使用者執行「ssh-keygen」重新產生 SSH 連線公開金鑰檔試試。當我們下載 SAS Viya Container Recipes 相關檔案至「/sas-container-recipes」目錄之後,下一步我們必須準備 SAS Viya 3.4 的軟體信件取得 SAS_Viya_deployment_data.zip 檔案,並且上傳至「/sas-container-recipes」目錄中。

下載 SAS Viya Container Recipes 相關檔案

1
$ git clone git@github.com:sassoftware/sas-container-recipes.git

上傳 SAS_Viya_deployment_data.zip 檔案

1
$ cp /tmp/SAS_Viya_deployment_data.zip /sas-container-recipes

接著我們需要註冊 Docker Hub,主要會將建立的多個倉庫 上傳至 Docker Hub 中,當然我們必須安裝 Docker CE 工具才能夠透過腳本指令碼以 SAS_Viya_deployment_data.zip 建立多個倉庫,此時可能會遇到透過 ansible-container 自動化工具無法正常 Push 至 Docker Hub 倉庫的問題,此時我們僅需要修改「/sas-container-recipes/viya-visuals/viya-visuals-build.sh」腳本指令檔中的「ansible-container push —push-to docker-registry —username —password —tag ${SAS_DOCKER_TAG}」指令就能夠解決此問題。

安裝 Docker CE 工具

1
2
3
4
5
6
7
$ sudo su -
$ sudo yum install http://vault.centos.org/centos/7.3.1611/extras/x86_64/Packages/container-selinux-2.9-4.el7.noarch.rpm
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install epel-release
$ sudo yum install docker-ce
$ systemctl restart docker
$ docker -v

建立多個倉庫

1
2
3
4
$ cd /sas-container-recipes
$ docker login
$ chmod +x build.sh
$ ./build.sh --type full --docker-registry-namespace <Docker Hub 使用者 ID>/sas-viya --docker-registry-url docker.io --zip SAS_Viya_deployment_data.zip

再來我們需要透過「aws」工具、「kops」工具和「kubectl」工具在 AWS 雲端環境中搭配 IAM、S3、Route53、EC2 和 ELB 服務建立符合 Kubernete 操作的環境平台。此時需要在 IAM 建立 kops 帳號,並且取得 Access Token 和 Access Token Secret 以利「aws」工具進行 AWS 服務相關資源的存取,並且在 S3 中建立 Bucket,同時設定 kops 帳號擁有存取的權限,以及購買與設定網域,透過 Route53 購買「.com」網域一年僅需12 美元,購買之後 Route53 就會自動註冊網域,但若是從 GoDaddy 其它網站購買網域,則需要手動設定網域,至於 EC2 則是透過「kops」工具自動進行建立,而 ELB 則是透過「kubectl」工具自動進行建立。

最後當 AWS 環境準備完成之後,我們就能夠按照以下步驟透過指令以 Kubernetes 容器叢集建立 SAS Viya MPP 的完整部署,主要步驟分別為:

  1. 登入 AWS 取得存取權限
  2. 安裝與測試 kops 工具
  3. 安裝與測試 kubectl 工具
  4. 建立 Kubernetes 容器叢集
  5. 更新 Kubernetes 容器叢集
  6. 驗證 Kubernetes 容器叢集
  7. 取得 Kubernetes 容器叢集中的 Node 狀態
  8. 建立 Kubernetes 容器叢集專用的 ELB 負載平衡服務
  9. 取得 Kubernetes 容器叢集中的 Services 狀態
  10. 取得 sasboot 管理者帳號的重設密碼之網站連結

登入 AWS 取得存取權限

1
$ aws configure

安裝與測試 kops 工具

1
2
3
4
$ wget https://github.com/kubernetes/kops/releases/download/1.10.0/kops-linux-amd64
$ chmod +x kops-linux-amd64
$ mv kops-linux-amd64 /usr/local/bin/kops
$ kops

安裝與測試 kubectl 工具

1
2
3
$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ kubectl

建立 Kubernetes 容器叢集

1
$ kops create cluster --name=<叢集名稱>  --state=s3://<S3 儲存桶名稱>  --zones=us-east-1d  --master-size=<EC2 實體類型>  --node-size=<EC2 實體類型>  --node-count=2  --dns-zone=<網域名稱>

更新 Kubernetes 容器叢集

1
$ kops update cluster <叢集名稱> --state=s3://<S3 儲存桶名稱> --yes

驗證 Kubernetes 容器叢集

1
$ kops validate cluster <叢集名稱> --state=s3://<S3 儲存桶名稱>

取得 Kubernetes 容器叢集中的 Node 狀態

1
$ kubectl get nodes

部署 SAS Viya 服務至 Kubernetes 容器叢集

1
2
3
4
$ cd /sas-container-recipes
$ kubectl create -f viya-visuals/working/manifests/kubernetes/configmaps/
$ kubectl create -f viya-visuals/working/manifests/kubernetes/secrets/
$ kubectl create -f viya-visuals/working/manifests/kubernetes/deployments-mpp/

取得 Kubernetes 容器叢集中的 Pod 狀態

1
$ kubectl get pods

建立 Kubernetes 容器叢集專用的 ELB 負載平衡服務

1
$ vi sas-viya-visual.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: sas-viya-visual
spec:
selector:
app: sas-viya-httpproxy
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
type: LoadBalancer
1
$ kubectl create -f sas-viya-visual.yml

取得 Kubernetes 容器叢集中的 Services 狀態

1
$ kubectl get svc

取得 sasboot 管理者帳號的重設密碼之網站連結

1
2
3
$ kubectl get pods
$ kubectl exec -it <sas-viya-coreservices 之 Pod 名稱> -- /bin/bash
$ grep sasboot `ls -tr /opt/sas/viya/config/var/log/saslogon/default/sas-saslogon_* | tail -n 1`

總結當我們建立 Docker Hub 倉庫之後,每次若要以 Kubernetes 容器叢集部署 SAS Viya 服務,不包括拉下 Docker 映像檔,則僅需要半小時就能夠完成部署,當然我們更能夠透過「kops」工具快速刪除 Kubernetes 容器叢集,以節省 AWS 雲端服務的測試成本,至於有關更多進階的設定,像是 LDAP 設定、SAS Studio 登入、SAS/ACCESS 存取、…,之後有空再進行心得分享。

刪除 Kubernetes 容器叢集

1
$ kops delete cluster --name=<叢集名稱> --state=s3://<S3 儲存桶名稱> --yes

相關資源