背景
公司 hive数仓全面迁移到 iceberg后,发现存储空间比 hive 要大,并且文件格式都是 parquet
分析
iceberg存储空间比 hive 表大,最主要的原因是因为压缩算法不一样,然后也发现 iceberg 的 z-order 对存储空间有显著的降低
测试
数据大小 | 场景 | 序号 |
---|---|---|
784G | 不压缩,不排序 | 0 |
613G | 不压缩,全局排序 | 1 |
157G | zstd压缩,不排序 | 2 |
149G | zstd压缩,局部排序( sort by ) | 3 |
34G | zstd压缩,全局排序 | 4 |
35G | 针对上一个测试(34G 那个),应用 iceberg 的 bin pack | 5 |
38G | 针对上一个测试(34G 那个),应用 iceberg 的 z-order | 6 |
结论
- 通过 0 和 1 对比以及Parquet 文件是如何编写的——行组、页面、所需内存和刷新操作
我们可以知道排序,对于存储的影响还是挺大的,大约可以节省 171G,22%的存储空间 - 通过 0 和 2 对比,可以知道 压缩 对于存储空间的节省是立竿见影的,大约可以节省 627G,80%的存储空间
- 通过 2,3,4 对比,可以知道全局排序对于节省存储空间也是立竿见影的,大约可以节省 123G,78%
进一步探究
-
为什么压缩可以减少存储空间
压缩可以节省空间,因为它可以通过减少文件中的冗余信息来缩小文件的大小。在压缩文件时,压缩算法会查找文件中的重复数据,并使用更简短的代码来代替这些重复数据。这样,文件中的数据量就会减少,从而减小文件的大小。 -
为什么排序可以减少存储空间
因为排序可以将相似的值放在一起,从而提供压缩效率( 因为压缩算法通常使用重复数据的概念来压缩数据,可以参考 霍夫曼编码 )
排序可以减少字典编码的大小,因为它可以使相似的值具有相同的前缀,从而使字典编码可以使用更短的前缀来表示它们。 -
zstd是 基于哈夫曼编码和字典压缩的思想的 FSE 算法
更进一步
在有压缩的前提下,排序一定会让存储空间降低吗?
不一定,因为要想通过排序让存储空间降低,则必须将相似的值放在一起,如果数据在排序键上没有很好的分布,那么排序可能会增加文件大小,反之则可以降低文件大小
网友评论