2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SAS Viya入門

Posted at

前提

Base SASについてある程度知識があることを前提として記載する。
Base SASについてはSAS入門をご確認ください。

概要:SAS Viyaとは

SAS Viyaは独自の総合的なアーキテクチャ備えたオープンなクラウド対応のインメモリ分析エンジン。
CASはSAS Viyaの計算を担う機能で、CASを使用するとスケーラブルな分散コンピューティングが提供され、ビッグデータの処理が非常に高速になる。

オープンアーキテクチャとは

ソフトウェアやハードウェアの仕様を公開すること。
SAS ViyaではこれによってCLIでのアクセスも可能で、RESTfulAPIs※によってSAS ViyaのGUIでできる操作の自動化ができる。
※参考:https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2

導入には

yum, RPM, Ansibleなど業界標準のソフトウェアを使用
一台のサーバマシンへのデプロイ(SMPモード)と複数サーバマシンのデプロイ(MPPモード)の両方をサポートしている。SMPでもMPPでも各サーバー内では、CASのマルチスレッドで処理実行される。
注: Windowsでは、CAS サーバーはSMP処理を使用します。
また、SAS ViyaとSAS9は両方とも物理・仮想の同じHW上に共存できる。

超並列処理(MPP)機能

SAS Viyaでは超並列処理(MPP)機能によって、ビッグデータの処理機能がクラスター内のノード群に効率よく分散される
インメモリ方式のランタイム処理能力は極めて高速かつ、フェールオーバー機能によって保護される(ノードに障害が発生しても自動的に対処)
負荷に応じてノードを動的に削除・追加することも可能

導入後は

分析モデルの構築や機械学習による予測は勿論、他言語(Python, Java, Luaなど)からSASを実行することも可能。どの言語で記載をしても、SASが実行され、SAS Viyaサーバモニタで処理状況を確認できる。UIはSAS Studio(Webベース)。

SAS/CONNECT

SAS/CONNECTインターフェイスを使用すれば、SAS9とSAS Viyaの間を自由に行き来できる
既存コードや分析モデルのリモート実行や、2環境間でのデータ転送も可能に。
参照:https://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/n0zbaghsdpnee0n19znxvy5afc87.htm

SAS Homeとは

SAS Viyaでの作業を一元管理するためのWebベースのUI
SAS Visual AnalyticsやSAS Visual Data BuilderなどすべてのSASアプリにアクセスできる

アーキテクチャ

SAS Viyaは複数マシンの分散プラットフォーム。
各マシンにはディスクストレージ、メモリ、CPUがあり、何らかのNWを介して接続される。

image.png
引用:SAS Tutorial | What is SAS Viya

CASサーバ

Server ControllerとServer Workerのマシンが連携して分散マルチマシンデータ処理環境(SAS Cloud Analytics Service=CAS)を提供している。これらのマシンをCASサーバと呼ぶ。
Workerの数は必要に応じてスケールアップ、スケールインすることが可能。
CASは共有サーバであるため、複数のユーザが同じメモリ内データを異なる処理タスクに使用することができる。

tableデータの扱い

CASでは複数のテーブルをロードできる。
これらのテーブルはディスク上での利用のみではなく、メモリ内にも保持される。各tableはすべてのworkerにメモリ内で分散され、様々なCASアクションと並行して処理される。
データの永久コピーをディスクに保存することもできる。
CASはディスクからメモリへの並列ロードとメモリからディスクへの並列保存をサポートする。

インメモリデータの考え方

データがディスクからロードされると長時間にわたってメモリ内に残り、一人または複数のユーザーが繰り返し使用できるというもの。
参考:https://qiita.com/gorooe/items/cc3c6a43587fa379a26d

SPRE(SAS Programming Run-Time Environment)セッション

各ユーザはSPREと呼ばれるSASセッションで、CASサーバとのセッションを開始する。
SPREはSASプログラムが最初にsubmitされる場所であり、インターフェースはSAS Studioを使用することができる。
SAS9.4M5以降もしくはそれ以降のバージョンをSPREの代わりに使用することもできる。これにより既存のSAS9のコードを統合することが可能。

  1. ClientのブラウザからSPREサーバへアクセスし、SAS Studioセッションを開始
    1. この時点ではCASサーバにはアクセスしていない
    2. 従来のデータステップなどをSPREで実行することが可能
  2. SAS StudioセッションからCASサーバ上でCASセッションを開始することも可能
    1. CASセッションはマルチセッションで独自のセッションコントローラが作成される

caslibs

caslibはSAS Viyaのデータおよびその他のアクセス情報を保持するためのメモリ内スペース。つまり、テーブルを識別する方法となる。
各caslibはデータを永続的に保存できるディスク上のデータソースの場所にも関連付けられている。
ディスクデータソースはデータセットのみならず、CSVやDBのtableなども含む。
従来のSASライブラリと同様にCASセッションごとに複数のcaslibを定義することが可能。
固有のデータ情報に加え、様々なユーザやグループに対する特定の権限も含まれている。誰がアクセスできるのか、そのデータに対してどのような権限が与えられているのかを制御できる必要がある。

ロード方法

テーブルをメモリにロードするには以下のような方法がある。いずれの方法もSPREマシン上で実行されているSAS Studioセッションから送信されるPRGをもとに実行される。

  • proc casutillを使用
    • SPREマシンに保存されているデータをCASに移動する
    • ディスクからセッションコントローラーにデータをロード→各workerにロード
    • CASワーカー直接ロード(.sashdat形式である必要あり)

SPRE vs CAS

使うプロシージャを変換して、CASエンジンでそれらの計算処理を実行して、大幅に処理時間を短縮することも期待できます。
例えば、下記いくつかCPUリソースをたくさん使う計算処理のプロシージャは、シングルマシンでシングルスレッド実行するよりも、CAS上でマルチスレッドの実行により良いパフォーマンスを提供できます。
▪ PROC LOGISTIC (SPRE) ➔ PROC LOGSELECT (CAS)
▪ PROC MIXED (SPRE) ➔ PROC LMIXED (CAS)
▪ PROC REG (SPRE) ➔ PROC REGSELECT (CAS)

従来のプロシージャでCASのインメモリテーブルを使うことも可能(CASからSPREマシンに戻され、SPREセッションで処理される)
data stepやproc fedsqlのコードはCASで実行することもできるが、特定の処理(例:lag()など)が実行されるとSPREで実行される。
CAS環境で実行できるPRGではwhere句をCAS環境に渡すことができ、サブセットを取り込むことができる。

data step

要件として、setステートメントで読み込むデータと、出力するデータの両方がCASインメモリテーブルである必要がある。
CASではdata stepはCAS workerノード全体で並列スレッドで実行される。

ds2

sessref optionにCASセッション名を指定、入力と出力の両方にCASテーブルを使用している場合にCASで実行できる。
ds2 data programは単一のworkerノードで実行されるが、ds2スレッドはworkerノード全体で実行される。
したがって、並列処理を実行するためにはds2スレッドを実行する必要がある。

sql

proc sqlで実行していたものはfedsqlで実行し、
ds2と同様にsesssref optionを使用する必要がある。

CAS非対応のプロシージャの挙動

基本的にSPRE環境で実行されるが、読み込みデータがCASインメモリデータであり、where句が含まれる場合、where句はCASで実行され、SPRE環境ではサブセットのみが実行される。(options msglevel=i;と設定するとログにこれを確認できる情報が表示される。)

セッションスコープ

caslibは通常、セッション内で定義される。グローバルcaslibは事前定義されており、セッション内で定義される。
セッションが切れたときに削除されないように昇格(global caslib)することも可能。(proc casutil;でpromoteステートメントを含める)

image.png
引用:https://youtu.be/8pKqrUQjfZs?si=uOgqSRgm1Qc7VYNL&t=911

CAS→Diskへの保存

proc casutil; saveステートメントを使用する。
ファイルに保存するときはCSVやsas7bdat,excelなど好きな方法で。
sas hdatは各CASworkerがアクセスできる共有NWの場所にファイルを保存する必要がある。

CAS言語

CASに渡すスクリプト言語のこと。
proc casを使用してCASアクションを実行する。SAS Studioプログラムエディタから作成・送信することができる。
CASLはすべてのSAS Viyaアプリケーションのバックエンドコード。
クリックで行った操作や、Python, Java, Luaなどで実行した結果などSAS Viyaで行ったすべての操作はすべてバックエンドでCASLに変換されている。

使い方

  1. CASでセッションを予約
    1. cas myCasSession sessopts={caslib=myCasLib};
    2. casと一緒に名前を付ければよいだけ
  2. CASでデータを使用するか、CASにデータをロードする
    1. CASデータへのアクセス方法
      1. CASに既に存在するすべてのデータを表示して確認する。CASLIB_ALL_LIST;
      2. SPREにcaslibの場所を参照させるlibnameを記述する。libname myWorkLib cas caslib=myCasLib;
    2. CASにロードする方法
      1. data stepで、data myCaslib.myData; mySaslib.myData; run;
      2. proc importでout=myCaslibにする
      3. proc casutilを使う
      proc casutil;
         load data = "path/data.sas7bdat"
         outcaslib="myCaslib"
         casout="mydata"
         promote;
      quit;
      
  3. CASアクションを含むproc casを実行
    proc cas;
        /*variables*/
        /*expressions*/
    
        function sig(num, digit) $20; *関数名と引数名;
          /*処理*/        
        return (rnd_txt); *戻り値;
        end func; *この関数の閉じタグ;
        /* %include "path/myFunction.sas"; */
        /* output=myfunction */
        
    
        num_list = {3.14159, 1.41421356, 1.7320508}
        do n over num_list;
            temp = sig(n, 2)
            print put(temp);
        end;
        /*cas actions*/
    run;
    
    1. 事前定義関数(システム関数)の場合は常にCAS内に存在するが、ユーザー定義関数はセッションごとに失われる。再利用するには関数をファイルに保存し%includeを使用してこのファイルをproc casで実行する。
  4. CASセッションの終了
    1. cas myCasSession terminate

CASアクション

ユーザが直接制御できる最小のタスク
実行するにはproc casで実行する。

proc cas;
loadactionset "simple"; /* pythonでいうところのライブラリみたいな感じ*/
action simple.correlation / params;
run;

独自のアクションセットを作ることも可能

proc cas;
builtins.defineActionSet /
name = 'fileActionSet' /* actionsetの名前 */
actions = {
    name='listFiles' /*アクションの名前*/
    descr='アクションの説明'
    params={
        {name='caslib' type='string' required=True}
        {name='owner' type='string' required=True}
    }
    definition='実行内容' send_response(出力内容);
}
run;

永久保存する場合はsashdatにして出力しておく。

proc cas;
    builtins.actionSetToTable /
        actionSet = "filesActionSet"
        casOut={name="filesActionSet" replace=true};
    table.save /
        table="filesActionSet"
        name="filesActionSet.sashdat"
        replace=True;
run;
/* 使うときは以下 */
proc cas;
    builtins.actionSetToTable /
        table="filesActionSet.sashdat"
        name="filesActionSet";
    /* その後は普段通りに使えばOK */
    action filesActionSet.listFiles /
        caslib="public"
        owner="sasdemo";
run;

参照

SAS® Viya™: 全体像の解説
SAS Tutorial | What is SAS Viya
知って得するTips ~SAS Viyaで分析処理を高速化しませんか!?~
SAS チュートリアル | SAS Viya の CAS と CASL でのコーディングの概要

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?