🚅

Cortex Framework for SAP をDeployしてみた

2024/02/25に公開

本記事ではSAP cortex Frameworkを使用してSAPのデータをBigQueryでデータ分析できるようにしていきたいと思います!!

とは言いつつも、正直自分はSAPに関する知識はかなり素人レベルです、なんとなくSAPのデータをBigQueryでデータ分析しやすくできるFrameworkがあるという噂を聞きつけ、実際にはどんな感じで使えるのかを試行錯誤しながらその実態を掴んでいきたいと思います。

まずは、ざっくりSAP cortex Frameworkとは?

まだ触れてもないので、よくわかっていない前提ですが、

SAP cortex frameworkはSAPのぱっと見わかりにくいデータを人間が見ても分かるようにするためのFrameworkと理解しています!

めちゃくちゃ雑な例えですが、以下のような記号があったときに人間は「何じゃこの英単語の羅列」となりますよね。
bsk
sccr
swm

それを人間が見てもわかりやすく変換するもの。(それに加えて、データ加工も入ってきますので、厳密には間違えています。が今は一旦置いておきます)
bsk → バスケットボール
sccr → サッカー
swm → スイミング

ここまではOKデスネ?恐ろしくざっくりな説明です。
実際にはここのER図のようになります。
https://github.com/GoogleCloudPlatform/cortex-data-foundation/blob/main/docs/erd_ecc.pdf

そしてなぜそれがフレームワークと呼ばれるのか?というと
そのデータの変換をするために、GCPのサービスが色々とパッケージ化された形で詰まっているからです。

これがCortex Frameworkの中身です。

で、す、が!!!
ここではまだこのアーキテクチャは頭の隅にも置いておくだけでOKです。
何となくBigQueryやCloud Composerなどのコンポーネントが組み合わされたものと言うところまでの理解でOKです。

Cortex frameworkの使い方

Cortex frameworkはGithub上で公開されているフレームワークなので、自身のGCP環境にテンプレートを展開してBuildすることができます。
https://github.com/GoogleCloudPlatform/cortex-data-foundation

Google Cloud Cortex Framework for SAPを実際に使ってみる

⓪ 前提条件 - Prerequisites -

-必要なもの-
GCPのプロジェクトを最低限一つ作成しておく (*本番環境では、Rawデータを入れるプロジェクトとデータ加工後のデータを入れるプロジェクトを分けておくのが推奨)
BigQueryのDatasetを作れる状態にしておく (おそらくDefaultで使える状態)

-必ずしも必要ではないもの-
k9 deployer等でデータソースごとの設定をするようだが、テストデータを使用する場合には不要らしい。← 今回やってみて結果不要だった。

対象SAP

SAP cortex framework でカバーしているのは
SAP ECC
SAP HANAです。もちろん、RISE環境であっても対象です (特にon GCP、on Azure、on AWSなど問いません。)

git cloneでrepositoryをclone

まずはGCPのコンソールに入って、Cloud Shellをオープン!!

以下のコマンドを実行します。

git clone --recurse-submodules https://github.com/GoogleCloudPlatform/cortex-data-foundation

cortex-data-foundationというフォルダーが自身のGCP環境にコピーされました。
では、そのフォルダーの配下に移動してみましょう。

cd cortex-data-foundation

lsコマンドで覗いてみると、以下のようにいくつかデプロイするためのファイルが確認できますね。

$ ls
1_click.sh  cloudbuild.yaml  config  deploy.sh  docs  images  LICENSE  README.md  RELEASE_NOTES.md  requirements.in  requirements.txt  src  support.sh

① GCP環境の設定

必要なGCPコンポーネントをEnableする

Cloud Shellで一気にコンポーネントをEnableしていきます。
以下のコマンドでBigQuery、Cloud Build、Cloud Composer、Cloud Storage、Cloud resource manager、DataflowをEnableにしています。

gcloud config set project <SOURCE_PROJECT>

gcloud services enable bigquery.googleapis.com \
                       cloudbuild.googleapis.com \
                       composer.googleapis.com \
                       storage-component.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       dataflow.googleapis.com

出力例
Updated property [core/project].
Operation "operations/acat.p2-598927097921-1e5c0737-b04b-4cdc-81b2-adf1c9317d19" finished successfully.

必要な権限の付与

念の為、Cortex frameworkを実行するユーザーに必要な権限をここに記載しておきます。
Service Usage Consumer
Storage Object Viewer for the Cloud Build default bucket or bucket for logs
Object Writer to the output buckets
Cloud Build Editor
Project Viewer or Storage Object Viewer

ちなみにService Accountを作成して、そのSAに実行権限を付与して実行するということも可能です!

Cloud Buildアカウントの設定

Cloud Buildのサービスアカウントに必要な権限を付与していきます。

必要な権限は以下の三つ
BigQuery Data Editor
BigQuery Job User
Storage Object Admin (ログをGCSのバケットに出力するために必要)

上記のように権限がついていたらOK!!

DAG関連のファイルを入れておくためのGCSのバケット作成

BigQueryのデータセット同じリージョンにBucketを作成する。
DAG関連のデータがこのバケットに自動で生成されます。

ログの管理のためGCSのバケット作成

BigQueryのデータセット同じリージョンにBucketを作成する。
Cloud Buildのプロセスの過程で出力されたログが入ります。

RawデータとCDCデータが入るBigQuery Datasetを作成

Rawデータが入るようのDatasetを作成しておく。リージョンはasia-northeast1 (Tokyo)
Cortexはどこのリージョンにも対応しています

CDCの転送先のDatasetを作成しておく。リージョンはasia-northeast1 (Tokyo)
Cortexはどこのリージョンにも対応しています

  • データ連携ツールで差分連携する場合はこのデータセットは不要

Data Meshを作成する (Data Meshが不要の場合はスキップ可能)

一旦このステップはテストなのでスキップして実行してみます。
今後実施した際にはここを埋めたいと思います!

②Deploymentの設定

config.jsonファイルの確認

Cortex Frameworkのdeploymentはconfig.jsonふぁいるで管理されています。
./cortex-data-foundation/config/config.json ← の中に入っています。
なのでまずはそのディレクトリーに移動してみましょう!

$ cd cortex-data-foundation/config

$ ls
config_default.json  config.json

config.jsonの説明

config.jsonは以下のように二つのパートに分かれています。

① Global Deployment ParametersがSAPに限らず、Cortex Framework全体のパラメータを設定する項目です
② Workload Specific ParametersはSAPなどのWorkload個別のパラメータを設定する項目です

config.jsonのDefaultパラメータの項目

config.jsonのパラメータの中身は以下のリンク先から確認できます。
https://github.com/GoogleCloudPlatform/cortex-data-foundation?tab=readme-ov-file#global-deployment-configuration

パラメータ 意味 デフォルト値 説明
testData テストデータの配置 true ソースデータが配置され、ビルドが実行されるプロジェクト
deploySAP SAPの展開 true SAPワークロード(ECCまたはS/4HANA)の展開を実行するか
deploySFDC Salesforceの展開 true Salesforceワークロードの展開を実行するか
deployMarketing マーケティングの展開 true マーケティングソース(Google Ads、CM360、TikTok)の展開を実行するか
deployDataMesh Data Meshの展開 true Data Meshの展開を実行するか。詳細はData Mesh READMEを参照
turboMode ターボモード true すべてのビューを単一のCloud Buildプロセス内の1ステップとして並行して、高速に展開する。falseに設定されている場合、各レポートビューは個々のシーケンシャルビルドステップで生成される。テストデータを使用する場合、またはレポート列とソースデータ間の不一致が修正された場合にのみ、trueに設定することを推奨
projectIdSource ソースプロジェクトID - ソースデータセットが存在し、ビルドが実行されるプロジェクト
projectIdTarget ターゲットプロジェクトID - ユーザー向けのデータセット(レポート用と機械学習用)のプロジェクト
targetBucket ターゲットバケット - DAGスクリプトの保存先(Dataflowの一時ファイルも)。事前に作成されたバケットを指定する。実際のAirflowバケットの使用は避ける
Location ロケーションまたはリージョン "US" BigQueryデータセットやGCSバケットが存在するロケーション
languages フィルタリング言語 [ "E", "S" ] テストデータを使用しない場合は、ビジネスに関連する単一言語(例:「[ "E" ]」)または複数言語(例:「[ "E", "S" ]」)を入力する。SQLの中でプレースホルダを置き換えるために使用される(現在はSAPのみ対応 - 詳細はERDを参照)
currencies フィルタリング通貨 [ "USD" ] テストデータを使用しない場合は、ビジネスに関連する単一通貨(例:「[ "USD" ]」)または複数通貨(例:「[ "USD", "CAD" ]」)を入力する。SQLの中でプレースホルダを置き換えるために使用される(現在はSAPのみ対応 - 詳細はERDを参照)
testDataProject テストデータ用プロジェクト kittycorn-public デモ用配置のテストデータのソース。testDataがtrueの場合に適用
k9.datasets.processing K9 データセット – 処理 "K9_PROCESSING" K9設定ファイルで定義されているクロスワークロードテンプレート(例:日付項目)を実行する。通常、これらは下流のワークロードで必要となる
k9.datasets.reporting K9 データセット – レポーティング "K9_REPORTING" K9 設定ファイルで定義されているクロスワークロードテンプレートおよび外部データソース(例:天気)を実行する。デフォルトではコメントアウト
DataMesh.deployDescriptions Data Mesh – アセットの説明 true BigQueryアセットスキーマの説明を展開する
DataMesh.deployLakes Data Mesh – レイクとゾーン false 処理レイヤーによってテーブルを整理するDataplexのレイクとゾーンを展開する。有効にする前に設定が必要
DataMesh.deployCatalog Data Mesh – カタログのタグとテンプレート false BigQueryアセットやフィールド上のカスタムメタデータを許可するData Catalogタグを展開する。有効にする前に設定が必要
DataMesh.deployACLs Data Mesh – アクセス制御 false BigQuery アセットに対するアセット、行、または列レベルのアクセス制御を展開する。有効にする前に設定が必要
SAP独自のパラメータ項目
パラメータ 意味 デフォルト値 説明
SAP.deployCDC CDC展開 true Cloud Composer内でDAGとして実行するためのCDC処理スクリプトを生成する
SAP.datasets.raw 生データセット - CDCプロセスによって使用され、SAPからのデータをレプリケーションツールが格納する場所。テストデータを使用する場合は、空のデータセットを作成する
SAP.datasets.cdc CDC処理済みデータセット - レポートビュー用のソース、および処理済みDAGのターゲットとなるデータセット。テストデータを使用する場合は、空のデータセットを作成する
SAP.datasets.reporting レポーティングデータセット "REPORTING" エンドユーザーがレポート作成に利用できるデータセット名。ビューやユーザー向けのテーブルが配置される
SAP.datasets.ml MLデータセット "ML_MODELS" 機械学習アルゴリズムやBQMLモデルの結果をステージングするデータセット名
SAP.SQLFlavor ソースシステムのSQL形式 "ecc" s4またはecc。テストデータの場合はデフォルト値(ecc)のままにする。Demand Sensingでは、現時点ではeccテストデータのみが提供されている
SAP.mandt MandantまたはClient "100" SAPのデフォルトのMandantまたはClient。テストデータの場合はデフォルト値(100)のままに。Demand Sensingでは、900を使用する

config.jsonファイルを編集

デフォルト値は前段で説明しました。
editコマンドで以下のようにconfig.jsonファイルを編集します。

edit config/config.json

よくあるパターンとして、CDCをデータ連携ツールで実装するパターンがあります。
例えば、FivetranなどのツールでSAPのデータをBigQueryに差分連携するパターンです。その場合はcdcレイヤーのデータセットは不要なので、
以下のjsonファイルの"cdc"と"raw"部分は同じデータセット名を指定します。
"cdc": "SAP_CDC_Data"
"raw": "SAP_RAW_Data"

(参考情報)
cortex frameworkのcdcとrawレイヤーの2層構造になっている理由は、データ連携ツールで差分連携しない場合に用意されています。データ連携ツールでRAWデータをとりあえずBigQueryのRAWデータセットに貯めていき、CDCデータセットにはRAWに更新された差分だけを取り込んでいき、そして最終的にそのCDCの差分のみReportingレイヤーに反映されるという仕組みになっています。

{
    "testData": true,
    "deploySAP": true,
    "deploySFDC": false,
    "deployMarketing": false,
    "deployDataMesh": false,
    "turboMode": true,
    "projectIdSource": "myproject",
    "projectIdTarget": "myproject",
    "targetBucket": "cortex_dag_bucket01",


    "location": "asia-northeast1",
    "languages": [
        "E",
        "S"
    ],
    "currencies": [
        "USD"
    ],
    "testDataProject": "kittycorn-public",
    "k9": {
        "datasets": {
            "processing": "K9_PROCESSING",
            "reporting": "K9_REPORTING"
        }
    },
    "DataMesh": {
        "deployDescriptions": true,
        "deployLakes": false,
        "deployCatalog": false,
        "deployACLs": false
    },
    "SAP": {
        "deployCDC": true,
        "datasets": {
            "cdc": "SAP_CDC_Data",
            "raw": "SAP_RAW_Data",
            "ml": "ML_MODELS",
            "reporting": "REPORTING"
        },
        "SQLFlavor": "ecc",
        "mandt": "100"
    },
    "SFDC": {
        "deployCDC": true,
        "createMappingViews": true,
        "createPlaceholders": true,
        "datasets": {
            "cdc": "",
            "raw": "",
            "reporting": "REPORTING_SFDC"
        }
    },
    "marketing": {
        "deployGoogleAds": true,
        "deployCM360": true,
        "deployTikTok": true,
        "deployLiveRamp": true,
        "dataflowRegion": "",
        "GoogleAds": {
            "deployCDC": true,
            "lookbackDays": 180,
            "datasets": {
                "cdc": "",
                "raw": "",
                "reporting": "REPORTING_GoogleAds"
            }
        },
        "CM360": {
            "deployCDC": true,
            "dataTransferBucket": "",
            "datasets": {
                "cdc": "",
                "raw": "",
                "reporting": "REPORTING_CM360"
            }
        },
        "TikTok": {
            "deployCDC": true,
            "datasets": {
                "cdc": "",
                "raw": "",
                "reporting": "REPORTING_TikTok"
            }
        },
        "LiveRamp": {
            "datasets": {
                "cdc": ""
            }
        }
    }
}

③ Deploymentの実行

config.jsonが修正できたので、これをbuildしていきます。

$ cd cortex-data-foundation
$ gcloud builds submit --project <データソース側のプロジェクト> \
    --substitutions=_GCS_BUCKET=<Cloud Buildのログ格納用のBucket>
$ cd cortex-data-foundation
$ gcloud builds submit --project myproject-363708 \
    --substitutions=_GCS_BUCKET=cortex_log_bucket01

実行した後、ログのリンクが出力される。リンク先から実行状況を確認する

成功した場合にはこのようになる!

BigQueryで作成しておいたDatasetにデータが格納されていることを確認する。
Rawデータ側のテーブルにサンプルデータが格納されていることが確認できる。

CDCのデータセットにもテーブルが格納されていることを確認。

Reporting データセットには新しくSAP Cortex Frameworkによって生成されたReporting用のテーブルが作成されています。SAPのテーブル名ではなく、ある程度どんなテーブルなのかがわかるようになっています。

データのマッピングの一例として、以下のようなデータマッピングになっています。SAPの生データは知る人ぞ知る構造になっているかと思いますが、幾分わかりやすい名前にも変更されています。

まとめ

ということで、ひとまずはサンプルデータを用いてシンプルにDeployするところまでをやりました。

大事なことなのでもう一回言います。
SAPからのデータ抽出はCortexの範囲外です!!
Cloud Data FusionやFivetranなどの3rd party toolでSAPのRAWデータを別途連携する必要があります。そこはご留意いただければと思います

SAPのデータ加工をしている方ともよくお話をしますが、データ加工ロジックの作成が非常に大変だとよくお聞きします。
それをCortex frameworkを一発Buildするだけでここまで作成されるのは非常に便利だと感じました。

続いて、Reportingデータセットのテーブルを使用して、Lookerでそのまま可視化ができるようなので、それを試してみました。

続きはこちら
https://zenn.dev/delacroix/articles/729437a6138391

Discussion