用物化视图提高CarbonData查询性能
物化视图是一个预计算数据集,是大数据系统中最重要的查询性能调优工具之一,它允许用户预先连接复杂的视图和预计算摘要,以获得快速的响应时间。在CarbonData中,实例化视图通过执行相关查询投影、筛选器以及聚合和连接等昂贵操作的预计算,有助于提高性能。利用Carbon表上的实例化视图,我们可以避免不必要的大表全表扫描,从而加快查询速度。
物化视图助力Apache CarbonData实现以下特性:
Zero Maintenance:一旦加载基表,就会在后台重新计算物化视图。默认情况下,所有来自基表的增量数据更改都会自动添加到物化视图中。无需用户输入。
Smart Tuning:如果对源表的查询或部分查询可以通过查询物化视图来解析,CarbonData将重写(重新路由)查询,使物化视图获得更好的性能或效率。
也可以使用时间序列查询创建物化视图,以生成按时间粒度聚合的时间序列数据,可以对这些数据进行分析,以便为业务做出更好的决策。时间序列数据可以是服务器指标、应用程序性能监控、天气预报数据、网络数据、传感器数据、事件、点击量、市场交易以及许多其他类型的分析数据。
本博客探索了物化视图的内部原理,并演示如何预计算查询,CarbonData具有动态重写SQL来引用预计算的查询信息。
Lazy or Non-Lazy MV
物化视图在内部作为Carbon表进行管理。CarbonData支持用户手动或自动刷新来创建物化视图。
自动刷新:创建没有延迟刷新的物化视图将由CarbonData自动管理。
手动刷新:使用延迟刷新创建的物化视图要求用户执行命令刷新与事实表同步。在大表的情况下,这将帮助用户决定何时刷新物化视图,并可以节省事实表数据加载时间。
可以在相同的表中创建多个实例化视图,服务不同的查询。
在CarbonData中创建物化视图
自动查询重写
像Apache Spark这样的分析引擎允许用户轻松添加新的优化技术。Carbon MVRewriteRule被首批新增到Spark优化器中,对用户查询进行全部或部分重写。
CarbonData查询流程
通过应用一组模式提取,Spark优化的逻辑方案被转换为一个ModularPlan,这有助于更快的查询匹配。模式集包括选择、分组依据、联合和数据源。每个模式提取都使用模式匹配将一棵树转换为另一种树。
MV rewrite flow
在创建物化视图时,CarbonData会将对应的物化视图注册到内存目录中,这些目录将在以后的实际查询中被收集起来进行查询匹配。
为什么CarbonData使用Modular Plan而不是Logical Plan进行查询匹配?
基于规则的重写,模块化方案有助于更快的查询匹配和重写。由于模块化方案仅由四种模式组成,如前所述,比较模块化方案比逻辑方案要快。
例如,请考虑以下两个表:
Trans(tid, fpgid, flid, date, faid, price, qty, disc)
Loc(lid, city, state, country)
请考虑以下查询以进行重写和匹配
select flid, year(date) as year, count(*) as cnt
from Trans, Loc
where flid=lid and country = ‘USA’
group by flid, year(date)
having count(*) > 100
逻辑方案与模块化方案
在生成模块化方案后,对于每个可行的物化视图候选项,CarbonData将生成物化视图候选项的模块化方案,并与用户模块化方案进行自下而上的比较。对于第一个匹配的候选项,CarbonData将生成一个重写方案,以根据物化视图而不是事实表进行查询。
具有物化视图的时间序列
CarbonData提供了一个内置的时间序列UDF与物化视图,以生成按时间粒度聚合的时间序列数据。支持的时间层次和级别:年、月、周、日、小时、30分钟、15分钟、10分钟、5分钟、分、秒。
使用示例:
创建基表“sales”
sql> CREATE TABLE sales (order_time timestamp,user_id string,sex string,country string,quantity int,price bigint) STORED AS carbondata
如果用户希望每分钟获取“price”的聚合数据,那么他/她可以创建一个具有时间序列UDF的物化视图,如下所示
sql> CREATE MATERIALIZED VIEW agg_sales as
SELECT timeseries(order_time, ‘minute’),avg(price)
FROM sales
GROUP BY timeseries(order_time, ‘minute’)
并执行下面的查询以检查时序数据。
sql> SELECT timeseries(order_time,’minute’),avg(price)
FROM sales
GROUP BY timeseries(order_time, ‘minute’)
物化视图的性能与事实表相比
一张图片能说明千言万语,所以这里是一个图表,显示了我用Carbon和2.0版物化视图表进行的性能比较。
我已经在3节点spark集群上与CarbonExtensions进行了比较。本次测试使用的表为88列,原始数据15G,总记录数260万。
Carbon Data版本:Apache CarbonData 2.0.1
Spark版本:Apache Spark 2.4.5
Spark集群配置:驱动内存 2GB, Executor内存3GB, Executor实例12个,Executor核数1个;
聚合查询:具有sum和average函数以及按列分组
TimeSeries查询:按月聚合的时间戳列上的Timeseries
对于聚合查询,实例化视图的性能比事实表快60%。
有用提示
用户可以为经常在事实表上执行的查询创建物化视图。
由于CarbonData在内部将物化视图维护为Carbon表,因此用户可以在创建物化视图时提供表属性,对物化视图进行调优以获得更好的性能。
也可以在分区表上创建物化视图,分区表根据列对物化视图进行分区。
MV时序查询可以从现有的物化视图中汇总,从而提高查询性能。
参考信息
http://carbondata.apache.org/
https://github.com/apache/carbondata/blob/master/docs/mv-guide.md
翻译自 https://medium.com/@indhumathi.muthu.murugesh/boosting-carbondata-query-performance-with-materialized-views-823d3b85764b
- 点赞
- 收藏
- 关注作者
评论(0)