Technical Articles
SAP HANA Cloud, Data Lake に AWS S3 bucketからインポート(load table)する
はじめに
前回のブログでは、HANAに格納されているデータを、アクセス頻度によって階層化し、利用頻度の高いデータや、高い実行速度を求められる対象のデータをHANA Cloudのメモリに配置、一方で利用頻度の低下した主に古いデータはHANA Cloud, Data Lake(以下Data Lake)のストレージベース領域に配置する方法をご紹介しました。このシナリオでは、主にトランザクション処理系のシステムを想定したシナリオになりますが、今回は外部から取得したり、独立しているシステムにあるデータ、かつ大量な件数を持つものを対象に、前回ご紹介したData Lake領域にデータをインポートし、HANAに格納されているデータと連携させる方法を取り上げます。いわばデータ分析系のシステムを想定した利用方法になります。すでにご利用中のシステムの件数が大きなデータなどの分析などにもご利用いただけますので、参考にしてみてください。
HANA Cloud, Data Lakeの機能を提供するアーキテクチャについて
前回のブログでも簡単に触れましたが、Data Lakeは、HANAとは独立したプロセスを持つRDBMSエンジン、SAP IQ(以前の名称はSybase IQ)で機能を提供しています。
SAP IQはストレージベースのエンジンではありますが、カラムストア型アーキテクチャを最初に採用したRDBMS製品であり、分析、集計や、レポート業務においては競合製品に比べても非常に高速な処理性能を発揮する事ができる製品です。このカラムストアアーキテクチャは多くのRDBMSが採用しているアーキテクチャとは異なり、テーブルが持つカラム(項目)別にデータを格納するアーキテクチャを持っています。これにより、大量なデータを処理する際に必要なチューニング作業を必要とせずに、高い検索処理性能(分析、集計、レポート)を発揮する事が可能です。
データインポート用のストレージサービス
HANA CloudはDBaaSであり、このデータベースサービスが稼働しているOSへのログインはできません。従って一般的なデータベースへのインポートで使われるローカルディレクトリにインポート用のデータを配置することができません。そのためData LakeではAmazon Web Service S3、もしくはMicrosoft Azure Blob storageにデータを配置して、そこから直接インポートする方法を提供しています。なお、HANA Cloud自体もMicrosoft Azure、Amazon AWS、Google Cloud Platform等のHyper Scalerとよばれるクラウドサービス上で稼働しています。
今回はAmazon AWS S3を利用した手順をご紹介いたします。なお、以下のSAP HELP Portalにもチュートリアルマニュアルがありますので、必要に応じてご参照下さい
SAP HANA Cloud, Data Lake Quick Start Tutorial [Microsoft Azure]
SAP HANA Cloud, Data Lake Quick Start Tutorial [Amazon Web Services]
前提条件
以下の手順を実行する場合には、以下の準備が必要です。
- こちらのブログの手順が完了している事。同じユーザやスキーマを使用しています。
- AWS S3 バケット内のオブジェクトへの読み取りアクセス権
- AWS S3 バケット内のCSVファイルは、CESU-8 文字エンコードを使用してください
このブログで使用するCSVファイルのサンプルは、こちらから入手してください。「Code」ボタンをクリックし、「Download ZIP」を選択し、サンプルファイルをダウンロードします。
任意のフォルダで入手したZIPファイルを解凍しておきます。
次に、AWS S3 を利用するために、AWS マネジメントコンソールにログインし、S3サービスのコンソールを開きます。ここでは、AWS S3の利用開始については触れませんので有効なアカウントを取得したうえで、進めてください。AWS S3 Management Consoleで、インポート用のファイルを格納するBucketを作成します。今回は「lakeimport」と名前を付けました。この名前はS3のサービスでユニークである必要があるので、皆様はご自身で任意の名前を付けて、以下の手順ではその名前を反映させてください。そのバケットに、上記でダウンロードした後、解凍したCSVファイルをアップロードします。
アップロードのウィザードが起動したら、アップロード対象のファイルを選択します。このウィザードでは、「ファイルの選択」後、「アクセス許可を設定する」、「プロパティを設定する」といった手順にも進めますが、今回は、特に追加のアクセス権限や保存するファイルの属性は変更せずに進めます。これらは実際の運用に準じて必要な設定を検討してください。ファイルの選択が完了したら「アップロード」ボタンをクリックします。
ファイルのアップロードが完了したら、これらのAWS S3 Bucket ファイルに外部のサービスからアクセスするためのパス名とBucketのサービスが提供されているリージョンの名前を取得します。
まずはパス名ですが、リストされた任意のファイルをクリックしてください。そのファイルのプロパティ画面に移りますので、そこにある「コピーパス」ボタンをクリックしてください。「クリップボードにコピーされました」というメッセージが表示されますので、テキストエディタなどにペーストして、そのファイルのAWS S3サービスでのパス名を取得してください。この値は後ほどのインポートのコマンドの中で必要なバケットパス名になります。なお、今回のブログでは複数のファイルをインポートしていますが、最後のファイル名が異なるだけですので、この確認は1つのファイルだけ実施すれば十分です。
次に、このAWS S3ファイルがどこのリージョンに保存されているかを確認します。再度、ファイルのリストの画面に戻ります。このファイルがどのリージョンで提供されているかは以下の部分に表示されています。
この例では「EU(フランクフルト)」となっています。S3のBucketはリージョンの指定をすることができないような仕様ということなので、Bucketを作成した後に確認する必要があります。ここでは日本語のコンソールを使用しているので、上記の表示になりますが、後ほどインポートを実行する場合は英語名(Code)が必要になりますので、こちらのAWSのサイトから確認してみてください。このブログの例の場合は「欧州(フランクフルト)」は「eu-central-1」というCodeであることが確認できました。
次に、Data Lakeのサービスからこのファイルにアクセスするためには、これらのAWS S3ファイルにアクセスするための「ACCESS_KEY_ID」と「SECRET_ACCESS_KEY」が必要になります。S3 Management Consoleの右上にあるS3のアカウントが表示されているところにプルダウンメニューがありますので、これを展開し、その中から「マイセキュリティ資格情報」をクリックします。
セキュリティ認証情報の画面にある「CLI、SDK、& API アクセスに使用する AWS アクセスキー」のカテゴリにある「アクセスキーの作成」をクリックします。すでにご利用のアクセスキー情報をお持ちであれば、そちらをご利用いただいても結構です。
クリックするとすぐに、「ACCESS_KEY_ID」と「SECRET_ACCESS_KEY」が生成されますので、「CSVファイルのダウンロード」をクリックすると、この値が記述されたファイルをダウンロードすることができます。
ダウンロードファイルに含まれるカンマで仕切られた2つの値を、以後の手順で使用しますので、保存しておいてください。これでインポート用のデータの準備は完了です。
HANA CloudのSQLコンソールの準備
それでは、SAP CPのSAP Cloud Platform Cockpitから、SQLコンソールを利用するため、SAP HANA Database Explorerを起動します。下のイメージにあるように、インスタンスの「Open In」ボタンをクリックし、「SAP HANA Database Explorer」を選択します。
HANA Database Explorerが起動したら、左上のペインで、アクセスするデータベースのアイコンを選択し、左上にある「Open SQL Console」ボタンをクリックします。右にSQLコンソールが開きます。以降はこのコンソールを使ってData Lakeデータベースにアクセスします。
HANA Cloud, Data Lake にテーブルを作成
外部のCSVデータを取り込むためのテーブルを、Data Lake領域に作成します。前回のブログでもご紹介しましたが、SAP IQの管理下に対するテーブルの作成をはじめとしたDDLの操作や、Data Lake 領域の動作の設定を行うパラメータ設定は、ストアドプロシージャ「SYSRDL#CG.REMOTE_EXECUTE」にコマンドを包んで実行する方式をとります。以下に、今回のテーブルを作成するためのDDLを掲記します。
CALL SYSRDL#CG.REMOTE_EXECUTE ('
BEGIN
create table authors
(au_id varchar(30) not null,
au_lname varchar(60) not null,
au_lhiragana varchar(90) not null,
au_fname varchar(60) not null,
au_fhiragana varchar(90) not null,
phone varchar(44) not null,
address varchar(100) null,
address_hiragana varchar(150) null,
city varchar(30) null,
city_hiragana varchar(60) null,
Prefectures varchar(20) null,
Prefectures_hiragana varchar(30) null,
country varchar(18) null,
country_JP varchar(18) null,
postalcode varchar(15) null)
;
create table publishers
(pub_id varchar(10) not null,
pub_name varchar(60) null,
pub_namehiragana varchar(120) null,
city varchar(30) null,
cityhiragana varchar(60) null,
Prefectures varchar(12) null,
Prefectures_hiragana varchar(24) null)
;
create table roysched
(title_id varchar(10) not null,
lorange int null,
hirange int null,
royalty int null)
;
create table sales
(stor_id varchar(10) not null,
ord_num varchar(30) not null,
order_date datetime not null)
;
create table salesdetail
(stor_id varchar(10) not null,
ord_num varchar(30) not null,
title_id varchar(10) not null,
qty int not null,
discount float not null)
;
create table titleauthor
(au_id varchar(18) not null,
title_id varchar(10) not null,
au_ord int null,
royaltyper int null)
;
create table titles
(title_id varchar(10) not null,
title varchar(120) not null,
type varchar(18) not null,
pub_id varchar(10) null,
price money null,
advance money null,
total_sales int null,
notes varchar(300) null,
pubdate datetime not null,
contract int not null )
;
create table stores
(stor_id varchar(10) not null,
stor_name varchar(60) null,
stor_hiragana varchar(120) null,
stor_address varchar(60) null,
stor_addhiragana varchar(120) null,
city varchar(30) null,
city_hiragana varchar(60) null,
Prefectures varchar(12) null,
Prefectures_hiragana varchar(24) null,
country_JP varchar(18) null,
country varchar(18) null,
postalcode varchar(16) null,
payterms varchar(18) null)
;
create table discounts
(discounttype varchar(60) not null,
stor_id varchar(10) null,
lowqty int null,
highqty int null,
discount float not null)
;
create table blurbs
(au_id varchar(18) not null,
copy text null)
;
END');
上記のDDLをカットアンドペーストで、SQLコンソールに入力し、「RUN」アイコン、もしくはFunction 8キーでSQLを実行します。
以上で、HANA Cloud, EDL領域にテーブルを作成することができました。
データのインポート
作成したテーブルに、データをインポートしてみます。
インポートのコマンドも、先ほどのcreate table文と同様SYSRDL#CG.REMOTE_EXECUTEプロシージャに包んで実行します。SAP IQに慣れている方であれば、従来のインポートの処理である「load table」文の構文がそのまま使える事が以下のサンプルからお分かりいただけると思います。ただし、データソースの指定が、ローカルファイルではなく、S3のBucketを指定し、AWS S3にアクセスするための情報が追加で必要になっています。以下にインポートを実行する LOAD TABLEのサンプルを掲載します。なおサンプル中にある「S3のバケットのパス」、「ACCESS_KEY_ID」、「SECRET_ACCESS_KEY」、「REGION」には上記で確認した値を代入して実行してください。
注意事項:REMOTE_EXECUTEプロシージャ内の構文にシングルクォート( ‘ )が含まれている場合、それら自体をシングルクォートで囲む必要があります。次の手順のインポート文の例の場合、ソースファイルの指定や、デリミタ( , )の指定のところは、シングルクォートが連続していることにご注意ください。
CALL SYSRDL#CG.REMOTE_EXECUTE ('
BEGIN
LOAD TABLE authors(
au_id ,
au_lname ,
au_lhiragana ,
au_fname ,
au_fhiragana ,
phone ,
address ,
address_hiragana,
city ,
city_hiragana ,
Prefectures ,
Prefectures_hiragana,
country ,
country_JP ,
postalcode ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/authors.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE publishers(
pub_id ,
pub_name ,
pub_namehiragana ,
city ,
cityhiragana ,
Prefectures ,
Prefectures_hiragana ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/publishers.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE roysched(
title_id ,
lorange ,
hirange ,
royalty ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/roysched.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE sales(
stor_id ,
ord_num ,
order_date ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/sales.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE salesdetail(
stor_id ,
ord_num ,
title_id ,
qty ,
discount ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/salesdetail.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE titleauthor(
au_id ,
title_id ,
au_ord ,
royaltyper ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/titleauthor.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE titles(
title_id ,
title ,
type ,
pub_id ,
price ,
advance ,
total_sales ,
notes ,
pubdate ,
contract ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/titles.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE stores(
stor_id ,
stor_name ,
stor_hiragana ,
stor_address ,
stor_addhiragana ,
city ,
city_hiragana ,
Prefectures ,
Prefectures_hiragana ,
country_JP ,
country ,
postalcode ,
payterms ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/stores.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE discounts(
discounttype ,
stor_id ,
lowqty ,
highqty ,
discount ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/discounts.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
LOAD TABLE blurbs(
au_id ,
copy ''\x0d\x0a''
)
USING FILE ''s3://ご自身のS3バケットのパス/blurbs.csv''
DELIMITED BY '',''
ACCESS_KEY_ID ''ご自身のACCESS_KEY_ID''
SECRET_ACCESS_KEY ''ご自身のSECRET_ACCESS_KEY''
REGION ''ご自身のREGION''
ESCAPES OFF
QUOTES OFF
;
END');
こちらもSQLコンソールにカット&ペーストして実行すると、AWS S3にアップロードしたデータを、Data Lakeテーブルにインポートする事ができます。今回のサンプルのデータは件数が限られているので、インポート処理のパフォーマンスの速さを評価する事はできませんが、件数の大きなデータのインポート性能も良好なので、是非ご自身のデータでもお試しください。
HANA Cloud, Data Lakeテーブルの仮想テーブル化
以上でData Lake領域にテーブルが作成され、データも格納されました。先ほど説明したようにData Lakeのオブジェクトの操作は SYSRDL#CG.REMOTE_EXECUTE プロシージャに包んで実行しなければならないので、操作をするうえで不便です。そこで、これらのテーブルを、HANA Cloudのインメモリテーブルと同等にアクセスするため、仮想テーブルを定義します。左上のペインにあるデータベースアイコンを展開し、「Catalog」>「Remote Source」を展開します。左下のペインに、HANA Cloudからリモートアクセス可能なデータソースのリストが表示されるので、その中からData Lakeのリモートデータソースの定義名である「SYSRDL#CG_SOURCE」を選択します。右のペインにSYSRDL#CG_SOURCEタブが表示されたら、Schema のテキストボックスに、Data Lakeのスキーマである「SYSRDL#CG」(先ほどのリモートデータソースは、このスキーマ名に準じて命名されています)を指定、最後に右上方にある「Serch」ボタンをクリックします。先ほど実行したテーブル作成コマンドによるテーブルがリストされることが確認できます。
リストされた新規に作成されたテーブルの左にあるチェックボックスにチェックを入れ、右上の「Create virtual Object(s)」ボタンをクリックします。
作成するVirtual Object(仮想テーブル)を認識しやすくするために、各テーブル名にプレフィックスを付与するためのダイアログボックスが表示されますので、仮想テーブルであることを示すためにここでは「V_」を付けることとします。「Create」ボタンをクリックして実行します。
左上のペインから「Tables」アイコンをクリックすると、左下のペインにテーブルがリストされます。下の画面ショットの下の矢印にあるテキストボックスに、スキーマ名「ORDER_ENTRY」を選択する事で、参照したいスキーマにあるテーブル名を抽出します。先ほど作成したテーブルが「V_」で始まる仮想テーブルとしてリストされていることを確認する事ができます。
以上で、大量データを想定した分析、集計、レポートを用途に、Data Lakeをご利用いただくためのデータのインポート方法の説明は終了です。ここから先は、HANA Cloud のSQLコンソールで、通常のテーブルのように参照(Select)する事ができます。ご注意いただきたい点としては、前回のブログでご説明したように、Data Lakeは主にCold Dataを置いたり、HANA Cloud以外の外部のデータの参照を高速化するための用途に設計されているという事です。Insert、Update、Deleteといった更新SQLの実行も可能ですが、これらのパフォーマンスは限定的です。OLTP処理はHANA Cloud自体で実行し、Data Lakeでは実行しないように設計するようご注意ください。