[レポート] ANT308 : AWS Glue のサーバレスアナリティクスパイプライン構築する #reinvent
はじめに
ANT308-Building Serverless Analytics Pipelines with AWS Glue のセッションのレポートとなります。AWS Glueの新機能やパフォーマンス改善方法について解説しています。
セッション概要
Organizations need to gain insight and knowledge from a growing number of IoT, APIs, clickstreams, and 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, we cover common use cases ranging from scheduled nightly data warehouse loads to near real-time, event-driven ETL pipelines for your data lake. We also discuss how to build scalable, efficient, and serverless ETL pipelines using AWS Glue.
組織は、ますます多くのIoT、API、クリックストリーム、および非構造化データソースとログデータソースから洞察力と知識を得る必要があります。 ただし、組織は、トランザクションデータ用に設計されたレガシーデータウェアハウスおよびETLプロセスによっても制限されることがあります。 このセッションでは、AWS Glueの主要なETL機能を紹介します。夜間のデータウェアハウスの予定から、データレイク用のほぼリアルタイムのイベントドリブンETLパイプラインに至るまで、一般的なユースケースをカバーしています。 また、AWS Glueを使用して、スケーラブルで効率的な、サーバーレスのETLパイプラインを構築する方法についても説明します。
スピーカー
AWS Glue の概要
AWS Glueは一年前と比較して、ジョブやクローラの実行数が飛躍的に増加し、また30以上もの機能が追加されました。
- データカタログ
- 自動クロール
- Apache Hive Metastoreと互換性
- AWS分析サービスと統合
- 開発
- Apache Sparkコア
- 開発言語はPythonとScala
- ETLコードを自動生成
- オーケストレーション
- 柔軟なスケジューリング
- 監視とアラート
- 外部サービスとの統合
上記以外に、Sagemakerとの連携によるデータサイエンスやZeppelin(ノートブック)によるデータ探索など。
階層化されたデータの変換例
年、月、日のように階層化されたディレクトリの下に時間ごとにJSONファイルがあるとして、この階層化されたディレクトリ構造のままParquetに変換できます。
スケーラビリティとパフォーマンスの改善
クローラのパフォーマンスの改善
- 前年同期比7倍の改善
- 1日あたり90万件以上のファイル
- 数百万のパーティション
※ パーティションの数や複雑さによって結果が異なる可能性があります。
自動生成されるETLスクリプト
AWSマネジメントコンソールからETLジョブの入出力を定義すると雛形のETLスクリプトが自動生成されます。
- データソースからDynamicFrameを生成する
- DynamicFrameのデータを変換やクレンジングする
- DynamicFrameを出力する
Apache SparkとAWS Glue ETLの関係
Apache SparkのDataframeとAWS Glue のDynamicFrameは相互に変換可能です。
- Apache Sparkは、複雑な分析のための分散データ処理エンジンです
- AWS GlueはApache Spark上に構築され、ETL固有の機能を提供します
DataFrames と DynamicFrames の相違点
- DataFrame
- SparkSQLのコアデータ構造
- 構造化されたテーブルに似ている
- スキーマが必要
- 各行は同じ構造
- SQLのような分析に適しています
- DynamicFrames
- ETL用途のDataFramesのようなもの
- 半構造化データの処理も考慮して設計
- 例えば、JSON、Avro、Apacheログ...
DynamicFramesのパフォーマンス
AWS Glueも日々改善を繰り返し、パフォーマンスが改善しています。以下、行データの変換速度の比較です。
- 前年比4倍のパフォーマンスの改善
- 1.5時間以内に1TBを変換
- 上記ともに10 DPU
DynamicFrame のプリディケイトプッシュダウン
データファイルからDynamicFrameを作成する際に、すべて読み込むのではなく指定した条件のデータのみを読み込むことができます。条件はpushDownPredicate
に条件式を文字列として渡します。プリディケイトプッシュダウンを効果的に指定することで、DynamicFrameの作成時間の短縮とメモリの空間効率が改善します。
プロファイリングとデバック
AWS Glue の実行モデル
- Apache SparkとAWS Glueはデータ並列で、データをパーティション(シャード)に分割して並列分散処理します
- ジョブはステージに分かれます
- 1ステージ × 1パーティション = 1タスク
- DriverはExecutorのタスクをスケジュールします
- DPUあたり2つのExecutorで処理します
※ 全体的なスループットは、パーティション(シャード)の数によって制限されます。
AWS Glueのジョブメトリクス
パフォーマンスをより理解するためにAWS Glueのジョブメトリクスを使用します。ジョブメトリクスを有効にするにはマネジメントコンソールのJobMetricsをEnable
に設定、CLI/SDKで有効にするには、--enable-metrics
を指定します。
ジョブのプロファイリングにETL メトリクスを活用する
- ETL メトリクスはApache Sparkメトリックをベースに得られた情報
- DriverとExecutor毎のメトリック
- 30秒毎にAmazon CloudWatchメトリックへの集計とその瞬間のレポートを出力します
- メトリック
- メモリ使用量、読み書きされるバイト数、CPU負荷、シャッフルされたバイト数、必要なエグゼキュータなど...
メモリ使用率のプロファイリング - Apache Spark による小さな多くのファイルの処理
Apache SparkのDataframeで多数の小さなファイルを処理すると、タスクメタデータがドライバのメモリを圧迫してジョブが落ちます。
メモリ使用率のプロファイリング - AWS Glue による小さな多くのファイルの処理
AWS Glue の DynamicFrameは自動的にファイルをグループ化するので、ドライバのメモリは実行の全期間にわたって50%以下におさまります。
並列化の最適化
大きなファイルの処理は分割可能なbzip2ファイルにすることで、複数のExecutorに処理を分散できます。10 DPUを指定すると必要なExecutorのメトリック最大値がスケーリングの余地を示しています。
15 DPUでは、アクティブなExecutorが必要とされるExecutorを最大限と同じになり、27Executorで並列分散できたことを示しています。
相互運用性の改善
1年前のオーケストレーション - タイムベースのワークフロー
昨年はファイルが到着する時間からソースデータのクロール〜変換〜変換データのクロール〜レポート作成は、スケジュール実行による時間ベースのワークフローでした。
オーケストレーションの構成要素と新機能
以下のオーケストレーションの構成要素の中から紫のブロックが機能強化されています。
- External
- クローラとジョブの通知をAmazon CloudWatchにパブリッシュする
- Amazon CloudWatchイベントを使用して、Lambdaファンクションを起動してジョブやクローラを起動するなど、ダウンストリームワークフローを制御する
- Conditions
- トリガー条件の 'ANY'および 'ALL'
- ジョブ状態が「失敗」、「停止」、または「タイムアウト」の追加
- Control
- ジョブタイムアウトを設定
- ジョブ遅延通知
現在のオーケストレーション - イベントドリブンのワークフロー
現在はファイルが到着したイベントをきっかけにソースデータのクロール〜変換〜変換データのクロール〜レポート作成をイベントベースの依存関係を使用してDAG内のジョブを実行します。
新しいジョブタイプ「Python shell」(CommingSoon December 2018)
Python shell とは
- 小中規模のタスク向けETL実行環境
- SQLによるETL処理
- S3や3nd パーティサービスとの連携
- MLサービスからPython Shellの起動
AWS Glue Python スペック
Python 2.7 環境で boto3, awscli, numpy, scipy, pandas, scikit-learn, PyGreSQL, ...が利用できます。
- 初期状態
- 20秒未満で起動
- VPCサポート
- ランタイム制限なし
- サイズ
- サイズ:1 DPU(16GBを含む)
- 1 / 16DPU(1GBを含む)
- 価格
- DPU-hourあたり0.44ドル、最低1分間、1秒あたりの請求
Python shell による協調フィルタリングの例
- Amazonの顧客レビューデータセット(s3://amazon-reviews-pds)
- Video カテゴリ
- 評価の低いランクの(顧客x製品)評価を計算
- scipyのsparse matrix と SVD libraryを使用
- 1DPU
- matrix: 217K x 384K
- SVD -- rank = 1000
実行時間が69秒、見積り金額$0.60
その他の新機能
Amazon DynamoDBテーブルのサポート
クローラとAWS Glue ETLでAmazon DynamoDBテーブルのサポートされ、DynamoDBテーブルに対してSQLを実行できるようになりました。
暗号化
プラットフォームレベル、転送中、および休止中(AWS KMSキーを使用)
コンプライアンス
GDPR、HIPAA、BAAに対応
最後に
AWS Glueは、AWS Lake Formationのバックエンドで支えるサービスです。Glueのメトリクスはモニタリングやデバックに大変有用なのでより深く理解するために私は常にenableしています。パフォーマンス改善についてはANT326は大変参考になるのでおすすめです。 Glueが提供しているAPIを直接叩いてデバックするためにはDevelopmentEndpointが必要ですが、今後のリリース予定のPython shellで一部代用できるようになるのではと期待しています。今月リリース予定ということで大変楽しみです。
合わせて読みたい
[レポート] ANT326 : AWS Glue ETL Jobの Metrics-Driven パフォーマンスチューニング #reinvent