用物化视图提高CarbonData查询性能

举报
大数据修行者 发表于 2020/10/19 12:16:58 2020/10/19
【摘要】 物化视图是一个预计算数据集,是大数据系统中最重要的查询性能调优工具之一,它允许用户预先连接复杂的视图和预计算摘要,以获得快速的响应时间。在CarbonData中,实例化视图通过执行相关查询投影、筛选器以及聚合和连接等昂贵操作的预计算,有助于提高性能。利用Carbon表上的实例化视图,我们可以避免不必要的大表全表扫描,从而加快查询速度。 物化视图助力Apache ...

        物化视图是一个预计算数据集,是大数据系统中最重要的查询性能调优工具之一,它允许用户预先连接复杂的视图和预计算摘要,以获得快速的响应时间。在CarbonData中,实例化视图通过执行相关查询投影、筛选器以及聚合和连接等昂贵操作的预计算,有助于提高性能。利用Carbon表上的实例化视图,我们可以避免不必要的大表全表扫描,从而加快查询速度。

        物化视图助力Apache CarbonData实现以下特性:

  • Zero Maintenance:一旦加载基表,就会在后台重新计算物化视图。默认情况下,所有来自基表的增量数据更改都会自动添加到物化视图中。无需用户输入。

  • Smart Tuning:如果对源表的查询或部分查询可以通过查询物化视图来解析,CarbonData将重写(重新路由)查询,使物化视图获得更好的性能或效率。

        也可以使用时间序列查询创建物化视图,以生成按时间粒度聚合的时间序列数据,可以对这些数据进行分析,以便为业务做出更好的决策。时间序列数据可以是服务器指标、应用程序性能监控、天气预报数据、网络数据、传感器数据、事件、点击量、市场交易以及许多其他类型的分析数据。

        本博客探索了物化视图的内部原理,并演示如何预计算查询,CarbonData具有动态重写SQL来引用预计算的查询信息。

        Lazy or Non-Lazy MV

        物化视图在内部作为Carbon表进行管理。CarbonData支持用户手动或自动刷新来创建物化视图。

  • 自动刷新:创建没有延迟刷新的物化视图将由CarbonData自动管理。

  • 手动刷新:使用延迟刷新创建的物化视图要求用户执行命令刷新与事实表同步。在大表的情况下,这将帮助用户决定何时刷新物化视图,并可以节省事实表数据加载时间。

        可以在相同的表中创建多个实例化视图,服务不同的查询。

image001.png

在CarbonData中创建物化视图

        自动查询重写

        像Apache Spark这样的分析引擎允许用户轻松添加新的优化技术。Carbon MVRewriteRule被首批新增到Spark优化器中,对用户查询进行全部或部分重写。

image003.png

CarbonData查询流程

        通过应用一组模式提取,Spark优化的逻辑方案被转换为一个ModularPlan,这有助于更快的查询匹配。模式集包括选择、分组依据、联合和数据源。每个模式提取都使用模式匹配将一棵树转换为另一种树。

image005.png

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

 image006.png

逻辑方案与模块化方案

        在生成模块化方案后,对于每个可行的物化视图候选项,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个;

image008.png

  • 聚合查询:具有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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。