Amazon Data FirehoseからAmazon S3バケットへ保存したファイルの圧縮率を比較してみた
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)バケットに保存されます。
上記の構成は、AWS Serverless Application Model(以下、SAM)で組んでいます。GitHubリポジトリを載せておきますので、コードなど参考にしていただけると幸いです。
ファイルの容量はS3バケットのコンソール画面から確認できますので、今回はS3バケットコンソール画面から確認したファイルサイズをもとに、圧縮率を計算していきます。
検証
今回は、Lambda関数に生成させるデータを1KB、5KB、10KBの3パターン試します。
また、それぞれのパターンで10回生成した 平均値 を、代表のファイルサイズ とします。
圧縮率の計算式は次の通りです。
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)
今回は比較的小さめのデータサイズに限って圧縮率を検証しましたが、よりデータ数を大きくすると圧縮率に違いが出るのか、別の機会に検証してみたいと思います。