Technical Articles
SDIを使ってオンプレSAP HANAからSAP HANA Cloudにデータ転送してみる
0. はじめに
本ブログではSAP HANA CloudにSDI (Smart Data Integration) を利用してオンプレミスのSAP HANAからデータを連携する方法を説明します。
SAP HANA CloudにはETL機能であるSDIを内包しており、DP Agentの設定さえしてしまえばETLのためのアプリケーションのインストールや設定を行うことなくETL機能を利用することが可能です。また、テーブルやVIEWの開発と同じ流れ・同じ方法でETL処理を作成することができ、迅速かつ効率的に様々なシステムからのデータ統合が可能となっています。
ここでは、オンプレミスのSAP HANAにある3つのテーブルデータをSAP HANA Cloudに移行します。
では、はじめていきます。データの移行には大きく以下のステップで進めます。
- Data Provisioning Agent(DP Agent)を設定する
- 仮想テーブルを作成する
- データを移行する
1. DP Agent設定する
1.1 DP Agentをインストールする
オンプレミスのSAP HANAとクラウドのSAP HANA Cloudをつなぐために、オンプレミス側にDP Agentをインストールします。本ブログでは、オンプレミスSAP HANAと同じネットワーク内のWindowsサーバーにDP Agentをインストールします。インストールの詳細はSAPヘルプやこのブログの「Download DP agent from SAP Service Marketplace as a ZIP file」を参照ください。
1.2 DP Agentの設定を行う
SAPヘルプに沿って設定を行います。
1.2.1 Agent Admin用HANAユーザーの作成
SAP HANA CloudのSAP HANA Cockpitより、以下の権限を持つHANA DBユーザーを作成します。
Application Privilege : sap.hana.im.dp.admin::Administrator
System Privilege : AGENT_ADMIN, ADAPTER_ADMIN
* このApplication Privilegeは設定できず、設定しなくても問題なく進めるようです
1.2.2 DP Agent設定ツールの起動
まず管理者としてコマンドプロンプトを起動します。以下のように環境変数を設定し、DP Agent設定ツールを起動します。
setx DPA_INSTANCE "C:\usr\sap\dataprovagent"
cd %DPA_INSTANCE%
cd bin
agentcli.bat --configAgent
1.2.3 Agentの起動
オプション1(Start or Stop Agent)を選択し、次にオプション1(Start Agent)を選択するとDP Agentが起動します。
1.2.4 SAP HANA接続設定
DP AgentからSAP HANA Cloudに接続します。まずオプション6(SAP HANA Connection)を選択します。次に、オプション3(Connect to SAP HANA via JDBC)を選択します。その後、以下のように入力していきます。
Use encrypted JDBC connection : true
Use WebSocket to connect : false
Host Name (for Direct SQL) : SAP HANA Cloud InstanceのEndpoint(*)
Port Number (for Direct SQL) : SAP HANA Cloud InstanceのEndpoint(*)
Agent Admin HANAユーザーとパスワード : 1.2.1で作成したユーザー・パスワード
Use HTTP Proxy Server : false (環境に応じて変更してください)
HANA User for Agent Messaging : 任意のユーザー名・パスワード、true (新規にユーザーを作成)
これで、SAP HANA CloudとDP Agent間の接続が完了しました。
(*) ホスト名とポート番号はSAP Cloud Platform Cockpitより確認します。SAP HANA InstancesのEndpointです。(以下の枠内)
1.2.5 DP Agentの登録
DP Agentを登録します。DP Agent設定ツールのトップに戻り、オプション7(Agent Registration)を選択し、その後オプション1(Register Agent)を選択します。
Agent Name : 任意の名前
Agent Host : DP AgentがインストールされているサーバーのIPアドレス
1.2.6 Adapterの登録
SAP HANAと接続するためのAdapter「HanaAdapter」を登録します。DP Agent設定ツールのトップに戻り、オプション8(Adapter Registration)を選択し、次にオプション2(Register Adapter)を選択して以下のように入力します。
Adapter Name : HanaAdapter
1.2.7 確認
Database Explorerにアクセスし、AgentとAdapterが登録されていることを確認します。
2. 仮想テーブルを作成する
SAP HANA CloudとオンプレミスSAP HANAを繋ぐDP Agentの設定が終わりました。次に、SAP HANA CloudにオンプレミスSAP HANAのテーブルを参照する仮想テーブルを作成します。
2.1 リモートソースを作成する
Database Explorerにて「Remote Source」を右クリックし「Add Remote Source」を選択します。
リモートソース名を入力し、アダプター名として「HanaAdapter」を選択します。オンプレミスSAP HANAのホスト名、ポート番号、接続ユーザー・パスワードなどを入力し、保存します。
作成されたリモートソースを開きます。スキーマが表示され、スキーマを開くとテーブルが表示されます。今回ソースとなるスキーマは「SALES_1」ですので、その中を確認するとテーブル(SALES::HDI_MD_PRODUCTS, SALES::HDI_SO_HEADER, SALES::HDI_SO_ITEM)が確認できます。
2.2 仮想テーブルを作成するための権限を付与する
リモートソースが作成できました。次に仮想テーブルを作成します。その前に仮想テーブルを作成するための権限をHDIコンテナーの管理ユーザーに与えます。
ここでは、SAP HANA Cockpitで直接HDIコンテナーの管理ユーザーに権限を付与します。
まず、SAP HANA Cockpitにリモートソースを作成したユーザーでログインし、「User & Role Management」から「Privilege Assignment」に行きます。
ユーザー「<HDIコンテナー>#OO」に対して、リモートソースへの以下のオブジェクト権限を付与します。
- CREATE VIRTUAL TABLE
- CREATE VIRTUAL FUNCTION
- CREATE REMOTE SUBSCRIPTION
- PROCESS REMOTE SUBSCRIPTION EXCEPTION
- ALTER
- DROP
2.3 仮想テーブルを作成する
ここまででリモートソースが作成でき、さらに仮想テーブルを作るための権限も付与できました。次に仮想テーブルを作成します。
SAP Web IDE for Full-Stackにて、右クリックでVirtualTableを新規作成します。
仮想テーブル名、リモートソース名、参照先のスキーマ名、テーブル名を入力します。DB名は「<NULL>」と入力します。保存してビルドすると仮想テーブルが作成されます。他のテーブルも同様に仮想テーブルを作成します。
Database Explorerで仮想テーブルを確認します。Tablesに行くと、仮想テーブルが作成されていることが確認できます(ここではVT始まりのテーブル)。テーブル名を右クリックして「Open Data」を選択し、データが正常に取得できることを確認します。(クラウドのSAP HANA CloudからオンプレミスのSAP HANAへデータを取得しに行きます。)
他のテーブルも同様に仮想テーブルを作成します。またターゲットとなるテーブルも作成します。
3. データを移行する
オンプレミスのSAP HANAのテーブルを参照する仮想テーブルがSAP HANA Cloud上に作成できました。この仮想テーブルを使用して、SDIのFlowgraphでSAP HANA Cloudのテーブルにデータを移行します。
3.1 フローグラフを作成して実行する
3.1.1 フローグラフの新規作成
「src」フォルダにて右クリックで「Flowgraph」を選択し、フローグラフを新規作成します。
フローグラフの名前をつけ作成すると、空のフローグラフが作成されます。
ここで、「+」アイコンをクリックすると、様々なオペレーターを追加することが可能です。
3.1.2 データソースの設定
ソーステーブルを追加するために、「Data Source」を追加します。
歯車のアイコンをクリックし、データソースの設定を行います。
「Type」で「HANA Object」を選択し、ソースとなるテーブルを選択します。テーブル名を2文字以上入力すると候補が表示されます。ここでは、先ほど作成した仮想テーブルをデータソースとするため、仮想テーブルを選択して「Finish」を押下します。
テーブルのメタデータ情報が読み込まれました。「Apply」を押下して終了します。
3.1.3 データターゲットの設定
次にターゲットテーブルを追加するために、「+」を押下して「Data Target」を選択して追加します。
「HANA Object」を選択し、ターゲットとなるテーブルを選択します。テーブル名を2文字以上入力すると候補が表示されます。ターゲットテーブルを選択して「Finish」を押下します。
「Settings」タブで、ターゲットテーブルへの動作を設定します。ここでは処理前にターゲットテーブルをTruncateした後にデータをInsertする、という設定にします。(つまり全件データ洗い替え)
3.1.4 マッピング(プロジェクション)の設定
「Apply」でもとに戻ります。ソーステーブルとターゲットテーブルの間のデータマッピングを行うために、「+」アイコンをクリックして「Projection」を挿入します。その後、データソースとプロジェクション、プロジェクションとデータターゲットを線で結びます。
プロジェクションの設定を確認するために歯車アイコンをクリックします。ここでは、名前をもとに自動でマッピングがされています。必要に応じてマッピングの変更、フィルターの定義などを行います。
3.1.5 フローグラフの保存、ビルド、実行
「Apply」で戻った後、フローグラフを保存しビルドします。その後、「Execute」アイコンを押下し、フローグラフを実行します。
正常に実行されたことを確認します。
3.1.6 確認
Database Explorerに行き、Tablesよりターゲットテーブルのデータを参照します。データが無事転送されていることが確認できます。
3.2 少し複雑なフローグラフを作成して実行する
3.2.1 結合の設定
先ほどは単純に1:1でデータを移行するフローグラフを作成しました。次に、複数テーブルを結合しながらデータを移行するフローグラフを作成します。先ほどと同様にデータソースとして二つのテーブル(SO_HEADERとSO_ITEM)を追加し、それらを「JOIN」オペレーターで結びます。
歯車アイコンを押下し結合設定を行います。「Criteria」タブで結合条件を指定します。左テーブルにSO_HEADER、右テーブルにSO_ITEMを指定し、左外部結合とします。
結合条件を指定します。
3.2.2 マッピング(プロジェクション)、データターゲットの設定
「Apply」でもとに戻り、プロジェクションおよびデータターゲットを追加します。プロジェクションで必要な項目に絞り込みます。
ターゲットテーブルは、今回は「Template Table」とし、「Object Name」を入力します。
「Setting」タブでデータ更新方法を設定します。
3.2.3 フローグラフの保存、ビルド、実行
フローグラフを保存し、ビルドします。「Excecute」を押下して実行します。
3.2.4 確認
処理が終了したら、Database ExplorerでTemplate Tableにデータが更新されていることを確認します。
以上でオンプレミスのSAP HANAからSAP HANA Cloudへのデータの転送が完了しました。
最初にも記載した通り、SAP HANA CloudではDP Agentの設定さえしてしまえば、ETLのためのアプリケーションのインストールや設定を行うことなくETLの利用が可能です。テーブルやViewを作成するのと同様の開発画面・開発の流れでETL処理を作成できる、というのは開発効率を著しく高めることができます。ETLに必要なオペレーターも一通り揃っており、様々なシステムから柔軟にデータを統合することが可能となっています。
ご説明ありがとうございます。
2.3仮想テーブルの作成はSQLでも実施可能でしょうか?
FLOWGRAPHのデータ連携方式(writer type)にはINSERT以外に、UpdateやAppendもあるのでしょうか?
よろしくお願いいたします。
はい、SQLでも実施可能ですが、HDIコンテナー内で完結させるとなると.hdbvirtualtableで作成する方が良いかと思います。
このブログではGUI上での設定となっていますが、この.hdbvirtualtableをCode Editorで開けばCREATE VIRTUAL TABLE文と同じ文法(違いはCREATEが不要なだけ)で定義することができます。
https://help.sap.com/viewer/c2cc2e43458d4abda6788049c58143dc/cloud/en-US/08191144d5804c86af9395b110ac37be.html
Write typeはInsert, Upsert, Updateの3つから選択可能です。
理解しました。
ご説明ありがとうございます。
追加で質問させていただきたいです。
1.2.1のApplication Privilege : sap.hana.im.dp.admin::Administratorですが、Data Provisioning Delivery UnitをHANA Cloudにdeployしておく必要があるそうです。
ドキュメントでは、HANA Studioを使う手順がありますが、
HANA StudioからHANA Cloudに接続は可能でしょうか?
よろしくお願いいたします。
劉
返信遅くなり申し訳ありません。
こちらでも再度試しましたが、たしかにこのApplication Privilegeは設定することができないようになっていました。
この権限なしでも先に進めるようですので、この権限設定なしで進んでみていただけますか。
よろしくお願いいたします。
ありがとうございます。
オンプレミスのSAP HANAの更新データをリアルタイムにSAP HANA CloudにSDI (Smart Data Integration) を利用してレプリケーション連携するにはどうしたら良いでしょうか。