Amazon Web Services ブログ

Amazon S3 のデータを AWS Glue データカタログで管理し、Amazon SageMaker ノートブックから利用する方法

 

あなたがデータサイエンティストであるとしましょう。会社のシステムが統合され、膨大なデータセットの定義も完了し、データが容易に分析できるとしたら、ラッキーです。そんな会社はごく一握りだからです。 では、そのような恵まれた環境ではないとしましょう。機械学習用の準備作業の中で、フォーマットの異なるデータセットを統合し、データの分析や可視化を行ううえでの支援が必要なら、ぜひこの記事をお読みください。

このブログ記事では、Amazon SageMaker で、大量の企業データを予備解析する方法について説明します。Amazon SageMaker では、Jupyter ノートブックが動作しており、企業のデータレイクの中から注目すべきデータセットを探索したり、取り出したりすることができます。複数のデータセットのそれぞれに必要な情報のサブセットが含まれている場合には、それらを統合させて注目すべき情報を取り出し、Amazon SageMaker ノートブックでそのままシームレスにデータの分析と可視化を行うことができます。

概要

Amazon SageMaker は、機械学習の機能を提供するフルマネージドサービスです。Amazon SageMaker を使用することで、データサイエンティストや開発者は、機械学習モデルを短期間で容易に構築、トレーニングすることができます。また、用意したモデルを実稼動も可能なホステッド環境に直接導入することもできます。また、Jupyter のオーサリング環境が統合されており、データサイエンティストの初期のデータ探索や分析、モデル構築に便利です。

Jupyter ノートブックが Amazon SageMaker ノートブックのインスタンス上で実行されているため、Amazon S3 のデータセットを容易にノートブックに読み込み、処理することができます。ただ、最初に対象とするデータセットのロケーションを指定する必要があります。データレイクの規模が大きい場合、解析対象のフィールドを含んだデータセットを正確に特定することは、難しい作業になります。個々のデータセットのサイズが大きくなればなるほど、ノートブックに読み込ませる作業が現実的なものではなくなります。今日における一般的なデータセットのサイズに対し、ノートブックのディスク容量やメモリは限られているのです。また、よくあるケースとして、必要な情報が複数のデータセットに分散していることもあります。この場合は、データの探索がさらに難しいものとなります。必要なデータセットのロケーションを特定し、統合させてフィルタリングする必要が生じるのです。つまり、非常に規模の大きなデータセットを統合させて、ノートブックに読み込ませようとすると、生産性が損なわれることになります。データセットがさらに大きくなれば、そのような作業はもはや現実には不可能です。このようなデータの結合や探索に要する作業は、データサイエンティストの作業時間の 80% を占めています。機械学習プロジェクトを支障なく遂行するには、このような負担を軽減することが不可欠です。

多くの大企業が、データレイクの管理に AWS Glue を使用しています。AWS Glue はフルマネージド型のデータ抽出、変換、ロード (ETL) サービスです。このサービスを使用すれば、データに対する分類、クリーニング、エンリッチ、信頼性の高い方法でのデータストア間でのデータ移行が行えます。AWS Glue データカタログと称される一元化されたメタデータリポジトリが備えられており、データレイク内のデータをエンリッチおよび分類した上で、検索やクエリが実行できるようになっています。 データカタログ内のメタデータを使用することで、任意のデータセットの名前、ロケーション、コンテンツ、属性での指定が行えます。

Amazon S3 のデータレイクで、非常に大きなデータセットのフィルタリングや集計を行う場合や、他のデータセットと統合される可能性がある場合には、Amazon EMR 上で Apache Spark を使用するのが最適です。Apache Spark はクラスタコンピューティング用のフレームワークで、Python、Java、Scala などの複数の言語での分析をサポートする組み込みモジュールを備えています。企業のデータレイクによくみられる大規模データセットを扱ううえで、Amazon EMR で Spark を動作させることによるスケーリングの効果は絶大です。データセットが AWS Glue データカタログで定義されていれば、データセットへのアクセスがさらに容易になります。また、AWS Glue データカタログを Amazon EMR に搭載されている Hive の外部メタストアとして使用することもできます。フィルタリング後、データセットのサイズが減少することで、ノートブックへの読み込みが可能となり、作業対象のタスクに関連する企業データのサブセットのみを探索、処理、可視化できるようになります。また、負荷の高い処理については、当該タスクに最適なサービスに振り向けられます。

このブログに記載の手順に従えば、データレイクへのアクセスと Amazon SageMaker ノートブックのデータの解析が、すぐに可能となります。

: 本ブログ記事は、Build Amazon SageMaker notebooks backed by Spark in Amazon EMR の公開後に投稿されたものです。

ステップ 1: ソリューションの概要

今回のソリューションでは、上述の各機能を組み合わせる方法を紹介します。次の内容が含まれます。

  • Jupyter ノートブックをホストする Amazon SageMaker から、AWS Glue データカタログを使用して、必要な Amazon S3 のデータセットを指定する。
  • Amazon EMR 上で、統合、フィルタリング、集計の各タスクを実行する。
  • 最終的に得られるデータセットを Pandas データフレーム (列内に異なるデータ型が存在する可能性がある場合でも、容易に操作できる 2 次元データ構造) として直接使用できる。

本ソリューションは、AWS の 3 つのサービスと複数のオープンソースコンポーネントを使用して実装されています。すなわち、Jupyter ノートブックを実行する Amazon SageMaker ノートブックインスタンス、SparkMagicApache Spark を実行する Amazon EMR クラスタ、Apache LivyAWS Glue データカタログです。

  • Amazon SageMaker は、開発者やデータサイエンティストがあらゆる規模の機械学習モデルを短期間で簡単に構築、トレーニング、導入できるようにするフルマネージド型プラットフォームです。 1 番のポイントは、オーサリングのサポートであり、Jupyter ノートブックの IDE がホストされていることから、Jupyter ノートブックでのデータ探索、クリーニング、前処理に際して設定が一切不要になります。
  • SparkMagic は、Jupyter を使用する際に、Livy を通じて、リモートの Spark クラスタとインタラクティブにやりとりするためのツールセットです。Sparkmagic のプロジェクトには、複数の言語で Spark のコードをインタラクティブに実行するための仕組みや、Jupyter を統合 Spark 環境にするための複数のカーネルが含まれています。
  • Livy は、REST インターフェイスを通じて、Amazon EMR クラスタ上の Spark とのやりとりを容易にするサービスです。Spark をインタラクティブなウェブ/モバイルアプリケーションで使用できるようにするもので、今回の事例であれば、Jupyter ノートブックで Spark を使用できるようにします。
  • AWS Glue データカタログは、一元化されたメタデータリポジトリとして動作します。Amazon Athena、Amazon Redshift、Amazon EMR などのサービスを使用して、データが検索やクエリの対象となるようにします。また、Apache Hive の互換性を備えた外部メタストアとしても使用でき、Amazon EMR で動作するビッグデータアプリケーションに利用できます (本ブログで扱います)。

本ブログ記事で示す内容においては、これらのすべてのコンポーネントが、下図にあるように相互に作用します。

次の手順に従って作業することで、Amazon S3 上のデータセットにアクセスし、AWS Glue データカタログで定義することができます。

  1. Amazon SageMaker を使用し、Jupyter の Sparkmagic ノートブックを起動させます。ノートブック内で、コマンドをローカルで実行するか、Amazon EMR クラスタで動作する Spark にコマンドを送信します。PySpark コマンドが使用でき、SQL magic で HiveQL コマンドを実行することもできます。
  2. EMR クラスタに向けて送信されたコマンドが、同クラスタ上で動作する Livy サービスで受信されます。
  3. Livy は、EMR クラスタで動作している Spark にコマンドを受け渡します。
  4. Spark は、Hive メタストアにアクセスし、カタログ化されたデータセットのロケーション、スキーマ、プロパティを特定します。今回のケースでは、Hive メタストアは AWS Glue データカタログに設定されています。
  5. Spark は Glue データカタログの情報を使用し、Amazon S3 のデータを直接読み込みます。
  6. 操作の実行後、Livy はさらなる解析と視覚化のために、データを Pandas のデータフレームとしてノートブックに戻します。

次のセクションでは、これらの手順を小規模なサンプルデータセットに対して実施します。サンプルデータは、http://everypolitician.org/ から入手した国会議員に関する情報です。データは複数のテーブルに正規化されており、個々の国会議員の情報を政党や公的サービスと合わせて取り出すには、それらのテーブルの情報を結合させる必要があります。

実行する手順は、次のとおりです。

  1. 提供済みの AWS CloudFormation スタックを使用して、Amazon SageMaker ノートブックと Livy と Spark を備えた EMR クラスタを作成します。また、クラスタの互換性のある Hive メタストアとして AWS Glue を指定します。スタックでは、サンプルデータのクロール用に、AWS Glue クローラーもセットアップされます。
  2. AWS Glue クローラーを実行して、AWS Glue データカタログにメタデータを生成します。
  3. Amazon SageMaker の Jupyter ノートブックで、次の操作を行います。
    1. AWS Glue データカタログで定義されたデータにアクセスし、いくつかのテーブルを結合させ、結果をフィルタリングします。
    2. ノートブックにサイズの小さくなったデータセットを取り込み、探索します。
    3. 解析を実施し、データのクラスタリングを行います。

ステップ 2: インフラストラクチャコンポーネントの設定

この手順では、定義済みの AWS CloudFormation スタックを起動させ、ソリューションのコンポーネントをそれぞれ設定します。提供されるスタック設定は、次のとおりです。

  • Livy および Spark を備えた EMR クラスタ。また、外部の互換性のある Hive メタストアとして Glue データカタログを使用。さらに、Amazon EMR に Livy を設定し、EMR クラスタと同じメタストア (AWS Glue データカタログ) を使用。
  • Amazon S3 上の国会議員データセットの特定と AWS Glue データカタログでのカタログ化のために、AWS Glue データベースと AWS Glue クローラーを設定。また、Glue クローラーに必要な AWS Identity and Access Management (IAM) ロールも設定。次のステップでクローラーを実行し、後ほど、Amazon SageMaker ノートブックのデータを探索します。
  • Amazon SageMaker に必要なインフラストラクチャ
    • Amazon SageMaker ノートブックのインスタンスが使用する IAM ロール。IAM ロールには、マネージドロールである AmazonSageMakerFullAccess と S3 へのアクセス権が与えられています。
    • Amazon SageMaker ノートブックのインスタンスに使用するセキュリティグループ。
    • Amazon SageMaker のライフサイクル設定。Livy をスタックによって起動される EMR クラスタにアクセスするように設定します。また、サンプルコードを含んだ定義済みの Jupyter ノートブックでコピーします。
  • Amazon SageMaker ノートブックインスタンス。先に定義されるライフサイクル設定を使用して起動されます。

このソリューションの us-east-1 AWS リージョンでの運用状況を確認するには、AWS CloudFormation コンソールを開いて、[Launch Stack] ボタンを選択します。

[Next] を選択し、次のスクリーンショットのように、利用する環境用にパラメータを更新します。

  • スタック名を設定します。
  • 最低要件として、VPCId と VPCSubnet の更新が必要です。必要なソフトウェアコンポーネントのインストールを許可するには、VPC とインターネット接続のあるパブリックサブネット (アカウントに作成されたデフォルトの VPC など) を選択します。
  • また、Amazon SageMaker ノートブックのインスタンス用のデフォルト名、ライフサイクル設定、AWS Glue データベースがアカウントですでに使用されていないかも確認します。使用されていた場合は、別の名前に置き換えます。

[Next] を選択し、[I acknowledge that AWS CloudFormation might create IAM resources with custom names (AWS CloudFormation がカスタム名で IAM リソースを作成する場合があることに同意します)] を選択します。最後に [Create] を選択します。

CloudFormation のマスタースタックとその 3 つの子スタックのステータスが、[CREATE_COMPLETE] になるのを待ちます。スタックの導入には、10 分から 15 分かかります。

マスタースタックの [Outputs] タブで、EMRClusterId、SageMakerNotebookInstanceId、SageMakerInstanceSecurityGroupId を確認します。これらは次のステップで使用します。

ステップ 3: AWS Glue クローラーの実行

ここでは、CloudFormation スタックで AWS Glue に関連した手順を 2 つ実行します。

  • Glue データベース (legislators) の作成。
  • Glue クローラー (LegislatorsS3Crawler) の作成

ただ、この時点で、AWS Glue データカタログには Amazon S3 のデータセットに関するメタデータが一切ありません。メタデータを含んだデータベースを生成するには、AWS Glue クローラーを実行します。手順は、次のとおりです。

  1. AWS マネジメントコンソールで、AWS Glue コンソールに移動します。
  2. 左のナビゲーションバーから、[Crawlers] を選択します。
  3. 一覧から、[LegislatorsS3Crawler] クローラーを探します。クローラーを選択し、[Run Crawler] を選択します。クローラーに使用するロールの選択、または、新しいロールの作成が求められます。CloudFormation スタックの作成した IAM ロールを選択します。
  4. クローラーが実行されるのを待ちます。ステータスが、[Starting]、[Running]、[Stopping]、[Ready] の順に変化します。
  5. クローラーのステータスが [Ready] になったら、[Tables Added] の下の列を確認します。テーブルが 6 つ追加されているのが確認できるはずです。

AWS Glue コンソールでテーブルの内容を確認するには、左のナビゲーションペインで、[Databases] を選択し、[legislatorss3] データベースを選択します。[legislatorss3] の [Tables] を選択します。次のスクリーンショットと同様のテーブルの一覧が確認できるはずです。これらのテーブルには、米国国会の上下両院の議員とその議席数のサンプルデータが JSON フォーマットで格納されています。(これは、チュートリアルで使用されるサンプルデータのクローリングでロードされたデータと同じものです。このチュートリアルでは、今回、CloudFormation テンプレートで作成したクローラーを、手動で作成する方法について解説しています)。次のステップでは、これらのテーブルを Jupyter ノートブックで利用します。

ここで少し、テーブルの内容を確認してみてください。スキーマ、サイズ情報、ロケーションなど、データセットに関する情報が確認できるはずです。

ステップ 4: Amazon SageMaker ノートブックからの AWS Glue データカタログで定義されたデータへのアクセス

このステップでは、前のステップで生成したテーブルに、Amazon SageMaker ノートブックからアクセスして探索を行います。

AWS マネジメントコンソールで、Amazon SageMaker コンソールに移動します。左のナビゲーションペインで、[Notebook instances] を選択します。利用している CloudFormation スタックの SageMakerNotebookInstanceId (テンプレートのデフォルト値は「sageglue」) で始まるノートブックインスタンスを指定します。ノートブック名のとなりの [Open] を選択します。

次のスクリーンショットと同様のページが表示されます。CloudFormation スタックの Amazon SageMaker ライフサイクル設定で、ノートブック [Using_SageMaker_to_access_S3_Using_Glue_Data_Catalog] が自動的に Jupyter のダッシュボードにアップロードされます。

タイトルをクリックして、「Using Sagemaker」ノートブックを開きます。

カーネルタイプが「SparkMagic (PySpark)」であることに注意してください。上部のメニューバーで、[Kernel] を選択し、[Restart] でカーネルを再起動させます。「Do you want to restart the current kernel? All variables will be lost. (現在のカーネルを再起動しますか。すべての変数が失われます)」というメッセージが表示されたら、「restart (再起動)」と回答します。 Livy が EMR クラスタへのセッションを要求しますが、しばらくするとセッションがタイムアウトします (Livy で設定可能)。起動や再起動の作業の際に、最初からカーネルの再起動とノートブックの再実行を行うことで、接続の切断によるエラーが減ります。

最初のセルを選択し、上部のメニューバーの [Run] を選択します。ノートブックがセルを実行し、順に次のセルが処理されます。コードの横にある番号が、セルの実行が完了した時点で、「*」から番号に切り替わります。引き続き、それぞれの [Run] を選択し、ノートブックの各セルの実行を開始します。セルに記載されている説明を読み、コードで実行される動作について把握してください。次のような内容が実行されます。

  • Spark クラスタへのアクセスと、シンプルな PySpark ステートメントの実行
  • Glue データカタログのデータベースのリスト化と、ユーザーが先に設定した Legislators データベースのテーブルの表示
  • Legislators データベースの 3 つのテーブルを SQL を使用して結合し、生成された行を条件に沿ってフィルタリング。さらに必要となる列を個別に特定。
  • ローカルのノートブックインスタンスに必要なフィールドと行のみを格納したデータフレームを生成し、そのデータフレームをその後の解析に使用。
  • 例として、小規模なクラスタリングを実施。

ステップ 5: クリーンアップ

支払請求を停止するには、AWS CloudFormation スタックを削除する必要がある点に留意してください。マスタースタックを削除すれば、その配下のスタックも削除されます。

今回のソリューションをデフォルトテンプレートの設定で動作させる場合の費用は、1 時間あたり約 0.15 ドルです。

今回の構成は、デモを目的とした小規模なものであり、より大きな量のデータを処理する場合には、Amazon EMR および Amazon SageMaker のインスタンスサイズを適切なものに拡張する必要がある点にご注意ください。

ステップ 6: (オプション) デバッグおよびライフサイクル設定

ここでは、オプションの追加情報として、次の 2 つのトピックについて取り上げます。

  • 接続のデバッグ
  • SageMaker ライフサイクル設定の詳細

接続のデバッグ

ノートブックからクラスタへの接続に失敗する場合は、次の手順を実行して、原因を確認します。接続に問題がある場合に最もよくみられるのが、livy.conf の設定の誤りと、EMR クラスタとノートブックインスタンス間のセキュリティグループのオープンポートの誤りです。

ノートブックインスタンスが作成または開始され、ライフサイクル設定が実行された場合、その結果は Amazon CloudWatch Logs ロググループ (/aws/sagemaker/NotebookInstances) に取り込まれます。このロググループには、<notebook-instance-name>/LifecycleConfigOnCreate スクリプトの実行結果と、<notebook-instance-name>/LifeCycleConfigOnStart の実行結果が保持されます。ライフサイクルのスクリプトを実行した際のエラーは、これらで確認できます。

次に、Livy の接続と、ノートブックインスタンスの EMR へのアクセスについて確認します。Jupyter ファイルのダッシュボードで、[New]、[Terminal] の順に選択します。そうすることで、ノートブックインスタンス上でシェルが開きます。


Livy のコンフィグレーションファイルは、/home/ec2-user/SageMaker/.sparkmagic/livy.conf に格納されています。ファイルの 3 箇所で、EMR マスターのプライベート IP アドレスで置き換えるべき部分が、http://localhost:8998 のままになっていないか確認します。次に、Livy の接続と、ノートブックインスタンスの EMR へのアクセスを確認します。Jupyter ファイルのダッシュボードで、[New]、[Terminal] の順に選択します。そうすることで、ノートブックインスタンス上でシェルが開きます。

ターミナルで次のコマンドを入力して、ネットワークに接続できているか確認することもできます。

curl <MASTER_IP_ADDRESS>:8998/sessions
{"from":0,"total":0,"sessions":[]} 

Spark のジョブを長時間実行する場合には、livy.server.session.timeout を変更することも可能です。現在のデフォルトは 1 時間であるため、使用方法によっては短すぎる場合もあるでしょう。この設定は、EMR クラスタの livy-conf の設定に追加できます。CloudFormation テンプレートで設定します。

Amazon SageMaker ライフサイクル設定の詳細

SageMaker ノートブックインスタンスでは、ライフサイクル設定が使用できます。ライフサイクル設定を使用することで、Amazon SageMaker ノートブックインスタンスを作成、または停止後に再起動させるたびに、Bash スクリプトを実行することができます。CloudFormation テンプレートで creation-time スクリプトを使用して、ノートブックインスタンス上の Livy に、先に作成した Amazon EMR マスターインスタンスのアドレスを指定します。そうすることで、複数のノートブックインスタンスに 1 つのライフサイクル設定を使用させることができます。

なお、ライフサイクル設定はノートブックインスタンスで使用されている間は変更することができますが、インスタンスが起ち上げられた後に、ライフサイクル設定をノートブックインスタンスに追加することは、現時点ではできません。ライフサイクル設定が相当程度に不正な形式で指定されると、インスタンスがクラッシュする可能性があります。また、インスタンスに格納されている Jupyter ノートブックや他のアーティファクトも失われる場合があります。

このステップでは、ノートブックインスタンスの作成時に、IP アドレスがハードコードされています。より安定したソリューションとするには、ノートブックインスタンスが再起動するたびに、マスターの IP アドレスが自動的に探索されるのが望ましいでしょう。たとえば、ノートブックインスタンスが使用すべき EMR クラスタに特定のタグを設定する方法があります。起動の際のスクリプトでそのタグを使用してクラスタの位置を指定し、その IP アドレスを使用して Livy のコンフィグレーション設定をリセットするのです。このようなアプローチを採用することで、クラスタのマスターやクラスタ自体が置き換えらえるようなことがあっても、引き続きノートブックインスタンスから AWS Glue データカタログに接続できます。

まとめ

ここまでで、複数のコンポーネントを組み合わせることによる優れた効果を確認してきました。Amazon EMR のもつスケーリング機能と処理能力を使用し、Amazon S3 のデータレイクにあるデータの前処理、フィルタリング、結合、集計などを行うことができます。データサイエンティストが Jupyter ノートブックや SQL などの使い慣れたツールで、データレイク内でカタログ化されたデータを迅速に探索したり可視化したりできるようになります。作業負担の元となる要因が取り除かれ、ビジネスの進展に合わせて、調査研究が行えるようになるでしょう。

 


今回のブログ投稿者について

Veronika Megler 博士は、アマゾン ウェブ サービスのシニアコンサルタントです。顧客の革新的なビッグデータ、AI、ML プロジェクトの実装を担当し、AWS を使用する際の TTV (期待された効果が出るまでの時間) の向上を支援しています。