Amazon RedshiftでAmazon Machine LearningのDatasourceを作ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

RDS for MySQLAuroraからAmazon Machine Learning(Amazon ML)のDatasourceを作成してきましたが、最後にRedshiftからの手順について試してみました。公式ドキュメントのUsing Amazon Redshift with Amazon MLに書かれている手順です。Redshiftに関してはマネジメントコンソールからDatasourceを作成可能なため、今回はマネジメントコンソールを利用して作成しています。

仕組み

RedshiftからDatasourceを作成する場合は、Redshiftのunloadコマンドを利用する仕組みになっています。Amazon MLの CreateDataSourceFromRedshift APIを実行すると、Amazon MLサービスが以下の処理を実行します。

  1. Amazon MLサービスがRedshiftにunloadコマンドを発行し、結果がS3にCSVファイルとして保存される
  2. Amazon MLサービスがS3上のCSVファイルをDatasourceとして読み込む

そのため、事前に以下の準備が必要になります。

  • S3バケットの作成
  • Amazon ML用のIAM Roleの作成

なお、DatasourceのData Schemaについての準備は任意です1。マネジメントコンソールから作成する場合は後述しているようにAmazon ML側がRedshiftにクエリを発行して、その結果から自動でData Schemaの雛形を作成してくれます。API経由の場合は編集するタイミングがないためData SchemaのJSONを指定が必須となります。

前提

まずは今回の手順の前提の確認です。Redshiftは作成済みで、testdbbankingテーブルが存在している前提です。bankingテーブルはAmazon MLのチュートリアルに載っているbanking.csvに対応しています。また、リージョンはAmazon MLが利用可能なバージニアを利用しています。

項目
リージョン バージニア(us-east-1)
RedshiftのInstanceIdentifier test-redshift
Redshiftのデータベース testdb
Redshiftのテーブル banking

bankingテーブルのDDLは以下の通りです。とりあえず動作すれば良いという割り切りで作っています。

CREATE TABLE banking
(
  age              INT,
  job              VARCHAR(20),
  marital          VARCHAR(20),
  education        VARCHAR(20),
  defalut          VARCHAR(20),
  housing          VARCHAR(20),
  loan             VARCHAR(20),
  contact          VARCHAR(20),
  month            VARCHAR(20),
  day_of_week      VARCHAR(20),
  duration         INT,
  campaign         INT,
  pdays            INT,
  previous         INT,
  poutcome         VARCHAR(20),
  emp_var_rate     FLOAT,
  cons_price_idx   FLOAT,
  cons_conf_idx    FLOAT,
  euribor3m        FLOAT,
  nr_employed      FLOAT,
  y                INT
);

banking.csvをbankingテーブルにインポートする際はCOPYコマンドなどが利用できます。

COPY banking
FROM 's3://YOUR_BUCKET_NAME/banking.csv'
CREDENTIALS 'aws_access_key_id=****;aws_secret_access_key=****'
CSV
IGNOREHEADER AS 1;

Amazon ML用のIAM Roleの作成

2016-03-21のアップデートでAmazon MLコンソール上でIAMロールを作成できるようになりました。詳細はAmazon Machine Learningコンソール上でAmazon Redshiftへ接続するためのIAMロールを作成できるようになりました | Developers.IOをご参照ください。

Redshiftの場合もAmazon MLサービスにRedshiftとAmazon MLの操作を行ってもらう形になるためAmazon MLサービスがAssumeRole可能なIAM Roleを作成する必要があります2。具体的には公式ドキュメントのAmazon ML Amazon Redshift IAM roleに書かれている手順になります3

以下の留意事項に沿ってマネジメントコンソール上でIAM Roleを作成して下さい。

  • APIを呼び出すときはRoleのARNを利用するため[Role Name]は任意です。例えばAmazon_ML_Redshiftなどとします。
  • [Select Role Type]ではAmazon Machine Learning Role for Redshift Data Sourceを指定します。
  • [Attach Policy]の画面でAmazonMachineLearningRoleforRedshiftDataSourceへチェックを入れます。

マネジメントコンソール上でDatasourceの作成

事前準備は完了したので、マネジメントコンソール上でDatasourceを作成したいと思います。

Amazon MLサービスの画面を開き[Create new...]のプルダウンから[Datasource]をクリックします。そうするとDatasourceの作成画面が表示されるので、[Where is your data located?]の箇所で[Redshift]をクリックします。後は個々のフィールドに値を入力して[Verify]ボタンをクリックして下さい。入力フィールドに関する補足事項は以下の通りです。

  • Amazon ML Redshift roleには先程作成したIAM RoleのARNを指定して下さい。
  • Redshift cluster IDはRedshiftの[Cluster Identifier(Cluster Name)]を指定します。
  • Redshift SQL queryにはデータ抽出用のSQLを記述します。なお、最後にセミコロンを付けないとエラーとなりますので注意して下さい。また、ORDER BY random()はRDS for MySQLの場合と同様に学習精度を向上するためです。

amazon-redshift-with-amazon-machine-learning1

[Verify]ボタンを実行するとAmazon MLからRedshiftに対して実際にクエリが発行されます。Redshiftのクエリログを確認した所、LIMIT 500を付けて発行するようです。クエリの発行に成功すると[Verify]ボタンが[Continue]ボタンに変わるのでクリックします。 amazon-redshift-with-amazon-machine-learning2

後はS3からDatasourceを作成する流れと変わりません。[Schema]の設定画面が表示されるので、設定を行います。 amazon-redshift-with-amazon-machine-learning3

最後まで進めると以下の様な[Review]画面になりました。[Finish]ボタンをクリックするとRedshiftにクエリが発行され、S3に結果がunloadされ、そのCSVファイルを用いてAmazon MLがDatasourceを作成します。 amazon-redshift-with-amazon-machine-learning4

最後におまけとしてRedshiftのクエリログの画面を貼っておきます。まずLIMIT 500でクエリを発行し、最後にUNLOADのクエリを発行していることが分かります。 amazon-redshift-with-amazon-machine-learning5

まとめ

いかがだったでしょうか。RDS for MySQLの場合と比べるとRedshiftの場合はマネジメントコンソール上でスキーマの設定が行えるのは便利ですね!IAM Roleの設定も予めテンプレートが用意されているので簡単に設定できます。すでにRedshiftクラスタをお持ちの方はぜひ一度お試しいただければと思います。


  1. Data Schemaの詳細はAmazon Machine Learningで自動生成されたData Schema JSONを確認するをご参照下さい。 
  2. AssumeRoleの詳細はIAMロール徹底理解 〜 AssumeRoleの正体をご参照下さい。 
  3. 公式ドキュメントの最初にSecurity Group Configurationに関する記述がありますが、これはRedshiftをVPC外部で利用する場合(Cluster Security Groupsを利用する場合)の話で、VPC内部で利用する場合(Cluster Subnet Groups)場合は関係のない話のようです。実際、私はVPC内部でRedshiftを起動したため特にCluster Security Groupsに変更はないようでした。