Amazon Data FirehoseからAmazon S3バケットへ保存したファイルの圧縮率を比較してみた

Amazon Data FirehoseからAmazon S3バケットへ保存したファイルの圧縮率を比較してみた

Amazon Data Firehoseのファイルの圧縮率を比較してみました。圧縮形式はGZIP, ZIP, Snappy, Hadoop互換Snappyの4つです。1~10KBという比較的小さめのデータサイズにて、最も圧縮率が高かったのはGZIPでした。
Clock Icon2025.03.29

Amazon Data Firehoseのファイル圧縮率ってどのくらい?

おのやんです。

Amazon Data Firehose(以下、Data Firehose)のファイル圧縮率ってどのくらいなのか気になった頃はありますか?私はあります。

Data Firehose では、Amazon S3(以下、S3)への配信前にデータを圧縮できます。圧縮なしの形式も含めて、Data Firehoseでは次の圧縮形式がサポートされています。

  • 圧縮なし
  • GZIP
  • ZIP
  • Snappy
  • Hadoop互換Snappy

これらの圧縮形式は、圧縮なしの状態からどれくらいファイルサイズを変えることができるのか検証する機会がありましたので、今回はそれぞれの圧縮率を実際に計算します。

構成図

今回使用した検証用AWS構成は次の通りです。指定したサイズのデータをAWS Lambda(以下、Lambda)関数で作成した後、それぞれの圧縮形式を設定したData Firehose ストリームにデータを配信します。これらのData Firehose ストリームは、ひとつのAmazon S3(以下、S3)バケットに保存されます。

architecture

上記の構成は、AWS Serverless Application Model(以下、SAM)で組んでいます。GitHubリポジトリを載せておきますので、コードなど参考にしていただけると幸いです。

https://github.com/oshanQQ/aws-test-firehose-compression

ファイルの容量はS3バケットのコンソール画面から確認できますので、今回はS3バケットコンソール画面から確認したファイルサイズをもとに、圧縮率を計算していきます。

検証

今回は、Lambda関数に生成させるデータを1KB、5KB、10KBの3パターン試します。

また、それぞれのパターンで10回生成した 平均値 を、代表のファイルサイズ とします。

圧縮率の計算式は次の通りです。

圧縮率 = \frac{圧縮後のファイルサイズ}{圧縮なしのファイルサイズ}

1KBの場合

1KBのデータを生成した場合、それぞれの圧縮形式において、S3バケットで確認できたファイルサイズと、その平均値は次のようになりました。

圧縮なし

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 1.0 KB
2 1.0 KB
3 1.0 KB
4 1.0 KB
5 1.0 KB
6 1.0 KB
7 1.0 KB
8 1.0 KB
9 1.0 KB
10 1.0 KB

平均ファイルサイズ: 1.0 KB = 1024.0 B

GZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 855.0 B
2 855.0 B
3 856.0 B
4 855.0 B
5 853.0 B
6 857.0 B
7 854.0 B
8 854.0 B
9 853.0 B
10 854.0 B

平均ファイルサイズ: 854.6 B
圧縮率: 0.834

ZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 1023.0 B
2 1023.0 B
3 1.0 KB(= 1024 B)
4 1.0 KB(= 1024 B)
5 1021.0 B
6 1023.0 B
7 1.0 KB(= 1024 B)
8 1022.0 B
9 1022.0 B
10 1.0 KB(= 1024 B)

平均ファイルサイズ: 1023.0 B
圧縮率: 0.999

Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 1.1KB(= 1126.4 B)
2 1.1KB(= 1126.4 B)
3 1.1KB(= 1126.4 B)
4 1.1KB(= 1126.4 B)
5 1.1KB(= 1126.4 B)
6 1.1KB(= 1126.4 B)
7 1.1KB(= 1126.4 B)
8 1.1KB(= 1126.4 B)
9 1.1KB(= 1126.4 B)
10 1.1KB(= 1126.4 B)

平均ファイルサイズ: 1126.4 B
圧縮率: 1.100

Hadoop互換Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 1.1KB(= 1126.4 B)
2 1.1KB(= 1126.4 B)
3 1.1KB(= 1126.4 B)
4 1.1KB(= 1126.4 B)
5 1.1KB(= 1126.4 B)
6 1.1KB(= 1126.4 B)
7 1.1KB(= 1126.4 B)
8 1.1KB(= 1126.4 B)
9 1.1KB(= 1126.4 B)
10 1.1KB(= 1126.4 B)

平均ファイルサイズ: 1126.4 B
圧縮率: 1.100

5KBの場合

5KBのデータを生成した場合、それぞれの圧縮形式において、S3バケットで確認できたファイルサイズと、その平均値は次のようになりました。

圧縮なし

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 5.0 KB
2 5.0 KB
3 5.0 KB
4 5.0 KB
5 5.0 KB
6 5.0 KB
7 5.0 KB
8 5.0 KB
9 5.0 KB
10 5.0 KB

平均ファイルサイズ: 5.0 KB = 5120.0 B

GZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 3.8 KB(= 3891.2 B)
2 3.8 KB(= 3891.2 B)
3 3.8 KB(= 3891.2 B)
4 3.8 KB(= 3891.2 B)
5 3.8 KB(= 3891.2 B)
6 3.8 KB(= 3891.2 B)
7 3.8 KB(= 3891.2 B)
8 3.8 KB(= 3891.2 B)
9 3.8 KB(= 3891.2 B)
10 3.8 KB(= 3891.2 B)

平均ファイルサイズ: 3.8 KB = 3891.2 B
圧縮率: 0.760

ZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 4.0 KB(= 4096 B)
2 4.0 KB(= 4096 B)
3 4.0 KB(= 4096 B)
4 4.0 KB(= 4096 B)
5 4.0 KB(= 4096 B)
6 4.0 KB(= 4096 B)
7 4.0 KB(= 4096 B)
8 4.0 KB(= 4096 B)
9 4.0 KB(= 4096 B)
10 4.0 KB(= 4096 B)

平均ファイルサイズ: 4.0 KB = 4096 B
圧縮率: 0.800

Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 5.1 KB(= 5222.4 B)
2 5.1 KB(= 5222.4 B)
3 5.1 KB(= 5222.4 B)
4 5.1 KB(= 5222.4 B)
5 5.1 KB(= 5222.4 B)
6 5.1 KB(= 5222.4 B)
7 5.1 KB(= 5222.4 B)
8 5.1 KB(= 5222.4 B)
9 5.1 KB(= 5222.4 B)
10 5.1 KB(= 5222.4 B)

平均ファイルサイズ: 5.1 KB = 5222.4 B
圧縮率: 1.020

Hadoop互換Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 5.1 KB(= 5222.4 B)
2 5.1 KB(= 5222.4 B)
3 5.1 KB(= 5222.4 B)
4 5.1 KB(= 5222.4 B)
5 5.1 KB(= 5222.4 B)
6 5.1 KB(= 5222.4 B)
7 5.1 KB(= 5222.4 B)
8 5.1 KB(= 5222.4 B)
9 5.1 KB(= 5222.4 B)
10 5.1 KB(= 5222.4 B)

平均ファイルサイズ: 5.1 KB = 5222.4 B
圧縮率: 1.020

10KBの場合

10KBのデータを生成した場合、それぞれの圧縮形式において、S3バケットで確認できたファイルサイズと、その平均値は次のようになりました。

圧縮なし

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 10.0 KB(= 10240 B)
2 10.0 KB(= 10240 B)
3 10.0 KB(= 10240 B)
4 10.0 KB(= 10240 B)
5 10.0 KB(= 10240 B)
6 10.0 KB(= 10240 B)
7 10.0 KB(= 10240 B)
8 10.0 KB(= 10240 B)
9 10.0 KB(= 10240 B)
10 10.0 KB(= 10240 B)

平均ファイルサイズ: 10.0 KB = 10240 B

GZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 7.6 KB(= 7782.4 B)
2 7.6 KB(= 7782.4 B)
3 7.6 KB(= 7782.4 B)
4 7.6 KB(= 7782.4 B)
5 7.6 KB(= 7782.4 B)
6 7.6 KB(= 7782.4 B)
7 7.6 KB(= 7782.4 B)
8 7.6 KB(= 7782.4 B)
9 7.6 KB(= 7782.4 B)
10 7.6 KB(= 7782.4 B)

平均ファイルサイズ: 7.6 KB = 7782.4 B
圧縮率: 0.760

ZIP

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 7.7 KB(= 7784.8 B)
2 7.7 KB(= 7784.8 B)
3 7.7 KB(= 7784.8 B)
4 7.7 KB(= 7784.8 B)
5 7.7 KB(= 7784.8 B)
6 7.7 KB(= 7784.8 B)
7 7.7 KB(= 7784.8 B)
8 7.7 KB(= 7784.8 B)
9 7.7 KB(= 7784.8 B)
10 7.7 KB(= 7784.8 B)

平均ファイルサイズ: 7.7 KB = 7784.8 B
圧縮率: 0.760

Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 10.1 KB(= 10342.4 B)
2 10.1 KB(= 10342.4 B)
3 10.1 KB(= 10342.4 B)
4 10.1 KB(= 10342.4 B)
5 10.1 KB(= 10342.4 B)
6 10.1 KB(= 10342.4 B)
7 10.1 KB(= 10342.4 B)
8 10.1 KB(= 10342.4 B)
9 10.1 KB(= 10342.4 B)
10 10.1 KB(= 10342.4 B)

平均ファイルサイズ: 10.1 KB = 10342.4 B
圧縮率: 1.010

Hadoop互換Snappy

S3コンソール上で確認したファイルサイズ
N回目に生成 ファイルサイズ
1 10.1 KB(= 10342.4 B)
2 10.1 KB(= 10342.4 B)
3 10.1 KB(= 10342.4 B)
4 10.1 KB(= 10342.4 B)
5 10.1 KB(= 10342.4 B)
6 10.1 KB(= 10342.4 B)
7 10.1 KB(= 10342.4 B)
8 10.1 KB(= 10342.4 B)
9 10.1 KB(= 10342.4 B)
10 10.1 KB(= 10342.4 B)

平均ファイルサイズ: 10.1 KB = 10342.4 B
圧縮率: 1.010

圧縮率まとめ

以上を踏まえて、各圧縮率は次のようになりました。

生成データサイズ 圧縮形式 圧縮率
1 KB GZIP 0.834
1 KB ZIP 0.999
1 KB Snappy 1.100
1 KB Hadoop互換Snappy 1.100
5 KB GZIP 0.760
5 KB ZIP 0.800
5 KB Snappy 1.020
5 KB Hadoop互換Snappy 1.020
10 KB GZIP 0.760
10 KB ZIP 0.760
10 KB Snappy 1.010
10 KB Hadoop互換Snappy 1.010

1 KB、5 KB、10 KBという特定のデータサイズにおいて、最も圧縮率の高かった圧縮形式はGZIPでした。次点で圧縮率の高かった圧縮形式はZIPでした。

Snappy・Hadoop互換Snappyの圧縮率が1を超える点については、圧縮対象のデータが最大10 KBと比較的小さいからだと考えられます。Snappyの技術的仕様をGitHubから読み取ったところ、Snappyストリーム(参考: snappy/format_description.txt)における非圧縮長のvarintや、Snappyフレーミング形式(参考: snappy/framing_format.txt)におけるストリーム識別子・チャンクヘッダーなど、圧縮されるデータのサイズに関わらず一定のバイト数をデータに付与するようです。もとのデータサイズが小さいほどこれらの全体に対するデータサイズの割合が大きくなり、圧縮率が1を超えるようになったと考えられます。(この辺り、専門外ですので間違い等あれば指摘いただきたいですm(_ _)m)

今回は比較的小さめのデータサイズに限って圧縮率を検証しましたが、よりデータ数を大きくすると圧縮率に違いが出るのか、別の機会に検証してみたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.