第 286 题:设计日志采集的压缩算法,列式存储与编码优化。
题目
设计日志采集的压缩算法,列式存储与编码优化。
完整讲解
一、日志采集与压缩需求
- 推荐与行为日志量大(点击、曝光、特征等),采集、传输与存储需压缩以省带宽与存储;同时要支持高效查询与解析。列式存储与编码优化是常用手段。
二、列式存储
- 行式 vs 列式:行式按「一条记录」连续存;列式按「一列」连续存。日志若按列存,同一列类型一致、取值往往有重复与局部性,便于列级压缩与只读部分列的查询。
- 应用:行为日志的 user_id、item_id、timestamp、feature_1, feature_2… 各为一列;分析时常按列聚合或过滤,列式可只读相关列,IO 与解压更省。
- 格式:Parquet、ORC 等为列式+编码;自研日志管线可先按行写 buffer,再按列批量编码与落盘。
三、编码优化
- 字典编码:高基数 id(如 item_id)建字典,存整数码代替长字符串,可再对整数做 delta、RLE 或 bit-packing。
- Delta / RLE:排序列(如时间戳、递增 id)存差值或游程,大幅降低熵;适合列式下按列编码。
- 通用压缩:列块或块内再用 Snappy、Zstd 等做通用压缩;先编码再压缩效果更好。
- 分层:热数据保留更多细节或不解压;冷数据高压缩、按需解压,平衡查询性能与成本。
四、设计要点
- 日志 schema 稳定、列类型明确便于选编码;采集端可做轻量预处理(去重、采样、预聚合)再压缩传输;存储与查询引擎(如 ClickHouse、Hive)与格式匹配。
面试要点
- 能说清列式存储对日志压缩与查询的好处(列级压缩、只读部分列)。
- 能列举编码方式:字典、delta、RLE、通用压缩;以及分层与采集端预处理。
记忆要点
- 日志压缩:列式存储+列级编码(字典、delta、RLE)+ 通用压缩;列式利于分析与省 IO。
- 编码选型依列类型与分布;冷热分层可进一步降成本。