Hologres 揭秘:高性能原生加速 MaxCompute 核心原理
Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓,这个云原生系统融合了实时服务和分析大数据的场景,全面兼容 PostgreSQL 协议并与大数据生态无缝打通,能用同一套数据架构同时支持实时写入实时查询以及实时离线联邦分析。它的出现简化了业务的架构,与此同时为业务提供实时决策的能力,让大数据发挥出更大的商业价值。从阿里集团诞生到云上商业化,随着业务的发展和技术的演进,Hologres 也在持续不断优化核心技术竞争力,为了让大家更加了解 Hologres,我们计划持续推出 Hologres 底层技术原理揭秘系列,从高性能存储引擎到高效率查询引擎,高吞吐写入到高 QPS 查询等,全方位解读 Hologres,请持续关注!
本期我们将带来 Hologres 高性能原生加速查询 MaxCompute 的技术原理解析。
随着数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(TB、PB、EB)级别,MaxCompute(原名 ODPS)也因此应运而生,致力于批量结构化数据的存储和计算,提供海量数据仓库的解决方案及分析建模服务,是一种快速、完全托管的 EB 级数据仓库解决方案。
Hologres 在离线大数据场景上与 MaxCompute 天然无缝融合,无需数据导入导出就能实现加速查询 MaxCompute,全兼容访问各种 MaxCompute 文件格式,实现对 PB 级离线数据的毫秒级交互式分析。而这一切的背后,都离不开 Hologres 背后的执行器 SQE(S Query Engine),通过 SQE 实现对 MaxCompute 的 Native 访问,然后再结合 Hologres高性能分布式执行引擎HQE的处理,达到极致性能。
Hologres 加速查询 MaxCompute 主要有以下几个优势:
高性能:可以直接对 MaxCompute 数据加速查询,具有亚秒级响应的查询性能,在 OLAP 场景可以直接即席查询,满足绝大多数报表等分析场景。
低成本:MaxCompute 经过数年的发展,用户在 MaxCompute 上存储了大量数据,不需要冗余一份存储可直接进行访问;另一方面用户可以只需将部分高性能场景的数据迁移到 SSD 上,报表等分析场景的数据可以存储在 MaxCompute 进一步降低成本。
更高效:实现对 MaxCompute 的 Native 访问,无需迁移和导入数据,就可以高性能和全兼容的访问各种 MaxCompute 文件格式,以及 Hash/Range Clustered Table 等复杂表,降低用户的使用成本。
SQE 架构介绍
如上图所示是 SQE 的整体架构,可以看出整个架构也是非常简单。MaxCompute 的数据统一存储在 Pangu,当 Hologres 执行一条 Query 去加速查询 MaxCompute 的数据时,在 Hologres 端:
Hologres Frontend 通过 RPC 向 SQE Master 请求获取 Meta 等相关信息。
Hologres Blackhole 通过 RPC 向 SQE Executor 请求获取具体的数据相关信息。
SQE 由两种角色的进程组成:
SQE Master 负责处理 Meta 相关的请求,主要负责获取表、分区元数据、鉴权以及文件分片等功能。
SQE Executor 作为 SQE 的核心,负责具体读取数据请求,涉及 Block Cache、预读取、UDF 处理、表达式下推处理、索引处理、Metric、Meter 等等功能。
MaxCompute 外表引擎核心技术创新
基于 SQE 的架构,能做到对 MaxCompute 的数据高性能加速查询,主要是基于以下技术创新优势:
1)抽象分布式外表
结合 MaxCompute 的分布式特性,Hologres 抽象了一个分布式的外表,来支持访问 MaxCompute 分布式数据。目前可支持访问跨集群的 MaxCompute 分布式盘古文件,并按 MaxCompute 计算集群就近读取。
2)和 MaxCompute Meta 无缝互通,支持带版本的元数据缓存
SQE 和 MaxCompute 的 Meta 无缝互通,可以做到 Meta 和 Data 实时获取,支持通过 Import Foreign Schema 命令,自动同步 MaxCompute 的元数据到 Hologres 的外表,实现外表的自动创建,结构自动更新。
3)支持 UDF/表达式下推
SQE 通过支持 UDF/表达式下推,来实现用户自定义的 UDF 计算;将表达式下推可以减少无用的数据传输带来的开销,进一步提升性能。
4)异步 ORC Reader,异步 prefetch
目前 MaxCompute 大部分数据为 ORC 格式,在 Hologres V0.10 及以上版本,Hologres 更新了执行引擎,使用异步 Reader 进行更高效的异步读取,还支持异步 prefetch,进一步降低读取延迟;此外 Hologres 支持了 IO 合并、LazyRead、Lazy Decoding 等一些列的优化技术手段,来降低在 IO 在整个查询上的延迟,以带来极致性能。
5)支持 Block Cache
为了避免每次读数据都用 IO 到文件中取,SQE 同样使用 BlockCache 把常用和最近用的数据放在内存中,减少不必要的 IO,加快读的性能。在同一个节点内,通过一致性 Hash 实现将相同访问的数据共享一个 Block Cache。 比如在 Scan 场景可带来 2 倍以上的性能提升,大大提升查询性能。
6)常驻进程,减少调度开销
传统的进程模型等架构需要动态实时的创建进程等调度操作,带来了较大的调度开销。SQE 采用常驻进程模式,避免不必要的调度开销,此外还可以大大提升 Block Cache 的命中率和有效使用率。
7)Network Shuffle,减少落盘开销
Network Shuffle 需要提供一种快速且稳定的容错机制。由于 Network Shuffle 必须保证发送端和接收端进程同时 alive 才能完成数据 shuffle。同样的,如果采用传统落盘的方式来进行 Network Shuffle 的 Retry,虽然能够保证稳定性,但是可能会在 Retry 过程中由于磁盘 IO 引入比较大的性能 overhead。为了解决这个问题,我们优化了分阶段调度来解决快速稳定的容错问题。
MaxCompute 外表引擎升级到 HQE
上面提到了我们通过 SQE 进行加速查询 MaxCompute 外表,通过 SQE 查询时性能可以做到很好,但是和 Hologres 交互时中间会有一层 RPC 交互,在数据量较大时网络会存在一定瓶颈。
因此我们基于 Hologres 已有的能力,在 Hologres V0.10 及以上版本我们对执行引擎进行了优化,支持 Hologres HQE 查询引擎直读 MaxCompute 表,在性能上得到进一步的提升,较 SQE 方式读取有 30%以上的性能提升。
这主要得益于以下几个方面:
1) 节省了 SQE 和 Hologres 中间 RPC 的交互,相当于节省一次数据的序列化和反序列化,在性能上得到进一步的提升。
2) 可以复用 Hologres 的 Block Cache,这样第二次查询时无需访问存储,避免存储 IO,直接从内存访问数据,更好的加速查询。
3) 可以复用已有的 Filter 下推能力,减少需要处理的数据量。
4) 在底层的 IO 层实现了预读和 Cache,更进一步加速 Scan 时的性能。
以下是某客户某实际在线业务查询的性能数据:
执行 817 个 SQL,总体性能提升 70%,其中长 Query 提升 80%以上。
说明:该优化目前已在 Hologres V0.10 上线,欢迎点击查看文档使用。
MaxCompute 加速场景选择
在 Hologres 中加速查询 MaxCompute 有两种方式:
1)创建外表(数据还是存储在 MaxCompute 中),性能相比在 MaxCompute 中查询会有 2-5 倍的提升
2)导入内表,性能相比外表约有 10-100 倍的提升
创建外表的方式其原理就是 PostgreSQL 中的 Foreign Data Wrappers,通过外部访问接口,来访问存储在外部的数据。建议您使用更方便的 IMPORT FOREIGN SCHEMA 方式来创建外表,可以更好的简化元数据的同步,无需关注字段类型映射等。
直接建外表并的方式实际上是利用查询引擎的优化能力来提高效率的,但是没有利用到 Hologres 的索引能力。所以当把外表导到内表的时候,可以根据查询的方式指定内表的索引结构,通过这些索引能力带来更高的查询性能。这就是外表导入内表,内表的性能更好的原因,可以充分发挥数仓的索引优化能力。
目前这两种方式主要对比如下:
从上面对比可以看出:
如果您是数据量很大、对性能有很高的要求时(比如 100ms 内等),对查询延迟敏感,对查询有 SLA 要求时,建议您将数据导入 Hologres 内表,进行查询访问。
如果是临时性的探索性分析,或者对延迟不敏感的内部业务,可以使用 MaxCompute 外表方式,减少数据移动。
除上述场景外,您可以根据具体业务情况选择合适的使用场景。
MaxCompute 与 Hologres 的组合关系
上面介绍了很多 Hologres 外表查询引擎如何加速查询 MaxCompute 的场景,但并不是说所有类型的查询都适合在 Hologres 的外表引擎上执行。
Hologres 是针对交互式分析场景设计的同步的查询引擎,面向的是大数据进,小数据出的场景,典型用在 Serving 和 Analytics 的场景。而 MaxCompute 是针对海量数据加工处理处理场景设计的异步的数据加工引擎,面向的是大数据进,大数据出的场景,典型用在 ETL 的场景。在 ETL 的场景,作业异步提交,IO 接口针对 Scan 优化,计算过程需要节点的冗余设计支撑高可用,需要计算状态落盘从而可以在失败时自动重试,而这些都是 Hologres 不具备的能力。因此 MaxCompute+Hologres 组合在一起,形成了数据加工+服务的一站式体验,减少了数据的隔离和冗余,可以为大数据数仓提供合理的解决方案架构,支撑实时离线一体化的开发体验。
总结
Hologres 通过 SQE 与 MaxCompute 深度整合,充分利用 Hologres 和 MaxCompute 的优势,以极致性能为目标,直接就能加速查询 MaxCompute 数据,让用户更方便高效的进行交互式分析,同时也降低了极大的分析成本,实现离线数仓服务一体化。
作者简介:王奇(花名慧青),阿里巴巴技术专家,现从事交互式分析引擎 Hologres 研发工作。
评论