热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

查询优化_Spark查询优化之谓词下推

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spark查询优化之谓词下推相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spark查询优化之谓词下推相关的知识,希望对你有一定的参考价值。
















01












查询下推的意义





























下推是查询改写的一项重要优化。查询下推不仅可以降低数据的IO,而且能够节省内存,减少CPU的计算量等,特别是对于分布式的数据处理情境中,查询下推能够对查询性能有一个显著的提升。


查询下推可以从两个两个方面来理解:从逻辑优化的角度来看,查询下推属于是将逻辑查询树中的一些节点下推到叶子结点或接近叶子结点,即更接近数据源的地方,从而使得上层节点的操作所涉及到的数据量大大减少,提高数据处理效率,如图1所示为一个简单的条件下推;



Spark查询优化之谓词下推




图1 条件下推





从物理计划执行的角度来看,查询下推是将查询的条件下推到数据源,让数据源直接过滤掉与查询结果无关的数据,从而降低数据IO,提高数据的传输和处理效率;如图2所示



Spark查询优化之谓词下推




图2 投影和条件下推






Spark查询优化之谓词下推















02












查询下推的分类
































下推主要有一下四种:投影下推,条件下推,聚合下推和order by/limit类下推。


投影下推:投影下推即列裁剪,通过将需要的列下推到数据源,这样可以使数据源只返回所需要的列数据给查询引擎,这样可以大大减小数据的传输IO,尤其是对于列存数据源,可以极大的提高查询速率;


条件下推:条件下推即将过滤条件下推到数据源,数据源先进行预过滤,将复合条件的数据返回给查询引擎;


聚合下推:聚合下推是将聚合函数Count,Max,Min,Sum,avg进习惯下推给数据源,利用数据源自己本身的聚合功能进行聚合求值,将求值结果返回给查询引擎,可以极大的减小数据传输开销,同时可以大大节省内存的使用;


OrderBy,Limit下推:这两个下推的意义与上述类似,对于这两个谓词下推到数据源,使数据源在进行数据返回的时候,返回一系列有序的元组或者是所要求的前几条元组,这样便可以节省查询引擎进行复杂的排序开销以及获取不必要的数据量。


当前的一些大数据处理引擎如Hadoop,SparkSQL,Impala,Presto等都支持条件和投影(剪枝)下推。



Spark查询优化之谓词下推














03












查询下推初探





























上述讲到,主流的计算引擎大都只支持到条件下推和投影下推,由于聚合下推比较复杂,而且不同场景的需求程度也各不相同,甚至还需要数据源具有优秀的聚合能力,因此聚合下推并没有被通用的实现在各个存储引擎中。


    但有时候,如果一些业务场景涉及较多的简单查询和聚合计算,而且底层数据源用的时候分布式的具有聚合能力的系统,那么进行聚合下推将会大大减少计算引擎与数据源之间的数据IO,从而对查询性能有很大的帮助。


下面以SparkSQL为例,介绍聚合下推的实现方法。


具体实现



Spark查询优化之谓词下推





图3


图3是一个Spark SQL进行SQL语句从解析到查询的完整流程,想要进行聚合谓词的下推,就是在Optimized Logical Plan转为Physical Plan的过程中,修改转换策略,使得生成的物理计划能够将聚合谓词和数据扫描(获取)合并;


例如:示例sql语句:select count(*) from info where fuin > 100174;


聚合下推前的Physical Plan



Spark查询优化之谓词下推




聚合下推后的Physical Plan




Spark查询优化之谓词下推








Spark查询优化之谓词下推














04












实现方案






























在Spark SQL中,优化后的逻辑计划转化为物理计划的时候,会在Spark Planner中应用一些列的策略,如下:



Spark查询优化之谓词下推





通过应用各种策略,从而一步步将逻辑计划转换成物理计划;


因此,如果要想进行聚合下推,就可以在进行聚合的策略中进行修改以改变最后生成的物理执行计划;


具体的修改方案的如下:



Spark查询优化之谓词下推





· 在Aggregate策略进行应用的时候,通过条件判断来开启一个新的分支:如果我们在进行查询的时候,设置了开启查询下推的功能,则在这里进行判断后则会进入一个新的分支AggPushDownUtils,该分支的作用是进行数据扫描和初步聚合的结合,即将聚合函数下推到数据源,直接返回聚合结果;


· AggPushDownUtils在PhysicalOperation进行了聚合和数据读取两方面的物理计划


·当最后执行到数据读取的时候,则会调用JDBCRelation和JDBCRDD_AGG两个类,JDBCRDD_AGG是为聚合下推重写的一个数据读取的类;


这样的聚合下推优化在数据量比较小的时候,下推的性能没有太大的提升,但是随着数据量的增大,下推的效果逐步明显,甚至会出现性能翻倍的效果。同时,采用下推的方式,还可以大大节省内存,下推的方式不会因为数据量的增大而增加计算引擎对内存的需求量,但是反观无下推的执行方式,随着数据量的增大甚至会OOM。


性能影响






Spark查询优化之谓词下推





由上图可以看出,查询下推之后的性能性能影响因素主要由数据源决定,聚合下推的关键是将聚合函数下推到数据源,由数据源执行完聚合计算后返回聚合结果。因此数据源的聚合性能直接影响了聚合查询的效率。



Spark查询优化之谓词下推















Spark查询优化之谓词下推


















长按二维码识别关注





































好文!点个好看!






推荐阅读
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 《Spark核心技术与高级应用》——1.2节Spark的重要扩展
    本节书摘来自华章社区《Spark核心技术与高级应用》一书中的第1章,第1.2节Spark的重要扩展,作者于俊向海代其锋马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看1. ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • CentOS 7配置SSH远程访问及控制
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
吴小熙1108
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有