Amazon Athenaのパーティション射影と、Amazon Kinesis Data Firehoseの動的パーティショニングの使いどころ(概念編)

目次

S3上にあるデータに対しての、Amazon Athena(以下Athena)のパーティション射影と、Amazon Kinesis Data Firehose(以下、Firehose)の動的パーティショニングの使いどころについて紹介します。 この連携によって、パーティションの更新の手間が要らなくなるとともに、Kinesis FirehoseでのS3へのデータ保存に柔軟性を持たせることができます。

Athenaについて

Athenaはビッグデータ用の分散クエリエンジンである、Prestoをベースとしたサーバレスのデータクエリサービスです。サーバレスでS3上にあるデータやDynamoDBなどAWSの色々なサービスに対してSQLを投げられるサービスです。

各種ログをS3に保存したりするケースは多いと思うので、アクセスログの解析などで便利なサービスですが、料金がクエリ対象になったデータの容量によって課金されます。すなわち、以下に余計なデータをクエリすることなく、必要なデータのみでクエリをするかがコスト、処理速度の面で重要になってきます。

Athenaのパーティションについて

Athenaで必要なデータのみクエリするために使える機能としてパーティションの概念があります。これはMySQLなどのRDBMSのパーティションと同様の概念です。

Athenaでパーティションを利用する方法は大きくわけて2つあります。

  1. Glueデータカタログを作成する際にパーティションを定義する
  2. Glueデータカタログを作成する際にパーティション射影の設定を定義する

1の方法は、一般的なやりかたですが、その場合にパーティションの追加時に、MSCK REPAIR TABLEといったコマンドで新しいパーティションを管理する必要があります。例えばパーティションキーに日付を使っている場合、新たな日付のデータが追加された時にパーティションをAthena側に認識させるために、MSCK REPAIR TABLEのコマンドを叩く必要があります。

2の方法は、Athenaのクエリ時に、自動的にパーティションキーとして認識させるというものです。これによって、MSCK REPAIR TABLEのコマンドを叩く必要がなくなります。Glueデータカタログに登録されているパーティションの数が非常に多かった場合に使うことでパフォーマンスのメリットを得ることもできます。ただし、これが有効なのはAthenaのクエリ時です。Redshift SpectrumでGlueデータカタログを使ってS3のデータをクエリしたりする場合には使用できません。

Glueのパーティション形式とパーティション射影

Glueにおいては、基本的にS3に置いてあるファイルのhive形式でのパーティションがサポートされています。 すなわち、

s3://bucket/year=yyyy/month=MM/day=dd/hour=hh

といった形式で保存されていることを前提としています。

ただ、Firehoseなどでは標準で

s3://bucket/yyyy/MM/dd/hh

のような形式になりますし、他のサービスのログなどもhive形式を前提とせず、日付などで区切っていることが多いと思います。このような時は、ADD PARTITIONのコマンドを叩いて、どこのprefixの値をパーティションキーとして使用するか、といったことを指定する必要があります。

これも新たなパーティションが必要になるタイミングで実行する必要がありますが、パーティション射影を使用することで、その必要もなくなります。これもパーティション射影を使用するメリットの一つかと思います。

Firehoseについて

FirehoseはストリームデータをS3やRedShift、OpensearchなどのAWSサービスや、Splunkなどの外部サービスにロードするためのサーバレスサービスです。これによって、Firehoseにデータを投げつけることで、S3などにデータを集めることができます。投げるやり方としては、サーバにエージェントを稼働させて、特定のファイルデータを送ったり、SDKで直接投げたり、APIGatewayと連携して、外部からHTTPで投げる、などのことができます。

また、データ分析に適したParquet形式などで保存するように変換することも可能です。

処理されたデータの量によって課金されるので、データ受信がなければ課金されません。

Firehoseの動的パーティショニングについて

先述した通り、Firehoseはデフォルトでは、

s3://bucket/yyyy/MM/dd/hh

の形式でサーバに保存しています。RedShiftなどからアクセスしたいなどの際に、Hive形式で保存したいケースもあるでしょう。また、日付じゃないパーティションキーを使用したいケースもあるでしょう。

その時に使用できる機能が動的パーティショニングです。

動的パーティショニングは、Kinesisに送られてきたデータレコードの値に応じて、パーティションキーを設定できる機能です。つまり、

yyyy mm dd userid
2022 10 21 aa
2022 10 22 bb
2022 10 22 bb

といったレコード形式のデータが送られてきた場合に、

s3://bucket/year=yyyy/month=MM/day=dd/hour=hh

といった形式や

s3://bucket/userid=aa

といった形式で保存先を設定できるということです。なお、hive形式である必要はありません。なので、ユーザIDごとに保存先のprefixを分けたいなどの用途でも利用できます。

終わりに

今回は、概念的な面をメインにAthenaのパーティション射影とFirehoseの動的パーティショニングについてご紹介しました。次回は、これらをCDKで設定し、実際の動作をご紹介する予定です。