1.ETLパイプラインとは何か、なぜ必要か
本章では、本記事の前提となる「ETLパイプライン」について解説します。
1-1.ETLパイプラインとは何か
「ETL」とは、「データソース層に存在または発生するデータを抽出(Extract)し、データ利用者が利用しやすい形に加工(Transform)した上で、その加工済みデータをデータ蓄積層に読み込ませる(Load)」という一連のプロセスのことです。各プロセスの頭文字を取って、ETLと呼ばれます。
「ETLパイプライン」とは、ETLを実現する一連の処理を一つのプロセスとして実行できる形にパイプライン化したものです。
図1:ETLパイプラインとは
1-2.なぜ必要か
ETL処理をパイプライン化しておく目的とは何でしょうか。色々考えられますが、根本的には「自動化によって人手による運用を可能な限りなくす」ことにあります。パイプライン化されていない場合、人手が介在することによって「運用コストの増大」「人為的エラー発生リスクの増大」「開発・運用スキルの属人化」など、様々な問題が生じ得ます。
2.ETLパイプラインの構成要素
本章では、ETLパイプラインを構成する要素について「コンポーネント層」「ワークフロー層」「パイプライン層」の三層に分けて解説します。
図2:ETLパイプラインの構成要素
(1)コンポーネント層
ETLパイプラインにはどのような部品が必要でしょうか。要件によって必要になる部品(以下、「コンポーネント」)の種類は変わりますが、例えば主なものとして以下のようなものが挙げられます。
コンポーネントの種類 | 説明 |
---|---|
ETLジョブ | ETL処理を実行するジョブ。 |
実行トリガ | ETLパイプラインを実行する契機(トリガ)となるもの。「定期実行」「イベント実行」などがある。 |
通知 | (特に何らかの理由で処理が失敗した場合に)処理の実行状態を開発・運用チームに通知するもの。 |
このようなコンポーネントにあたるリソースをまとめて「コンポーネント層」と呼ぶことにします。
(2)ワークフロー層
ある機能を実現するのに必要な複数の処理をまとめたものを「ワークフロー」と呼ぶことにします。例えば、以下のようなものがワークフローに該当します。
(例1)データレイクから生データを抽出・加工し、データウェアハウスに出力する。
(例2)データマート上のデータを、データ利用者に対して定期的に連携する。
複数のコンポーネントを組み合わせ、これらが意図した順序で動作すれば、ワークフローとして機能しそうです。では、コンポーネントに順序性を持たせるにはどうすれば良いでしょうか。これにはAWS Step FunctionsやApache Airflowに代表される「ワークフローエンジン」を導入するのが一般的です。ワークフローエンジンは、一連の処理の流れ(起動タイミングや起動順序など)を管理するためのサービスです。
ワークフローエンジン等を用いて作成した、ワークフローにあたるリソースをまとめて「ワークフロー層」と呼ぶことにします。
(3)パイプライン層
ある目的を達成するのに必要な複数のワークフローをまとめて「パイプライン」と呼ぶことにします。ここでいう目的とは、例えば「(1)あるデータベーステーブルに含まれるデータを定期的にオブジェクトストレージにロードし、(2)それをデータ連携先に送信する」といったものです。
一つのワークフローで上記の目的(要件)を実現することも可能ですが、「システムを疎結合にしておく」という観点から(1)と(2)は別々のワークフローとして定義するのが望ましいと考えられます。このように、パイプラインには一つ以上のワークフローが含まれることになります。
パイプラインにあたる概念的なリソースを「パイプライン層」と呼ぶことにします。以降、便宜的に「パイプライン層」「ワークフロー層」「コンポーネント層」をまとめて「ETL3層」と呼称します。
3.ETLパイプライン開発プロセスの概要
本章では「2.ETLパイプラインの構成要素」の内容を踏まえ、どのようにETLパイプラインを開発していくべきかについて解説します。
3-1.一般的なシステム開発プロセス
以下の図は、一般的なシステム開発プロセスを図示したものです。通常、先に大枠の要件が決まり、徐々に詳細化されていきます。試験工程は逆に、詳細レベルから始まり、最後にシステム全体での試験を実施します。いわゆる「ウォーターフォール型開発」と呼ばれるものです。
図3:一般的なシステム開発プロセス
「アジャイル開発」が注目されるようになって久しいですが、ETLパイプラインのように“要件が変わりにくい(簡単に変わるべきではない)”開発対象の場合には、「アジャイル開発」は不向きである可能性があります。
3-2.ETLパイプライン開発プロセス
ETLパイプラインの開発プロセスも基本的には「ウォーターフォール型開発」の考え方に基づきますが、要件の詳細レベルに「ETL3層」の概念を導入しています。パイプライン層が最も抽象度が高く、ワークフロー層、コンポーネント層の順に具体化されます。
図4:ETLパイプライン開発プロセス
試験工程に関しては、ウォーターフォール型開発における「単体試験」「結合試験」「システム試験」をそれぞれ、ETL3層の「コンポーネント層」「ワークフロー層」「パイプライン層」で実施します。
4.AWSで実現した場合のアーキテクチャ例
以下の図は、ETLパイプラインをAWSのサービスを利用して実現するアーキテクチャの例です。(この例ではパイプラインを一つのワークフローで構成しています)
図5:AWSで実現するETLパイプラインのアーキテクチャ例
詳細な説明は割愛しますが、ETLパイプラインにおける役割とAWSサービス・機能名の対応は以下のようになります。
ETLパイプラインにおける役割 | サービス名/機能名 |
---|---|
ETLジョブ | AWS Glue/Glueジョブ |
実行トリガ | Amazon EventBridge/EventBridgeルール |
通知 | Amazon Simple Notification Service/SNSトピック |
ワークフロー | AWS Step Functions/Step Functionsステートマシン |
他にも、Glueジョブに与える引数の設定を読み込むLambda関数などがあります。ETLパイプラインに求められる要件に合わせて、適切なサービスを使い分けていくことが重要です。