Technical Articles
SDIを使ってSAP HANA Cloudに大容量データを転送してみる
はじめに
本ブログでは、オンプレミスのSAP HANAにある大容量のデータをHANA Cloudに転送してみます。データの転送には、HANA CloudのELT機能であるSmart Data Integration(以下SDI)を利用します。
HANA CloudにおけるSDIの利用方法はこちらのブログをご参照ください。
本ブログの利用環境は以下の通りです。
- SAP HANA 2.0 Revision 42 : On-Premise、AWS(us-east)で稼働
- Data Provisioning Agent 2.0 SP04 Patch24:AWS(us-east)で稼働
- SAP HANA Cloud:SAP Cloud Platform Cloud Foundry (Frankfurt、AWS)で稼働
転送するデータは、TPC-HのLINEITEMテーブルを使用します。50GBでデータ作成したもので、LINEITEMテーブルの件数、データサイズは以下の通りです。
- 件数:300,005,811
- CSVファイルサイズ:36.8GB
- オンプレミスSAP HANAでのテーブルサイズ:7.8GB
チューニング(?)にあったっては、以下の情報を参照しています。
- SAP Note 2459953 – SDI Tuning Guidelines
- Best Practices for SAP HANA Smart Data Integration and SAP HANA Smart Data Quality
1. とりあえずデータ転送してみる
以下のような単純にテーブルを転送するだけのフローグラフを作成します。
とりあえずデフォルト状態のまま実行します。が、残念ながらエラーとなってしまいます。
コンソールにはOut of Memoryとのメッセージがありますので、DP Agent側でOut of Memoryが発生したものと思われます。
<DP Agentインストールフォルダ>/log/framework.trcを確認します。データをフェッチしている途中でメモリエラーになっていることがわかります。
2. DP AgentのJAVA Heap Sizeを変更する
まずは、Best Practicesガイドの”6.1.1 Sample Data Provisioning Agent Tuning”を参考に、Java Heap Sizeを変更します。
ここでは、<DP Agentインストールフォルダ>/dpagent.iniを開き、Xmxを16GBにします。
デフォルトは4GB
16GBに変更(サーバーのメモリは32GB)
DP Agentを再起動し、フローグラフを再度実行してみます。が、残念ながらまたエラーとなりました。
先ほどより多くのデータをフェッチできているようではありますが、まだ足りないようです。ヒープメモリサイズを増やすのも限界があるので別の方法での対応が必要となります。
3. タスクパーティションを設定する
次に、Best Practicesガイドの”6.1.3 Task Partitioning”を参考に、フローグラフにパーティションを設定します。これにより、一度に全データを取得してロードする、という動きではなく、データを分割して取得してロードするのを繰り返す、という動きになります。
フローグラフを開き、”Properties”アイコン(右上の歯車アイコン)を押下します。
“Partitions”タブに移動し、パーティションの設定を行います。このLINEITEMテーブルには”L_PARTKEY”という連番項目がありますので、これを使用してRangeパーティションを作成します。20個のパーティションを作成し、ValuesにはそのパーティションのL_PARTKEYの最大値を設定します。(3億件のテーブルなので、1パーティションあたり1500万件程度となります)
パーティションを並列で処理することもできますが、今回はシリアルで処理を行います。”Task Partitioning”を”Manual”として”Number of parallel partitions”に1とセットします。
これで実行してみます。無事処理が完了しました!
3億件のデータが転送されました。
4. ターゲットテーブルにパーティションを設定する
Best Practicesガイドの”6.1.4 Target Table Partitioning”にはターゲットテーブルにパーティションを設定する、ということも挙げられています。データ件数が多い場合は、ターゲットテーブルへのパーティション設定の検討も必要となります。パーティションを設定することにより、デルタマージ処理がパーティション単位で行われるため、より少ないリソースでデルタマージ処理を実行することが可能となります。
.hdbtableでも以下のようにパーティションを設定することが可能です。
パーティションごとにデータが格納されます。
まとめ
以上、SDIを使用して大容量データをSAP HANA Cloudに転送するために行なった作業を記載しました。
実際のプロジェクトではより多くの大きなデータをより短時間で移行する必要があるケースもあると思います。そのような場合は、さらにジョブの調整(パーティション、並列度、など)、DP Agentの調整(フェッチサイズ、ヒープメモリ、など)、さらにソースシステムやネットワークの調整なども実施しつつデータ転送を試みていただければと思います。