SAP HANA Cloud, HANAデータベースから HANA Cloud, data lakeへのデータの高速移行とデータ移行速度に影響するパラメーター

作成者:伊藤 沢 投稿日:2022年11月17日

  • このエントリーをはてなブックマークに追加

このブログは、Daniel Utvichが執筆したブログ「Move data FAST from an SAP HANA Cloud database to a HANA Data Lake(2022/1/14)の抄訳です。最新の情報は、SAP Communityの最新ブログマニュアルを参照してください。


 

SAP HANA Cloud, HANAデータベースから HANA Cloud, data lake へ、最小限の労力でデータ移行する方法について悩んでいるのであれば、このブログが参考になるでしょう。実際、Data Lake の設定によっては、この方法が最速なデータ移行方法です。さらに、一つの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 (IQ)のコンテナを所有するSAP HANAコンテナユーザーに対して新しいテーブルにアクセスさせたい場合には、このテーブルの SYSRDL#CG セレクトパーミッションを許可する必要があります。

 

テスト

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

この実験では、SAP HANA Cloud, HANA データベース1インスタンスにメモリー 60GB、ストレージ200GB、vCPU数4を使用しました。SAP HANA Cloud, data lakeは、16TB, 16vCPU のワーカーノード、16vCPUのコーディネーターノードからスタートしました。約6,000万行 (2GB)の  LINEITEM テーブルをSAP HANA Cloud, HANA データベースからSAP HANA Cloud, data lakeに移行しました。テストした設定ごとに3つのサンプルをとり、完了までの平均時間を使用して比較しました。このブログにおける統計上の重要性を示すために行いましたが、各設定で少々ばらつきがありました。

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

シンプルにディスクサイズをスケールしただけでは、データのロード時間に上限があることがわかります。ディスクサイズを32TBにキープし、コーディネーターを32vCPUにしたらどうなるでしょうか?残念ながら、16TBと16vCPUのシステムと比較してパフォーマンスの向上はみられませんでした。興味深いことに、ある時点で、SAP HANA Cloud, data lakeのサイズとvCPU数を増やすことによるパフォーマンスの向上が減少しました。

その後、(同僚の指摘により)気がついたのですが、SAP HANA Cloud, data lakeのワーカーノードは、負荷の高いクエリー処理を担当しています。そのため、ワーカーノードが本当にパフォーマンスに影響するのかテストしたいと思い、思いきってワーカーノードを2vCPUに減らしたところ、このケースでは、データ移行のオペレーションにかなり長い時間がかかりました!

 

スクリプト

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側で使用すべきか理解するためのロジックがスクリプトに必要であることを意味します。

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

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

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のストレージサイズのスケールが、最も影響することを学びました。しかし、データの高速性には上限もありました。同様に、コーディネーターノードはパフォーマンスに少し影響があり、パフォーマンスの上限がありました。ワーカーノードに関しては、大胆に2vCPUにまでスケールダウンしない限り、データ移行のパフォーマンスに影響はないということがわかりました。

 


このオリジナルブログが掲載されているSAP CommunityのSybase関連タグをフォローして、最新技術情報をキャッチアップしてください(フォローには登録が必要です)。

SAP Communityの関連タグ

・SAP HANA Cloud, data lake ブログ / Q&A
・SAP IQ ブログ / Q&A
・SAP SQL Anywhere ブログ / Q&A

SAP Communityでは質問も投稿することが可能で、世界中のSAP社員やユーザーのアドバイスを受けることができます。

 

———————————————————

SAPジャパンブログ内関連記事:

SAP HANA Cloud, data lake
SAP HANA Cloud, data lakeストレージのオブジェクトストレージへの変更によるパフォーマンス向上とペタバイト規模データの対応およびコスト低減
SAP HANA Cloud, data lakeでマテリアライズドビューを使用してパフォーマンスを上げる
SAP HANA Cloud, SAP HANA データベースとSAP HANA Cloud, data lake filesを使用する
SAP HANA Cloud, HANA データベースからSAP HANA Cloud, data lakeデータベースへの最速のデータ移行方法とテスト結果
SAP HANA Cloud, HANAデータベースから HANA Cloud, data lakeへのデータの高速移行とデータ移行速度に影響するパラメーター
SAP HANA Cloud, data lakeとSAP IQに共通するヒストリカルデータベースとDBSpaceサイズのキャプチャー方法
SAP HANA Cloud, data lake(IQ)をベースにしたNode.jsアプリケーションの構築
複数のSAP HANAソースからのデータを1つのSAP HANA Cloud, data lake(IQ)に集約する
SAP HANA Cloud, data lake Filesへの最初のアクセス設定
SAP HANA Cloud, data lakeおよびSAP IQにおけるスキーマのエクスポート/バックアップ
SAP HANA Cloud, data lake(IQ)にWindows端末からPythonで直接接続する
SAP HANA Cloud, data lakeへのデータロードにおけるvCPU数の影響
SAP IQのクラウドサービスが開始されました – SAP HANA Cloud, data lake (Standalone IQ)

SAP IQ
SAP IQのクラウドサービスが開始されました – SAP HANA Cloud, Data Lake (Standalone IQ)
SAP IQ – 隠れたイッピン(the hidden treasure) …
全てのSAP BW、SAP BW/4HANAリリースのSAP ニアラインストレージ(NLS)ソリューション – SAP IQ
SAP IQによるSAP ニアラインストレージ(NLS)のパフォーマンスを向上させる
SAP IQを利用したSAP Information Lifecycle Management(ILM)
DBA CockpitでSAP IQを有効にする
SAP IQのための容易なインストーラー - 「Q」
列指向データベースでもOLTPに対応したSAP Sybase IQ16の機能拡張
大量データの「圧縮率」と「ロード時間」を改善したSAP Sybase IQ16の技術解説
SAP IQ 16.1 SP05がリリースされました

SAP ASE
SAP ASE 16.0 SP04の新機能
SAP ASEの新しい管理ツール「AMC」の紹介:インストール方法、メモリー管理、ワークロード分析機能、Workload AnalyzerのSSL設定について
SAP HANAプラットフォームを相互補完し進化する旧Sybase製品の今――SAP ASEとSAP IQ
SAPアプリケーション向けデータベースとしてSAP Sybase ASEが採用される理由とは
RDBMSのパフォーマンス向上の仕掛け――SAP Sybase ASE 15.7の最新アーキテクチャー解説

オンラインマニュアル:
SAP IQ
SAP SQL Anywhere
SAP ASE

SAP Community (ブログ/ Q&A) :
SAP IQ
SAP SQL Anywhere
SAP ASE

SAP Community Wiki:
SAP IQ
SAP SQL Anywhere
SAP ASE

sap.com 製品ページ:
SAP IQ
SAP SQL Anywhere
SAP ASE

その他:
SAP IQ テクニカル概要
SAP IQ 16.0 ハードウェアサイジングガイド
様々なストレージおよびネットワークテクノロジーにおける SAP IQ 16 Multiplex のパフォーマンス評価


  • このエントリーをはてなブックマークに追加

連記事

SAPからのご案内

SAPジャパンブログ通信

ブログ記事の最新情報をメール配信しています。

以下のフォームより情報を入力し登録すると、メール配信が開始されます。

登録はこちら