网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的 PASS 服务。在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云与大家分享一下 PowerDrill 论文读书笔记
PowerDill 是 Google 内部的一款 BI 产品, 支持交互式 OLAP 查询, 根据 google 论文数据 powerdrill 性能惊人, 30~40 秒内能够处理近 8000 亿行数据。 Powerdrill 的超强处理能力得益于 Google 自研的列存引擎, 号称性能是普通列存的 10~100 倍。
PowerDrill 列存引擎的主要特点:
• 列存储。 与 MonetDB, Vetica 等数据库类似, 按照列组织数据库。 查询只需读取所需的列, 且超强存储压缩能力强是列存的两大优势。 正因为数据量较小, 列存广泛采用全表扫表技术进行查询, 较好地支持了无法事先建索引的 adhoc 类查询。
• 分区。 按照多个列将表分区成差不多大小的 Chunk , 查询时可检测 Chunk 是否符合查询条件, 跳过不必要 chunk 。 由于分区策略和查询性能相关性比较大, 事先考虑好查询模式,根据查询模式进行分区, 才能获得较大优化。
• 双字典编码。 双字典方式编码如上图所示, 表范围对列值全局编号, chunk 范围对列值重新本地编号, 记录全局编号和 chunk 内本地编号的映射关系到全局字典。 这种编码压缩率较高, 编码后的数据量相当于普通列存压缩后的数据量。 双字典编码采用连续的整数编码列植, 单列 group by 查询时可采用数组替代哈希表存储中间结果, 性能提升较大, 这也是双字典编码的另外一个好处。
• 数据压缩,双字典编码之后, chunk 中包含大量数值相近的正数,可压缩性仍然比较高。 PowerDrill 采用的压缩技术主要有: trie 压缩全局字典, snappy 压缩, 用更短的位来编码列值等。 双字典编码搭配上这些压缩算法, 数据压缩比能做到 50 倍。
• 内存处理。在普通列存储数据库中, 扫描磁盘代价与查询执行代价相近, 所以采用磁盘扫描技术。 与它们不同, PowerDrill 查询处理相比磁盘扫描更快, 所以尽量把数据 Cache 到内存, 用内存处理, 否则会被磁盘性能拖累。
与 Google 自家的 Dremel 类似, PowerDrilll 采用树状查询执行方式, 查询尽量下推到存储( leaf node )上去执行, leaf node 查询结果交给中间节点汇总, 中间节点再汇总到根节点, 根节点计算最终查询结果。 PowerDilll 界面的典型操作触发 20 条 SQL , 1000 台服务器(共计 4T 内存的)集群中, 这些 SQL 在 30~40 秒内完成, 处理近 8000 亿行数据, 平均每个 SQL 查询 2s , 这比 Dremel 还要快 1 个数量级。
可能的缺点:
• 双字典编码需要做 load 操作。 双字典编码需要全局编码, 所以需要针对全量数据预处理, load 到数据库, 数据导入的代价比较高,数据实时性较差。
• 占资源较多。 Powerdrill 需要大量的内存做计算, 成本较大, 当然 powerdrill 磁盘处理也不会慢, 只是会被磁盘拖累,性能优势损失很多。
• 复杂查询性能未知。 轮文中只是以 3 个单列 group by 查询作为例子, 没有提到 join 等复杂查询, 复杂场景下性能未知。