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つあります。
- Glueデータカタログを作成する際にパーティションを定義する
- 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で設定し、実際の動作をご紹介する予定です。