Parquet 校验和 (Checksumming)
在 Parquet 中,各种类型的页面(Pages)都可以单独进行校验和计算。这种机制允许在 HDFS 文件层面禁用校验和,以更好地支持单行查找(single row lookups)。
校验和的计算使用标准的 CRC32 算法(与 GZip 等工具使用的算法相同),其计算对象是页面的序列化二进制表示,但不包括页面头(page header)本身。
最佳实践
1. 何时启用或禁用校验和
-
启用校验和
- 如果需要数据完整性验证,建议在存储或传输时启用校验和,以防数据损坏或意外修改。
- 在分布式计算环境(如 Apache Spark 或 Hadoop)中处理大规模数据时,校验和可以提供额外的数据一致性保障。
-
禁用校验和
- 在 HDFS 级别已启用校验和时,Parquet 层可以考虑禁用它,以减少计算开销。
- 当主要使用 Parquet 进行单行查询(Single Row Lookup)时,禁用校验和可以提升查询性能,减少 I/O 和 CPU 负担。
2. 性能优化
- 使用 Snappy 或 ZSTD 等轻量级压缩格式,以减少存储空间并加快读取速度,避免额外的 CRC32 计算开销。
- 适当调整 Row Group 大小,使其与 HDFS Block Size 保持一致,以减少不必要的校验和计算,提高扫描效率。
3. 数据完整性检查
- 若启用了 Parquet 校验和,可以定期使用
parquet-tools
进行数据完整性验证:sh parquet-tools validate <file.parquet>
- 如果发现校验和错误,可以使用数据回滚机制(如 HDFS 快照)恢复数据。
通过合理配置校验和策略,可以在 数据完整性 和 查询性能 之间找到最佳平衡点,从而更高效地使用 Parquet 格式存储和查询数据。