知识卡片

列式存储的真实收益案例:性能提升取决于作业实际需要的数据列数

普通读书笔记卡

内容

某音乐公司集群里离线批处理作业经常出现计算延时,排查后发现根源是行为数据字段内容多、但一直采用文本格式存储在Hive里——文本格式存储的磁盘开销大、数据解析开销也大。重构过程中团队果断把存储格式切换成列式存储(考虑到集群大部分作业仍在Hive上执行、需要照顾兼容性,选择了ORCFile作为临时过渡方案,Parquet被定为最终目标方案)。用18.34GB数据、5个维度做的性能测试给出了明确的量化结果:存储资源节省15%,计算资源节省67%——计算资源的节省幅度远超存储资源,这个结果和集群作业延时的真实根因(计算资源不足)高度吻合,所以把行为数据模型的存储格式全面替换成ORCFile之后,大部分作业的执行效果都令人满意,有些作业的执行时间从3小时直接缩短到20分钟。团队从这次实践里提炼出一条重要结论:列式存储的执行性能好坏,取决于一次作业实际需要读取的数据列数——列式存储的核心优势正是允许查询只读取真正用到的那几列,而不必像行式存储那样每次都要把整行数据(包括当前查询根本用不到的字段)一起读出来,一次作业需要用到的列数越少(相对于表的总列数),列式存储能省下的I/O和解析开销就越显著;反过来,如果一个作业几乎要用到表里的所有列,列式存储相对行式存储的优势就会大幅缩水。这个案例给出的实用启示是:评估要不要引入列式存储这类专门优化的存储格式,不能只看”数据量大不大”,而要具体审视自己真实的查询/作业模式——如果大部分作业只需要读取表里一小部分列(这在宽表、字段众多的行为数据场景里很常见),列式存储的收益会非常可观;如果查询模式本身就经常需要读取几乎所有列,这项改造带来的收益就要重新评估。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.1 某音乐公司的大数据实践"节,"6.1.3 在大数据平台重构过程中踩过的坑"(源文件:_epub-src/OEBPS/Text/Chapter6_1_4.xhtml) - 结论依据:原文说明"拿18.34G数据,以5维度为例做性能测试……这样可以得出结论:存储资源节省15%,计算资源节省67%……有些作业的执行时间由之前的3个小时缩短到20分钟。说明在列式存储中,执行性能的好坏取决于作业的需要数据列数",直接支撑本卡片结论。 - 原始内容:这样可以得出结论:存储资源节省15%,计算资源节省67%……有些作业的执行时间由之前的3个小时缩短到20分钟。说明在列式存储中,执行性能的好坏取决于作业的需要数据列数。