Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Sawa_Ito
Product and Topic Expert
Product and Topic Expert
0 Kudos
483

このブログは、2022 年 11 月 17 日に SAP ジャパン公式ブログに掲載されたものを SAP ジャパン公式ブログ閉鎖に伴い転載したものです。




このブログは、danielsblog01 が執筆したブログ「Move data FAST from an SAP HANA Cloud database to a HANA Data Lake(2022 年 11 月 14 日)の抄訳です。

最新の情報は、SAP Communityの最新ブログマニュアルを参照してください。

注1:2022Q3 でストレージは Native Object Store に変更になりデータサイズ単位ごとのスループットの制限がなくなりました。データロードのフォーマンスもこのブログ時のテスト結果よ...

注2:2022QRC4より、SAP HANA Cloud, data lake リレーショナルエンジンの各リレーショナルコンテナに SYSHDL_<relational_container_name>_SERVER
という名称の専用のリモートサーバー
が新たに付属になり、このリモートサーバーを使用して、SAP HANA Cloud, HANAデータベースに接続し、SAP HANAデータベースから、SAP HANA Cloud, data lake リレーショナルエンジンのリレーショナルコンテナにデータを pull することが可能になりました。
このブログで説明している「create remote server」をユーザーが行う必要がなくなり、SAP HANA Cloud, HANAデータベースから SAP HANA Cloud, data lake へのデータの高速移動の設定が容易になりました。




 

SAP HANA Cloud, HANAデータベースから HANA Cloud, data lake リレーショナルエンジンへ、最小限の労力でデータ移動する方法について悩んでいるのであれば、このブログが参考になるでしょう。

実際、Data Lake リレーショナルエンジンの設定によっては、この方法が最速なデータ移動方法です。

さらに、1 つの Python 関数でできるので十分シンプルな方法と言えるでしょう!

このブログでは、SAP HANA Cloud, data lake リレーショナルエンジンのリモートサーバーを、SAP HANA Cloud, HANA データベースへ接続し、SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンへデータを pull する方法について説明します。

また、設定の異なる SAP HANA Cloud, data lake リレーショナルエンジンでテストすることで、データ移動スピードに最も影響を与えるパラメーターが何なのかを示します。
これにより、最高のパフォーマンスを得るための SAP HANA Cloud, data lake リレーショナルエンジンのインスタンスのスケール方法を理解できるでしょう。

このブログで説明したことと、ファイルからのデータロードを比較されたい場合には、こちらの Jason Hinsperger のブログを参照してください。

 

 

方法


この方法は、5 つのステップで構成されています。

1. HANA Cloud, SAP HANA Cloud, data lake リレーショナルエンジンから SAP HANA Cloud, HANA データベースにリモートサーバーとこれを使用するための外部ログインユーザーを作成します。
SAP HANA Cloud, data lake リレーショナルエンジンに直接接続した SQL コンソールから作るのが最も簡単な方法です。

 

CREATE SERVER MY_HDB CLASS 'HANAODBC' USING 

'Driver=libodbcHDB.so;

ConnectTimeout=0;

CommunicationTimeout=15000000;

RECONNECT=0;

ServerNode=<HANA_DB_HOST>:<PORT>;

ENCRYPT=TRUE;

ssltruststore=<HANA_DB_HOST>;

ssltrustcert=Yes;';



CREATE USER <USERNAME> IDENTIFIED BY <PASSWORD> FORCE PASSWORD CHANGE OFF;



CREATE EXTERNLOGIN <USERNAME> TO MY_HDB REMOTE LOGIN <REMOTE_USERNAME> IDENTIFIED BY <REMOTE_PASSWORD>;

​


 

残りのステップでは、移動したいテーブルに関連するいくつかのオブジェクトの作成が必要になります。
この例では、maLINEITEM テーブルを使用しますが、どのテーブルを選んでもかまいません。

1 点、SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンへのデータ型の変換は、1 対 1 ではないことに注意してく...

 

2. ステップ 2 では、EXISTING LOCAL TEMPORARY テーブルを作成します。
これは、移動したい SAP HANA Cloud, HANA データベースのテーブルを指定する仮想テーブルと呼べます。ここでは LINEITEM テーブルがこれにあたります。

 

CREATE EXISTING LOCAL TEMPORARY TABLE <TEMP_TABLE>(

L_ORDERKEY INTEGER,

L_PARTKEY INTEGER,

L_SUPPKEY INTEGER,

L_LINENUMBER INTEGER,

L_QUANTITY DECIMAL(15,2),

L_EXTENDEDPRICE DECIMAL(15,2),

L_DISCOUNT DECIMAL(15,2),

L_TAX DECIMAL(15,2),

L_RETURNFLAG  VARCHAR(2),

L_LINESTATUS  VARCHAR(2),

L_SHIPDATE DATE,

L_COMMITDATE DATE,

L_RECEIPTDATE DATE,

L_SHIPINSTRUCT  VARCHAR(25),

L_SHIPMODE  VARCHAR(10),

L_COMMENT  VARCHAR(44)) AT 'MY_HDB..<SCHEMA>.<TABLE>';

​


 

3. 次に保持したいテーブルを SAP HANA Cloud, data lake リレーショナルエンジンに作成します。

 

CREATE TABLE <DESTINATION_TABLE>(

L_ORDERKEY INTEGER,

L_PARTKEY INTEGER,

L_SUPPKEY INTEGER,

L_LINENUMBER INTEGER,

L_QUANTITY DECIMAL(15,2),

L_EXTENDEDPRICE DECIMAL(15,2),

L_DISCOUNT DECIMAL(15,2),

L_TAX DECIMAL(15,2),

L_RETURNFLAG  VARCHAR(2),

L_LINESTATUS  VARCHAR(2),

L_SHIPDATE DATE,

L_COMMITDATE DATE,

L_RECEIPTDATE DATE,

L_SHIPINSTRUCT  VARCHAR(25),

L_SHIPMODE  VARCHAR(10),

L_COMMENT  VARCHAR(44));

​


 

4. INSERT…SELECT コマンドを実行し、SAP HANA Cloud, HANA  データベースから SAP HANA Cloud, data lake リレーショナルエンジンへデータを pull します。

 

INSERT INTO <DESTINATION_TABLE> SELECT * FROM <TEMPORARY_TABLE>;​


 

5. 最後に、クリーンアップを行います。ステップ 2 で作成した Temp テーブルをドロップします。このステップはオプショナルです。なぜならば、ローカルのテンポラリーテーブルは、接続が切断されるとドロップされるからです。

 

DROP TABLE <TEMP_TABLE>;​


 

これで、SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンにデータを移動できました。
これは SAP HANA Cloud, data lake リレーショナルエンジンの設定によっては、非常に高速に行えることがわかりました。

注意:
マネージド Data Lake のコンテナを所有する SAP HANA コンテナユーザーに対して新しいテーブルにアクセスさせたい場合には、このテーブルの SYSRDL#CG セレクトパーミッションを許可する必要があります。

 

 

テスト


 

このデータ移動で、SAP HANA Cloud, data lake リレーショナルエンジンのどのパラメーターがデータ移動のパフォーマンスに対して最大の影響を与えるのかを知りたかったため、異なるディスクサイズ、コーディネーターノード、ワーカーノードで不完全なテストを行いました。
結果は以下のとおりです。

この実験では、SAP HANA Cloud, HANA データベース 1 インスタンスにメモリー 60 GB、ストレージ 200 GB、vCPU 数 4 を使用しました。

SAP HANA Cloud, data lake リレーショナルエンジンは、16 TB, 16 vCPU のワーカーノード、16 vCPU のコーディネーターノードからスタートしました。

約 6,000 万行 (2 GB)の  LINEITEM テーブルを SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンに移動しました。

テストした設定ごとに 3 つのサンプルをとり、完了までの平均時間を使用して比較しました。

このブログにおける統計上の重要性を示すために行いましたが、各設定で少々ばらつきがありました。

 

 


 

結果をみると、ワーカーノード数を変更しても、データの移動時間に影響がないことがわかります。
ディスクサイズを減らすとデータ移動のパフォーマンスに大きな影響があり、コーディネーターノードを減らした場合の影響は少しでした。
これらの結果より、ディスクサイズを 16 TB から 32 TB へ増やすとパフォーマンスが向上すると予想しましたが、残念ながら、平均スピードは、16 TB システムと同じでした。

単純にディスクサイズをスケールしただけでは、データのロード時間に上限があることがわかります。

ディスクサイズを 32 TB にキープし、コーディネーターを 32 vCPU にしたらどうなるでしょうか?

残念ながら、16 TB と 16 vCPU のシステムと比較してデータ移動のパフォーマンスの向上はみられませんでした。興味深いことに、ある時点で、SAP HANA Cloud, data lake リレーショナルエンジンのサイズと vCPU 数を増やすことによるデータ移動のパフォーマンスの向上度が減少しました。

その後、(同僚の指摘により)気がついたのですが、SAP HANA Cloud, data lake リレーショナルエンジンのワーカーノードは、負荷の高いクエリー処理を担当しています。

そのため、ワーカーノードが本当にデータ移動のパフォーマンスに影響するのかテストしたいと思い、思いきってワーカーノードを 2 vCPU に減らしたところ、このケースでは、データ移動のオペレーションにかなり長い時間がかかりました!

 

 

スクリプト


 

SAP HANA Cloud, data lake リレーショナルエンジンのどの設定が、データ移動のパフォーマンスに影響するのか理解できましたが、データを移動するのに、全ての SQL をいちいちタイプしたくありません。
ありがたいことに、SAP HANA Cloud, HANA データベースの HANA システムビュー SYS.TABLE_COLUMNS を使用すると、全てのテーブルのスキーマを見つけることができ、必要なSQL を実行するためのスクリプトを書くことができます !

前述したように、SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンへのデータ型の変換は 1 対 1 ではありません。
これは、データを移動する時にどのデータ型を SAP HANA Cloud, data lake リレーショナルエンジン側で使用すべきか理解するためのロジックがスクリプトに必要であることを意味します。

幸いなことに、この LINEITEM テーブルはシンプルでほとんどのデータ型がサポートされているため、Python でスクリプトを組み立てることができました。

注意:
ここで紹介するスクリプトは、全ての利用ケースで使用できる完全なものではありませんが、便利なツールを作成するスタート地点になるでしょう。

 

最初に、スキーマ名、テーブル名、リモートサーバー名を取得する関数を定義します。

 

def move_to_hdl(schema_name, table_name, remote_server='MY_HDB'):


 

hdbcli Python モジュールを使用して、SAP HANA Cloud, HANA データベースに接続します。

 

conn = dbapi.connect(

    address=<HANA_SQL_EP>,

    port=443,

    user=<USERNAME>,

    password=<PASSWORD>

)

cursor = conn.cursor()


 

SAP HANA Cloud, data lake インスタンスには、pyodbc 接続も必要です。ローカルシステムに SAP HANA Cloud, data lake クライアントがインストールされている必要があります。
SAP HANA Cloud, data lake クライアントのインストール方法がわからない方はこちらのブログをチェックしてください。

 

host = '<DATALAKE_SQL_EP>'

CONN_STR = f'DRIVER=Sybase IQ;UID=<USERNAME>;PWD=<PASSWORD>;host={host};ENC=TLS(tls_type=rsa;direct=yes)'

cnxn = pyodbc.connect(CONN_STR)

hdl_cursor = cnxn.cursor()


 

SAP HANA Cloud, HANA データベースの HANA カーソルで、SYS.TABLE_COLUMNS システムビューをクエリーし、希望しているテーブルのスキーマを取得し、結果をパースして CREATE TABLE文を書くことできます。

 

注意: ここがこのスクリプトが不完全な点です。この利用ケースでのデータ型のデータ型変換だけが考慮されていることにご注意ください。

 

cursor.execute(f"""

    SELECT COLUMN_NAME, POSITION, DATA_TYPE_NAME, LENGTH, SCALE

    FROM SYS.TABLE_COLUMNS

    WHERE SCHEMA_NAME = '{schema_name}' AND TABLE_NAME = '{table_name}' ORDER BY POSITION ASC;

    """);

    

create_table_str = '('

for row in cursor:

   if 'CHAR' in row[2]:

       create_table_str += row[0] + '  VARCHAR' + f'({row[3]})' ','

   elif 'DECIMAL' == row[2]:

       create_table_str += row[0] + ' ' + row[2] + f'({row[3]},{row[4]})' ','

   else:

       create_table_str += row[0] + ' ' + row[2] + ','



create_table_str = create_table_str[:-1] + ')'


 

最後に、方法 のステップ 2 ~ 5 を統合するクエリーを作成し、それを実行してカーソルの接続をクローズします。

 

temp_table = f'drop_me_{table_name}'

dest_table = f'hdl_{table_name}'

    

create_temp_table = f"CREATE EXISTING LOCAL TEMPORARY TABLE {temp_table} {create_table_str} AT '{remote_server}..{schema_name}.{table_name}';"

create_dest_table = f'CREATE TABLE {dest_table} {create_table_str};'

move_table = f'INSERT INTO {dest_table} SELECT * FROM {temp_table};'

drop_temp_table = f'DROP TABLE {temp_table};'

    

hdl_cursor.execute(create_temp_table + create_dest_table + move_table + drop_temp_table + 'commit;')



hdl_cursor.close()

cursor.close()


 

全て合わせると関数は、このようになります。

 

def move_to_hdl(schema_name, table_name, remote_server='MY_HDB'):

    conn = dbapi.connect(

        address=<HANA_SQL_EP>,

        port=443,

        user=<USERNAME>,

        password=<PASSWORD>

    )

    cursor = conn.cursor()



    host = '<DATALAKE_SQL_EP>'

    CONN_STR = f'DRIVER=Sybase IQ;UID=<USERNAME>;PWD=<PASSWORD>;host={host};ENC=TLS(tls_type=rsa;direct=yes)'

    cnxn = pyodbc.connect(CONN_STR)

    hdl_cursor = cnxn.cursor()



    cursor.execute(f"""

        SELECT COLUMN_NAME, POSITION, DATA_TYPE_NAME, LENGTH, SCALE

        FROM SYS.TABLE_COLUMNS

        WHERE SCHEMA_NAME = '{schema_name}' AND TABLE_NAME = '{table_name}' ORDER BY POSITION ASC;

        """);

    

    create_table_str = '('

    for row in cursor:

       if 'CHAR' in row[2]:

           create_table_str += row[0] + '  VARCHAR' + f'({row[3]})' ','

       elif 'DECIMAL' == row[2]:

           create_table_str += row[0] + ' ' + row[2] + f'({row[3]},{row[4]})' ','

       else:

           create_table_str += row[0] + ' ' + row[2] + ','



    create_table_str = create_table_str[:-1] + ')'

    temp_table = f'drop_me_{table_name}'

    dest_table = f'hdl_{table_name}'

    

    create_temp_table = f"CREATE EXISTING LOCAL TEMPORARY TABLE {temp_table} {create_table_str} AT '{remote_server}..{schema_name}.{table_name}';"

    create_dest_table = f'CREATE TABLE {dest_table} {create_table_str};'

    move_table = f'INSERT INTO {dest_table} SELECT * FROM {temp_table};'

    drop_temp_table = f'DROP TABLE {temp_table};'

    

    hdl_cursor.execute(create_temp_table + create_dest_table + move_table + drop_temp_table + 'commit;')



    hdl_cursor.close()

    cursor.close()


 

スキーマ名、テーブル名、リモートサーバーを入力し、その他は関数にまかせます。LINEITEM と ORDERS テーブルをこの関数で移動できました。

 


まとめ


 

SAP HANA Cloud, HANA データベースから SAP HANA Cloud, data lake リレーショナルエンジンにデータを pull することで、効率的にデータを移動することができます。
構文はシンプルであり、どのテーブルでもスクリプト化して一般化することができます。

データ移動のパフォーマンスには SAP HANA Cloud, data lake リレーショナルエンジンのストレージサイズの拡張が、最も影響することを学びました。
しかし、データ移動の速度には上限もありました。
同様に、コーディネーターノードはデータ移動のパフォーマンスに多少の影響をおよぼし、データ移動のパフォーマンスの上限が存在しました。
ワーカーノードに関しては、大胆に2 vCPUにまでスケールダウンしない限り、データ移動のパフォーマンスに影響はないということがわかりました。

 




オリジナルのブログはここまでです。