【レポート】AWS GlueによるサーバレスETL #reinvent #ABD315

2017.12.21

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

原題

ABD315 - Serverless ETL with AWS Glue

概要

Organizations need to gain insight and knowledge from a growing number of Internet of Things (IoT), APIs, clickstreams, unstructured and log data sources. However, organizations are also often limited by legacy data warehouses and ETL processes that were designed for transactional data. In this session, we introduce key ETL features of AWS Glue, cover common use cases ranging from scheduled nightly data warehouse loads to near real-time, event-driven ETL flows for your data lake. We discuss how to build scalable, efficient, and serverless ETL pipelines using AWS Glue. Additionally, Merck will share how they built an end-to-end ETL pipeline for their application release management system, and launched it in production in less than a week using AWS Glue.

組織は、IoT(Internet of Things)、API、クリックストリーム、構造化されていないデータソース、およびログデータソースから、洞察力と知識を得る必要があります。ただし、組織は、トランザクションデータ用に設計された従来のデータウェアハウスおよびETLプロセスによっても制限されることがあります。このセッションでは、AWS Glueの主要なETL機能を紹介し、夜間のデータウェアハウスの予定されたロードから、ほぼリアルタイムのイベントドリブンETLフローまで、データレイク用の一般的なユースケースについて説明します。 AWS Glueを使用してスケーラブルで効率的なサーバーレスETLパイプラインを構築する方法について説明します。さらに、メルク(サイエンスとテクノロジーの分野における世界有数の企業)は、アプリケーションリリース管理システム用にエンドツーエンドのETLパイプラインを構築した方法を共有し、AWS Glueを使用して1週間未満で実稼働させています。

登壇

  • Mehul Shah - Sr. Software Manager, Amazon.com
  • Keith Smola - Global Operations Management, Merck & Co.

セッションレポート

アジェンダ

  • AWS Glueの紹介
  • 4ステップでETLフローを構築する
  • AWS Glueスクリプトをカスタマイズする
  • Merckの導入事例

AWS Glueの紹介

AWS Glueとは、開発者のために提供するフルマネージドでサーバーレスなETL(Extract-Transform Load)サービスです。しかし、ETL開発者は手でコードを書いているのが実情です。

キャンバスベース(GUI)のツールは拡張が難しいのに対して、コードは柔軟で強力で、簡単に共有できます。使い慣れたツールと開発パイプライン、IDE、バージョン管理、テスト、継続的な統合など、、、開発者による開発者ための話です!

一方で、ハンドコーディングは面倒です。例えば、スキーマ変換、データフォーマット変換、ソースの追加・変更、データ量の増加など手書きのコーディングがエラーを起こしやすいからです。

AWS Glueは、開発者が簡単にカスタマイズできるように、最も難しくて手間がかかる作業を肩代わりしてくれます。

AWS Glue のコンポーネント

  • Discover
    • 自動クロール
    • Apache Hive Metastoreとの互換性
    • AWS分析サービスとの統合
  • Develop
    • ETLコードを自動生成する
    • PythonとApache Spark
    • 編集、デバッグ、および探索
  • Deploy
    • サーバーレス実行
    • フレキシブルスケジューリング
    • 監視とアラート

主なユースケース

  • データウェアハウスへロードする場合

    S3のファイルとRDSのテーブルを結合したデータをRedshiftにロードして、BIツールで可視化します。Glueの実行ログや完了通知はCloudwatchLogsに出力します。

  • Amazon S3 上にデータレイクを構築する場合

    クローラはS3上のファイルをスキャンして、Glue データカタログに追加します。Glue データカタログは主要なメタデータリポジトリです。Glue のデータカタログに登録されたら、直ちにデータをAthena、EMR、Redshift Spectrumから分析可能になります。

4ステップでETLフローを構築する

  1. データのクロールとカタログ作成
  2. スクリプトを生成するためのマッピングの指定
  3. 開発者のエンドポイントで対話的に編集して探検する
  4. 実稼働環境で実行するジョブをスケジュールする
  • ETL Sample - システム構成

    LambdaファンクションのトリガでS3にファイルを保管します。S3上のファイルをクロールして、Glueデータカタログに登録、GlueでETLした結果をS3に保存します。Glueデータカタログのテーブル定義を利用してデータ分析サービスで参照します。

  • ETL Sample - システム構成

    Apache Hive形式のパーティションでデータを構造化します。左のJSONファイルをCSVにフィルタや変換します。Public GitHub Timeline のデータは、35種類以上の event types があり、event types 毎に固有のペイロードがあります。

ステップ1: クローラの実行

200種類以上のフィールドがあり、グループファイルをApache Hive形式のパーティションに入れる。

ステップ2: マッピングの定義

カラムの選択、データ型を変更するようにマッピングを定義すると、PySparkのコードが自動生成されます。

ステップ3: 編集とDev-Endpointsによるテスト、データを調べて実験する

IDEをAWS Glue開発エンドポイントに接続して、インタラクティブにETLコードを開発、デバッグ、テストする環境を提供します。

ノートブック(Zeppelinなど)をAWS Glue の Dev-Endpoints に接続します。データセットとデータソースを対話的に実験し、探索する 実稼働環境に導入には、S3へのスクリプトのプッシュして、ETLジョブを作成または登録します。

ステップ4: ジョブのスケジュール

スケジュール実行するジョブにはトリガを追加します。以下の例では、日時実行と実行するジョブを選択します。

サーバーのプロビジョニング、構成、管理は不要、サーバーレスでジョブ実行します。

  • VPCおよびロールベースのアクセスセキュリティと隔離の自動設定
  • 利用者は、ジョブ容量(DPU)
  • リソースの自動拡張
  • 1秒あたりの請求額(10分)を消費するリソースのみを支払う

AWS Glueスクリプトをカスタマイズする

Apache Spark と AWS Glue ETL

  • Apache Sparkとは何か?
    • パラレル、かつスケールアウト・データ処理エンジン
    • フォールトトレランス機能を内蔵
    • 柔軟なインターフェイス:Pythonスクリプト、SQL
    • リッチエコシステム:ML、グラフ、分析、...
  • AWS Glue ETLライブラリ
    • 統合:データカタログ、ジョブオーケストレーション、コード生成、ジョブブックマーク、S3、RDS、ETL変換、より多くのコネクタとフォーマット
    • 新しいデータ構造:Dynamic Frames

Dataframes と Dynamic Frames

(re-invent-2017-abd315-26f)

  • データフレーム
    • SparkSQLのコアデータ構造
    • 構造化テーブルと同様
    • スキーマを必要とする
    • 各行は同じ構造をしています
    • SQLのような分析に適しています

(re-invent-2017-abd315-26s)

  • ダイナミックフレーム
    • ETLのデータフレームと同様
    • 半構造化データの処理用に設計されています。 例えば、JSON、Avro、Apacheログ...

Dynamic Frame の内部

  • レコードごとにスキーマがあり、前もってスキーマは必要ない
    • 再構成、タグ付け、変更が容易
    • dataframe の行よりもコンパクトにすることができます
    • 多くのフローはシングルパスで実行できます

Dynamic Frame transforms

15種類以上のtransformsが提供されており、画期的なものです。

  • ResolveChoice(): 複数の型の値が含まれている場合の列の処理方法を指定する
    • project: 1つ以上の型を破棄する
    • cast: 列を単一のデータ型にキャストする
    • separate into cols: すべての型を別々の列に保持する
  • ApplyMapping(): DynamicFrameのソース列とデータ型を、返されたDynamicFrameのターゲット列とデータ型にマップする。
    • ソース列、ソース・タイプ、ターゲット列、およびターゲット・タイプを含むタプルのリストであるマッピング引数を指定する

Relationalize() transform

構造化データ、非構造化データ、セミ構造化データなどに変換する

  • その度に新しい列、タイプ、およびテーブルを変換して追加する
  • 実行中のキーと外部キーを追跡する
  • リレーショナル・スキーマのSQLは、JSON処理よりも数桁高速です

Useful AWS Glue transforms

  • toDF(): データフレームに変換する
  • Spigot(): 任意のダイナミックフレームのサンプルデータからS3
  • Unbox(): 指定されたフォーマットで文字列を動的フレームに解析する
  • Filter(), Map(): Python UDFを動的フレームに適用する
  • Join(): 2つのダイナミックフレームを結合する

パフォーマンス: AWS Glue ETL

  • Configuration
    • 10 DPUs
    • Apache Spark 2.1.1
  • Workload
    • JSON to CSV
    • Filter for Pull events
  • On average: 2x performance improvement

パフォーマンス: 多くの小さなファイルの場合

多くの小さなファイル(例:Kinesis Firehose)は、本来不向きなので、そのままの Apache Spark(2.1.1)で処理するとタスクが多すぎて、スケジューリングとメモリオーバーヘッドの増加によって、Out-Of-Memoryが発生します。

一方、AWS Glueは、データカタログとの統合によってタスクごとにファイルを自動的にグループ化することで正常にETLを終えることができます。

  • そのままの Apache Spark(2.1.1)オーバーヘッド
    • パーティションを再構築する必要があります(2パス)
    • タスクが多すぎます:ファイルごとのタスク
    • スケジューリングとメモリオーバーヘッド
  • AWS Glue Dynamic Frame
    • データカタログとの統合
    • タスクごとにファイルを自動的にグループ化する
    • クローラ統計に依存する

Job bookmark

Job bookmarkは、下記の図の通り、定期的にジョブを実行するケースにおいて、以前の入力を再処理しないようにしたり、重複出力の生成を避けることに利用できます。

bookmarkは、以前の実行で行われた作業を追跡するジョブごとのチェックポイントです。それぞれの実行時にソース(sources)、変換(transforms)、出力(sink)の状態を維持します。

使用例

  • githubarchiveファイルを毎日処理する
  • Firehoseファイルを毎時処理する
  • DB内のタイムスタンプまたは主キーを追跡する
  • 正規化のために生成された外部キーを追跡する

Job bookmarkのオプションは3つあります。

  • Enable(有効):最新のgithubarchiveパーティションを処理する
  • Disable(無効):githubarchiveテーブル全体を処理する
  • Pause(一時停止):以前のgithubarchiveパーティションを処理する

Job bookmarkの内部について、一切の問題を例に解説します。

Q. スペースの膨張を避けるにはどうすればいいですか? A. すでに処理された入力をフィルタリングするためにタイムスタンプを使用します。

Q. しかしS3は結果整合性(eventually consistent)ではありませんか? A. 開始前にinconsistency window(size d)で作成されたファイルの除外リストを更新します。

最後に

  • 4 steps to build a production ETL flow
    • AWS Glue features
    • Dynamic frames Job bookmarks
  • AWS Glue のお知らせ
    • Scala のサポート(Comming Soon)
    • Asia Pacific (Tokyo) と EU (Ireland) のリージョンのサービス開始(Comming Soon)

    ※ 2017/11/27 時点で、Comming Soonとアナウンスが有りましたが、執筆時点(2017/12/21)では何れも開始していません。

Merckの導入事例

  • 課題 拡張されたデータとメトリックをエンタープライズ・ソフトウェア・デリバリー・マネジメント・システムにすばやく対応させることが課題でした。このシステムの1つの機能は環境に関する知識を提供するための環境管理です。環境に関する知識、資産がどのようなものにして、さまざまなソフトウェアライフサイクルの取り組みにどのように対応しているかについての知識を提供します。その他の機能には、展開管理、配信計画、および範囲管理が含まれます。

    • エンタープライズソフトウェア配信管理システムとの限定的な統合
    • BIツールには、アプリケーションライフサイクルのコンテキストを持つデータソースが必要
    • 主なプロジェクトでは、エンタープライズソフトウェア配信管理システムとの迅速な連携が必要
  • 施策
    • 短いタイムラインでデータレイヤーを提供
    • リソースは、データサイエンティストやETL開発者のものではない
    • 確立されたサポートはAWSの範囲を超えない
    • データは別のスプレッドシートや既存のデータベースにある
    • Catalog vs warehousing
  • アーキテクチャ

  • 成果

    • 既存のリソースを活用し、Glueは素早く習得する
    • サーバなしとは、新たな管理、調達、または維持するための追加のリソースがないことを意味します
    • 短期間で新しいデータソースに簡単に対応し、短期間で大規模な可用性を実現する
    • (整列され、計算された)データの単一のソースが提供された
    • スケーラブルなデータレイヤー/データレイクを可能にした
    • プロジェクトは、リリース管理システムを介してデータを使用することができた

感想

AWS Glueはサーバレスでインフラ管理の必要がなく、大規模なデータに対しても柔軟にスケール可能なETLサービスです。さらにS3ファイルさえあれば、クロールしてデータカタログに自動追加されるのですぐにRedshift、Athena、EMRからもデータ分析可能になります。最も難しくて手間がかかるこれまでの手書きのETL開発を肩代わりしてくれることを期待しています。

発表にあった、Scala のサポート(Comming Soon)と東京リージョンのサービス開始(Comming Soon)など、来年も楽しみですね。

あわせて読みたい

TriggerによるJob実行する方法や、Apache Zeppelinによる Glue scripts(pyspark)の開発環境構築については、以下のブログを参考にしてください。

AWS Glue 実践入門:Triggerを使ってスケジュールやJob完了イベントでJobを実行する

AWS Glue 実践入門:Apache Zeppelinによる Glue scripts(pyspark)の開発環境を構築する