HANA Cloud, Data Lake First step


はじめに

本ブログでは、SAP Cloud Platformのデータベースサービス(DBaaS)として提供されるHANA CloudのRelational Data Lake(以下、RDLとも記載します)機能に関してご紹介します。

SAP HANAは2010年にオンプレミス版がリリースされ、10周年を迎える2020年にクラウド専用のコードを持つクラウドサービスとしてHANA Cloudの提供が開始されました。従来からのインメモリアーキテクチャや、カラムストアモデルのテーブルをアーキテクチャを持つ、高速なデータマネージメントシステムを、クラウドのサービスとしてご利用できるようになっています。このHANA Cloudのリリースと同時に、昨今のデータマネージメントシステムに求められるデータサイズの拡大に対応すべく、Native Storage Extention(NSE)とData Lakeという機能をご利用いただく事ができます。本ブログでは、このData Lake機能のご利用方法をご紹介いたします。

HANA Cloud, Data Lakeとは?

HANA Cloud, Data Lakeとは、インメモリアーキテクチャを持つHANA Cloudを、一定のパフォーマンスを維持しつつストレージにデータを格納することでメモリサイズの肥大化を防ぐための機能です。データマネージメントシステムが管理するデータには、その利用頻度に差があります。例えば最近の取引データ(Hotデータ)と、一定の期間を過ぎた取引データ(Warmデータ)や、昨今のIoTデータのような非常に大容量となるデータを基幹システムのデータと結合して分析するニーズに際して大量のデータを処理する場合など。このようにデータの利用頻度や規模に差があるデータを同じパフォーマンスやコストのリソースに配置する事は得策ではありません。このようにメモリで処理するほどではないものの、実用的なパフォーマンスでコストを抑えるというニーズに最適な機能がHANA Cloud, Data Lakeになります。

このHANA Cloud, Data Lakeは、HANAとは独立したプロセスを持つRDBMSエンジンでサービスを提供していますが、SAP HANAと同一のインターフェイスでアクセスする事ができます。このRDBMSエンジンはSAP IQ(以前はSybase IQ)として独立した製品として販売されています。SAP IQは1990年代後半に市場に投入された、最も古いカラムストアアーキテクチャを持つRDBMS製品であり、このカラムストアアーキテクチャにより、大容量のデータを高速に処理する事が出来るため、ストレージベースではありますが、一般的なRDBMSとの比較で、高い処理性能を提供する事ができます。

HANA Cloud, Data Lake 利用開始方法

HANA Cloudの利用に際しては以下のブログをご参照ください。

はじめてのSAP HANA Cloud : Part 1 ~ HANAインスタンスの作成

このブログの 「HANAのインスタンスとRDLのインスタンスがそれぞれ作成され、起動します。」の手順までに、HANA Cloudのインスタンスの作成と同時に、HANA Cloud, Data Lakeのインスタンスを作成する手順が示されています。下のイメージと同様のData Lake Instanceのタイルが表示されれば、HANA CloudからData Lakeを利用する事ができます。

なお、インスタンス作成直後は左上にある緑色の「Running」に示されているように、HANA Cloud, Data Lakeのインスタンスが起動しています。Cloud Serviceは稼働の時間に応じて課金されますので、開発時など明らかに利用されない場合がわかるときは右下にある「Stop」ボタンをクリックしてインスタンスを停止する事をお勧めします。また起動は「Stop」ボタンの位置に「Start」が表示されますので、それを押す事で起動する事が可能です。

HANA Cloud, Data Lake でできる事

前述の通り、HANA Cloud, Data Lake は単独のRDBMS製品であるSAP IQをエンジンとして使用しています。一方でHANA Cloudとの親和性を持たせるために、その利用はSAP IQのインターフェイスではなく、HANA Cloudのインターフェイスでご利用いただく事になります。HANA Cloud, Data Lake では主に以下の様な利用形態が想定されます。

データソース

HANA Cloudのテーブルの一部、利用頻度が低いデータを格納(移動)する

SAPのデータソース以外の構造化データを格納する

データの格納方法

HANAのテーブルからinsert selectによるデータ移動

CSVデータからインポート

SAPのデータソース以外のテーブルを仮想化し、insert selectによるデータ移動

データの参照

HANA Cloud, Data Lakeのテーブルを仮想化し、ローカルテーブルとして参照

HANA Cloud, Data Lakeのテーブルを仮想化し、UNION VIEWを作成して参照

表中にある「仮想化」とは、実体を持たないビューと同様の概念を持つ技術を指しており、これを実現するのがHANAのSmart Data Access(SDI)という機能になります。この技術をつかって仮想化されたテーブルを仮想テーブルと呼びます。

当ブログでは、HANA CloudのWarmデータをHANA Cloudに格納し、参照するというシナリオ(上の表の太字)の設定方法をご説明します。

HANA Cloudと、HANA Cloud, Data Lakeの利用開始

HANA Cloudを利用するに際して、DBユーザ(スキーマ)を作成します。この手順に関しては以下のブログを参照してください。

はじめてのSAP HANA Cloud : Part 2 ~ テーブルとビューの作成

「DBユーザー(スキーマ)を作成する」の手順が完了したら以下の手順に進んでください。

上記のブログの手順が完了すると、「ORDER_ENTRY」ユーザで、「ORDER_ENTRY」スキーマに接続したSQLコンソールが表示されている状態になっているはずです。

このSQLコンソールで、HANA Cloud上のインメモリ・テーブルと、HANA Cloud, Data Lake上に定義されるテーブルの両方を操作します。

HANA Cloud にテーブルを作成(インメモリ・テーブル)

まず最初にHANA Cloudのインメモリに配置したいテーブルを作成します。これは通常のテーブルを作成する手順と変わりありません。ここでは上記のブログの、続きの手順で使用した「ORDERS(オーダー)」テーブルを使用します(38650件のデータを含みます)。このブログでは、ひとまず件数が多くなるトランザクション系のテーブルだけを対象にすることにします。上記のブログでは、サンプルのCSVファイルをインポートする際に、テーブルも同時に作成する手順をご紹介していますが、こちらでは後に続くSAP HANA, Data Lakeとの違いを確認する意味で、通常のSQLのDDL文を使う事にします。以下のcreate table文をSQL Consoleにペーストして実行ボタンをクリックします。

CREATE TABLE ORDERS ( ORDERID INTEGER , PRODUCTID INTEGER, CUSTOMERID INTEGER, EMPLOYEEID INTEGER , ORDERPERIODID INTEGER , REQUIREDPERIODID INTEGER , SHIPPEDPERIODID INTEGER , SHIPPERID INTEGER , UNITPRICE INTEGER , QUANTITY INTEGER , DISCOUNT INTEGER , UNITSALES BIGINT , NETSALES BIGINT , UNITCOST INTEGER , COST INTEGER PRIMARY KEY(ORDERID ,PRODUCTID ) );

下部にあるメッセージペインにエラーが出ないことが確認できたら、左のペインのデータベースアイコン>Catalogアイコンを展開し、tableアイコンをクリックします。下方のペインにテーブルのリストが表示されます。システムテーブルも含めてリストされますので、テーブルを作成したスキーマを選択してリストされるテーブルをフィルタします。下の図の矢印にあるスキーマ入力のフィールドに「ORDER_ENTRY」を入力、もしくはフィールドの右端にあるアイコンをクリックしてスキーマ名をサーチして入力します。すると左下のペインに、先ほど作成したテーブル「ORDERS」がリストされることが確認できます。

このテーブルに、データをインポートします。スキーマを作成するために参照したブログで入手した、サンプルデータからデータを読み込みます。左下のペインに表示された「ORDERS」テーブルを右クリック、コンテキストメニューから「Import Data」を選択します。右のペインにImportウィザードが表示されますので、読み込むcsvファイルに入手したサンプルデータ「Orders.csv」を選択、続く2つのステップは内容を確認したうえでデフォルトのままでステップを進めてください。

最後に「Show Import Summary」ボタンをクリックし、入力内容を確認します。右上にある「Import Into Database」ボタンをクリックし、インポートを開始します。

Import Progressのゲージが完了を示し「Import complete.」のメッセージが表示されたらインポート完了です。タブを使って先ほどのSQLコンソールに戻り、select count(*) from ORDERS で件数を確認するなどしてみてください。

HANA Cloud, Data Lake (ストレージベースのテーブル)にテーブルを作成

次にストレージに格納される領域であるHANA Cloud, Data Lake領域にテーブルを配置、そしてHANA Cloudのメモリテーブルから一部を格納してみます。

HANA Cloud, Data LakeはSAP IQが管理している事は前述しました。テーブルの作成をはじめとしたDDLの操作や、Data Lake領域の動作の設定を行うパラメータ設定は、SAP IQで処理させるために、コマンドの入力はストアドプロシージャに包んで実行する方式をとります。

CALL SYSRDL#CG.REMOTE_EXECUTE('BEGIN <Statement_1>; <Statement_2>; <Statement_3>; END');

上記の構文の <Statement_n>; にSQP IQ側で実行するSQL文を記述します。ではテーブルの作成を例にしてみましょう。

今回のブログでは、HANA Cloud のインメモリ側のテーブルから古いデータをHANA Cloud Data Lake側に移動することを想定していますので、スキーマの形状は同一にします。先ほどの「ORDERS」と同じスキーマを持つテーブル「ORDERS_DL]を HANA Cloud, Data Lakeで作成する場合のコマンドは以下の様になります。

CALL SYSRDL#CG.REMOTE_EXECUTE('BEGIN CREATE TABLE ORDERS_DL ( ORDERID INTEGER , PRODUCTID INTEGER , CUSTOMERID INTEGER , EMPLOYEEID INTEGER , ORDERPERIODID INTEGER , REQUIREDPERIODID INTEGER , SHIPPEDPERIODID INTEGER , SHIPPERID INTEGER , UNITPRICE INTEGER , QUANTITY INTEGER , DISCOUNT INTEGER , UNITSALES BIGINT , NETSALES BIGINT , UNITCOST INTEGER , COST INTEGER, PRIMARY KEY(ORDERID ,PRODUCTID) ); END');

このコマンドで実行されたテーブルは、HANA Cloudからは直接参照はまだできません。HANA Cloud Data Lake側に実体を持つテーブルに対して、HANA Cloud上の仮想テーブルを定義することで、操作が可能になります。そのために、「ORDERS_DL」 の仮想テーブルをHANA Cloudに設定します。

左上のペインにあるDBのアイコンを展開し、「Remote source」をクリックします。左下にHANA Cloudにリモートサーバとして定義されている対象のリストが表示されます。他のインスタンスのHANAや、それ以外にSDAの機能を利用してアクセスできるサーバはリモートサーバの設定をする事でこのリストに表示されます。HANA Cloud, Data Lakeはあらかじめリモートサーバ「SYSDL#CG_SOURCE」として定義されていますので、ここからHANA Cloud, Data Lakeに作成したテーブルへのアクセスを設定します。リストにある「SYSDL#CG_SOURCE」をクリックします。

右のペインにリモートデータソースとして定義されたリモートサーバ(今回の場合はHANA Cloud, Data Lake であり、その実態はSAP IQ)に含まれるテーブルを確認する画面が表示されます。先ほどHANA Cloud, Data Lakeに作成したテーブルはリモートサーバにあるSYSDL#CG(既定されています)という名前のスキーマに格納されますので、スキーマに「SYSDL#CG」を入力し、右側にある「serch」ボタンをクリックします。下の「Remote Objects」フィールドに、先ほど作成した「ORDERS_DL」テーブルが表示されます。この行の左端にあるボックスをチェックし、「Create Virtual Objets」ボタンをクリックします。

作成される仮想テーブル(Virtual Object)の名前とスキーマを選択します。テーブルの名前は既定ではHANA Cloud, Data Lakeにあるテーブルと同じですが、仮想テーブルである事を示す「V_」を接頭辞として追加しておきます。スキーマはインメモリテーブルと同じ「ORDER_ENTRY」にします。最後に「Create」ボタンをクリックし、作成します。

仮想テーブルが作成されたことを確認してみましょう。

左ペインのデータベースの下の「Catalog」を展開し、「Tables」をクリックします。左下のペインの「All Schema」ボックスにスキーマ名「ORDER_ENTORY」を入力しフィルタします。その結果テーブルのリストに、「ORDERS」と「V_ORDERS_DL」が表示されます。これで先ほど設定した「ORDERS_DL」テーブルの仮想テーブルがHANA Cloudのテーブルと同様アクセスできることになります。ご注意いただきたいのは、これはあくまでもデータの実態を持たない仮想テーブルであり、実体は  HANA Cloud, Data Lake側にあり、それはストレージベースのテーブルとなります。HANA Cloudと同様のテーブルとして参照できますが、インメモリテーブルではないことにご注意ください。

HANA Cloudテーブルと、HANA Cloud, Data Lakeテーブルの連携

現在までにすべてのデータが格納されているHANA Cloudのインメモリテーブルと、データは0件のHANA Cloud, Data Lakeにあるテーブルが存在している状態になりました。ここで古いHANA CloudテーブルのデータをHANA Cloud, Data Lakeのテーブルに移動し、2つのテーブルをUNION VIEWで参照する事にします。

まず、2つのテーブルのUNION Viewを作成します。これは直前に作成した仮想テーブル「V_ORDERS_DL」を使う事で、2つのテーブルの配置を意識せずにUNION Viewを作成する事ができます。下のDDL文により、2つのテーブルを結合した「ORDERS_TOTAL」 UNION Viewが作成できます。

create view ORDERS_TOTAL as select * from ORDERS union all select * from V_ORDERS_DL

それでは、インメモリテーブルの一部をHANA Cloud, Data Lakeのテーブルに移動させますが、次のようなシナリオとします。一般的にはアクセス頻度が低下するのは古い履歴のデータなので、そのデータが登録された日付の属性を持つカラムなどに条件を与えてデータを移動するのが常套です。しかしながら今回のサンプルデータには日付の属性を持つカラムがないので、プライマリキー属性の古いものを条件にデータを移動することにします。今回のテーブルはORDERID 、PRODUCTIDという2つのカラムで主キー属性を持ちますが、ORDERIDが古い(値が小さい)事を条件に移動することにします。移動させる条件は業務の要件によりますが、今回は全体の10%を移動させることを想定して、ORDERIDカラムの値が「800」より小さいものを移動します。これを前提に、以下の様な移動のためのプロシージャを作成しました。

プロシージャにORDERIDの閾値となる変数1を与える。
UNION VIEWから検索確認する。これにより現在の全件を確認。この件数を変数2に設定する
変数1を条件に、インメモリテーブルからRDLテーブルへinsert select実行
変数1を条件に、インメモリテーブルからdelete
UNION VIEWから、件数を確認する。これが変数2と一致するか評価する。
評価が正 >Commit
評価が偽 >Rollback

以下がプロシージャ「MOVE_DATA」の作成スクリプトになります。

CREATE PROCEDURE MOVE_DATA(KIJITSU int) LANGUAGE SQLSCRIPT AS BEGIN DECLARE ORDER_COUNT int; DECLARE ORDER_COUNT2 int; select count(*) into ORDER_COUNT from ORDERS_TOTAL; insert into V_ORDERS_DL select * from ORDERS where ORDERID < KIJITSU; delete from ORDERS where ORDERID < KIJITSU; select count(*) into ORDER_COUNT2 from ORDERS_TOTAL; IF ORDER_COUNT= ORDER_COUNT2 THEN commit; ELSE rollback; END IF; END; 

このプロシージャを以下で実行します。ORDERIDの古いデータを判定する閾値「800」をパラメータで与えています。

call MOVE_DATA(800)

これで通常のアプリケーションは「ORDERS_TOTAL」を参照すれば、データの配置場所を意識せずに全件データにアクセスする事が可能になりました。

以上で、HANA Cloudのインメモリテーブルと、HANA Cloud, Data Lakeのストレージベースのテーブルを連携させて利用する方法についてご説明いたしましたが、HANA Cloud, Data Lakeは高い圧縮率で大量のデータを格納する事ができますので、HANA Cloudのデータの二次的な格納にとどまらず、外部のデータソースからデータを取り込み、高度な分析を行う用途などにも適していますので、様々な用途にお使いいただく事をご検討下さい。