1. 背景介绍
表格存储(TableStore)的数据表是一种典型的 NoSQL 数据结构,可以高效地支持大规模数据的存储和读写需求。表格存储的多元索引提供了 Search 接口, 它支持所有的查询功能,以及排序、统计聚合等分析能力。并且,执行结果也会按照指定的顺序返回。但是,在很多情况下我们更关心的是查询性能,希望将命中的全部数据能以更快的速度返回,而不关心整个结果集的顺序。因此,DLA 接入了 TableStore 的 ParallelScan 接口,以提高数据查询速度。
2. 并发导出数据(ParallelScan)简介
多元索引提供了通用的查询接口(Search)和并发导出接口(ParallelScan)。这两个接口的功能基本上是相同的,但是 ParallelScan 接口为了提高某些方面的性能和吞吐能力舍弃了部分功能。相对于 Search 接口,ParallelScan 主要有以下一些特点:
- 1.结果稳定
ParallelScan 任务是有状态的,在一个 Session 请求中获取到的结果是确定的。其执行结果由第一次发起请求时的数据状态所决定,如果在任务执行过程中插入了新的数据或者修改了原有的数据不会对任务查询结果造成影响。
- 2.新增会话(Session)概念
引入会话概念,使用 SessionID 来保证查询的结果集是稳定的。每次任务执行前首先需要通过 computeSplits 接口获取 sessionID 和最大并发数。然后发起多个 ParallelScan 请求读取数据,同时在请求中指定当前的 sessionID 和并发 ID。
- 3.最大并发数
ParallelScan 支持的单请求的最大并发数由 computeSplits 接口返回,数据越多,支持的并发数就越大。
- 4.性能
ParallelScan 接口单并发扫描数据的性能有很大提升。当增加并发数时,性能可以继续提高(调整并发数需要咨询表格存储的同学)。
- 5.成本
ParallelScan 接口请求消耗的资源更少,因此其价格也更便宜。所以,对于大数据量的导出需求,建议使用 ParallelScan 功能。
- 6.查询列限制
ParallelScan 只支持查询多元索引中已建立的索引列,不能查询多元索引中没有的列,即一条 SQL 语句只能 SELECT 多元索引中的列。
3.测试分析
3.1 测试环境
我们使用 DLA CU 版快速搭建一个 Presto 集群,其配置信息如下:
- Worker 数量 5 个
- Worker 规格 4 Core 8G
3.2 测试数据集
TPC-H 是美国交易处理效能委员会(TPC,Transaction Processing Performance Council) 组织制定的用来模拟决策支持类应用的一个测试集。因此,我们将表格存储中的 TPC-H 数据集导入到 DLA 数据湖中进行分析处理。其中,表 lineitem
约 200G 数据,有 6 亿行数据。前面提到 ParallelScan API 只能查询多元索引中的数据,所以我们需要先创建一个多元索引,将需要的字段添加到索引中。
3.3 测试分析
我们在测试环境下对表 lineitem
执行以下 SQL 进行查询数据,其中 KEY
随着查询数据量而不断变化
select L_PARTKEY from ots_db.lineitem where L_PARTKEY < KEY
从下图可以清晰地看到,使用 ParallelScan API 的查询性能是非常好的。随着查询数据量的逐渐增加,使用 Search API 查询的耗时剧烈增加,这是由其底层设计所造成,导出的数据越多就会变得越慢。索引查询(Search 接口)的耗时增加非常明显。而 ParallelScan 接口的耗时则一直比较低,并且随着导出数据量的不变增大其性能优势也更加突出。
相对于普通查询,ParallelScan API 的优势也是比较明显的。从下面这张图可以看出,同等条件下普通查询的耗时要远大于 ParallelScan API 的查询。细心的读者可能会发现普通查询的性能比较“稳定”,这是由于普通查询每次都会扫描全量的表数据,所以无论我们导出多少数据其耗时都是基本上相等的。
4.DLA ParallelScan 的使用及注意事项
在 DLA 中使用ParallelScan 也是非常简单的,只需要在执行 SQL 时添加 ots-index-parallel-scan-mode=true
Hint 即可, 如:
/*+ots-index-parallel-scan-mode=true*/select count(L_PARTKEY) from YOUR_TABLE where L_PARTKEY < 10000
注意:
- 1.ParallelScan 只能查询多元索引中存在的字段
- 2.ParallelScan 在导出数据量较大时效果比较明显
- 3.ParallelScan 默认情况下查询出来的数据是无序的
- 4.默认情况下不会使用 ParallelScan 模式,需要通过 Hint 来启用
5.小结
通过以上说明和实验,本文介绍了 DLA 查询表格存储的方式,并进行了性能分析和对比。 Search 接口可以快速扫描多元索引的少量数据,而 ParallelScan 比较适用于扫描多元索引的大量数据集。
关于我们
数据湖分析Data Lake Analytics简介
欢迎大家使用云原生数据湖分析(DLA),DLA不仅仅便宜,且快,且方便,专为阿里云数据湖分析方案而生
- 支持自建、托管RDS、NoSQL、OSS(JSON、CSV、Parquet等格式)多种数据源分析
- 支持按量 按照扫描量 的计费方式,准入门槛0元,提供的Serverless的弹性服务为按需收费,不需要购买固定的资源,完全契合业务潮汐带来的资源波动,满足弹性的分析需求,同时极大地降低了运维成本和使用成本
- 平台底层托管大集群且自动弹性,在一定数据量情况下,分析性能比自建小集群高出400%
- 支持一键 把 MySQL、PG、SqlServer、PolarDb数据库 拖到DLA,再分析,解决原MySQL不敢分析的问题。 DLA 分析性能TPC-H 10G情况 比原MySQL 8c16g 等高出10倍,数据量越大,MySQL性能越差,在1TB数据量下,原MySQL基本跑不出来
产品文档:https://www.aliyun.com/product/datalakeanalytics
帮助文档:https://help.aliyun.com/document_detail/70378.html
MySQL&PG&SqlServer一键同步数据到DLA:https://help.aliyun.com/document_detail/126559.html
新客户1元试用:https://common-buy.aliyun.com/?commodityCode=openanalytics_post
欢迎大家进群咨询了解