EMR Spark Runtime Filter性能优化

背景

Join是一个非常耗费资源耗费时间的操作,特别是数据量很大的情况下。一般流程上会涉及底层表的扫描/shuffle/Join等过程, 如果我们能够尽可能的在靠近源头上减少参与计算的数据,一方面可以提高查询性能,另一方面也可以减少资源的消耗(网络/IO/CPU等),在同样的资源的情况下可以支撑更多的查询。

目前在SparkSQL中有Filter下推优化,包括两个维度:

生成Filter

SparkSQL会从用户的SQL语句中获取到Filter

  • 直接显示获取

    select * from A where a=1

    生成Filter(a=1) on A

  • 隐式推断

    select * from A, B where A.a = B.b and A.a=1

    推断出Filter(b=1) on B

Filter优化

利用生成的Filter算子可以优化,比如:

  • 将Filter尽量下推到靠近DataSource端
  • 如果Filter中的列是分区列,可以提前对DataSource进行分区裁剪,只扫描需要的分区数据

Runtime Filter是针对Equi-Join场景提出的一种新的生成Filter的方式,通过动态获取Filter内容来做相关优化。

Runtime Filter原理

优化对象

Equi Join, 形如

select x,y from A join B on A.a = B.b

其中A是一个小表(如维表),B是一个大表(如事实表)
备注: A/B也可以是一个简单的子查询

优化思路

如上述小表A和大表B进行Join,Join条件为A.a=B.b,实际Join过程中需要对大表进行全表扫描才能完成Join操作,极端情况下如A.a仅仅只有一条记录,也需要对B表全表扫描,影响性能。

如果在B表扫描之前,能获取A表的a的相关信息(如所有的a值,或者a的min/max/Bloomfilter等统计信息),并在实际执行Join之前将这些信息对B表的数据进行过滤,而不是全表扫描,可以大大提高性能。

两种场景

根据大表B参与join的key(b)的属性,可以分别采集小表A参与join的key(a)的信息:

b是分区列

如上b为大表B的一个分区列,则可以提前收集A.a列的所有值,然后利用A.a的值对B表的b列进行分区裁剪

b不是分区列

不能做分区裁剪,只能在实际数据扫描的过程中进行过滤。可以提前收集A.a列的min/max/Bloomfilter的统计信息,然后利用这些统计信息对B表进行数据过滤,这个过滤又可以分成两种粒度:

  • 可下推到存储层,减少数据扫描
    如底层文件格式是Parquet/ORC, 可以将相关过滤谓词(min/max等)下推到存储层面,从而减少实际扫描的数据。
  • 扫描后数据过滤
    不能下推到存储层的,可以在数据被扫描后做条件过滤,减少后续参与计算的数据量(如shuffle/join等)

Runtime Filter实现

Runtime Filter的实现主要在Catalyst中,分为4个步骤:

谓词合成

在用户SQL生成的逻辑执行计划树(logical plan)中,寻找满足条件的Equi-Join节点,然后根据上面的思路,在Join的大表B侧插入一个新的Filter节点,如Filter(In(b, Seq(DynamicValue(a, A))), B)

谓词下推

上面生成的新的Filter会经过PushDownPredicate的Rule,尽量下推靠近DataSource附近

物理执行计划生成

该阶段会将上面下推的Filter(In(b, Seq(DynamicValue(a, A))), B)转换成物理节点(FilterExec),根据上面两种场景会生成两种不同的FilterExec

  • b是分区列
    b是分区列,采集的是a列的所有值,如:

    case class DynamicPartitionPruneFilterExec(child: SparkPlan, collectors: Seq[(Expression, SparkPlan)])extends DynamicFilterUnaryExecNode with CodegenSupport with PredicateHelper

其中colletors就是用于采集信息的SparkPlan,因为要跑一个SQL来采集a列的所有值(select a from A group by a);
因为有可能会有多个分区列,所以这个地方是一个Seq.

  • b是非分区列
    b是非分区列,采集的是a列的min/max/bloomfilter统计信息,如

    case class DynamicMinMaxFilterExec(child: SparkPlan, collectors: Seq[(Expression, SparkPlan)])
    extends DynamicFilterUnaryExecNode with CodegenSupport with PredicateHelper

同理上面collectors也是用户采集信息的SparkPlan,如select min(a),max(a) from A

执行

在物理执行计划实际执行的过程中,会在DynamicPartitionPruneFilterExec/DynamicMinMaxFilterExec物理算子内先执行collectors获取到a列的相关信息,然后对底层B的执行计划进行改写,比如利用采集到的信息做分区裁剪/数据过滤等。

Runtime Filter性能测试

以TPC-DS 10TB的Query54为例:

Runtime Filter 关闭

​​

Runtime Filter 打开


经过DynamicPartitionPruneFilter对catalog_sales的分区进行了裁剪,实际对表的扫描从14,327,953,968减少到136,107,053,然后经过min/max的过滤继续减少到135,564,763;另外Runtime Filter减少了大表的扫描,shuffle的数据量以及参加Join的数据量,所以对整个集群IO/网络/CPU有比较大的节省

总结

针对Equi-Join的场景,可以额外的采集小表侧的信息,然后在Join之前对大表进行分区裁剪或者扫描后过滤,从而提高查询性能,减少资源消耗。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集齐最后一块拼图,全栈Serverless时代正式开启

近日腾讯云正式发布国内首个Serverless数据库新品——PostgreSQL for Serverless。相比普通云上数据库,该数据库能够最快1秒完成部署,成本降低70%。这款新型数据库将为数百万开发者带来更灵活的业务开发模式、更快捷的上云体验,以及更大空间的…

Java-所有类型的Class对象

public class Test04 {public static void main(String[] args) {Class c1 Object.class; // 类Class c2 Comparable.class; // 接口Class c3 String[].class; // 一位数组Class c4 int[][].class; // 二维数组Class c5 Override.class; // 注解Class c6 ElementType.cla…

分布式服务架构下的混沌工程实践

本文来自阿里巴巴高可用架构团队高级开发工程师肖长军(花名穹谷)在 GIAC(全球互联网架构大会)上的分享,包含三部分内容:(阿里巴巴中间件公众号对话框发送“混沌工程”,获取分享PPT&a…

Java-类加载内存分析

没有听懂 public class Test05 {public static void main(String[] args) {A a new A();System.out.println(A.m);/*1. 加载到内存&#xff0c;会产生一个类对应Class对象2. 链接&#xff0c; 链接结束后 m 03. 初始化<clinit>(){System.out.println("A类静态代码…

小谈CDN回源函数计算的应用场景

CDN团队联合函数计算团队近期推出了一个全新功能&#xff0c;即通过CDN把回源流量指向函数计算进行处理&#xff0c;该功能旨在帮助CDN用户能通过函数计算快速处理和便捷处理回源数据为目的&#xff0c;用户仅仅需要在CDN回源地址填写函数计算的自定义域名即可把请求转发到函数…

只需12 个步骤,就能在AWS中创建自定义VPC,用过都惊了!

作者| Kunal Yadav译者 | 天道酬勤 责编| 徐威龙封图| CSDN下载于视觉中国在本文中&#xff0c;作者将创建一个具有公共子网和私有子网的自定义VPC。每个子网中都有一个EC2实例&#xff08;已安装WordPress&#xff09;。亚马逊VPC图标公共子网中的实例可以通过互联网访问&…

阿里前端委员会主席圆心:未来前端的机会在哪里?

阿里妹导读&#xff1a;在近期举办的行业大会上&#xff0c;阿里前端技术委员会主席&#xff0c;淘系技术部资深总监圆心发表了《前端路上的思考》的演讲&#xff0c;分别从前端的发展历程、今天的机会、如何引领新技术、前端价值这四个方面进行深入探讨。流年笑掷&#xff0c;…

Java-分析类初始化

public class Test06 {static {System.out.println("Main类被加载");}public static void main(String[] args) throws ClassNotFoundException {// 1. 主动引用 // Son son new Son();/* 结果Main类被加载父类被加载子类被加载*/// 反射也会产生主动引用 //…

安卓应用开发顶级框架大盘点,总有一款适合你

作者 | Slava Vaniukov译者 | 苏本如&#xff0c;责编 | 夕颜封图 | CSDN下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着软件开发向移动应用的转变&#xff0c;越来越多的企业意识到&#xff0c;移动应用程序对于企业和客户之间建立牢固的联系至关重要。这…

蚂蚁金服王旭:开源的意义是把社区往前推进一步

互联网技术发展速度之快是所有从业者甚至非从业者都能感受到的。尤记得在世纪之交时&#xff0c;那时候互联网刚刚在中国开始向民用普及&#xff0c;不说支撑大规模的网站访问量的相关技术&#xff0c;就连 Linux、负载均衡甚至都没有被普遍使用。而在二十年之后&#xff0c;云…

Java-类加载器-类运行时结构-。。。。

https://www.bilibili.com/video/BV1p4411P7V3?p16 获取注解信息 https://www.bilibili.com/video/BV1p4411P7V3?p11 https://www.bilibili.com/video/BV1p4411P7V3?p12 https://www.bilibili.com/video/BV1p4411P7V3?p13 https://www.bilibili.com/video/BV1p4411P7V3?p1…

腾讯云成立星星海实验室,聚焦云原生服务器硬件研发

近日腾讯云宣布成立“星星海实验室”&#xff0c;这是腾讯历史上首个硬件工程实验室&#xff0c;也是腾讯云面向产业互联网加速技术自研的重要战略。 星星海取名自青海省果洛藏族自治州玛多星星海&#xff0c;以水为名&#xff0c;寓意灵动与智慧。据了解&#xff0c;星星海实…

【从入门到放弃-Java】并发编程-NIO-Channel

前言 上篇[【从入门到放弃-Java】并发编程-NIO使用]()简单介绍了nio的基础使用&#xff0c;本篇将深入源码分析nio中channel的实现。 简介 channel即通道&#xff0c;可以用来读、写数据&#xff0c;它是全双工的可以同时用来读写操作。这也是它与stream流的最大区别。 cha…

【IPF2020】浪潮集团执行总裁、首席科学家王恩东:智慧计算、源动新基建

CSDN记者于前方报道 众所周知计算力就是生产力&#xff0c;智慧计算改造升级了生产力三要素并最终驱动了人类社会的转型升级。具体来说&#xff0c;智慧计算将劳动者由人变成了人与人工智能的结合体&#xff0c;以此可以顺利实现指数级增长&#xff0c;将数据变成一种创新生产…

使用Spark Streaming SQL基于时间窗口进行数据统计

1.背景介绍 流式计算一个很常见的场景是基于事件时间进行处理&#xff0c;常用于检测、监控、根据时间进行统计等系统中。比如埋点日志中每条日志记录了埋点处操作的时间&#xff0c;或者业务系统中记录了用户操作时间&#xff0c;用于统计各种操作处理的频率等&#xff0c;或…

html-网页基本标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本标签学习</title> </head> <body><!-- 标题标签 --> <h1>一级标签</h1> <h2>二级标签</h2> <…

阿里AI再出神器,“你是什么垃圾”一拍便知

“干垃圾&#xff0c;还是湿垃圾&#xff1f;你是什么垃圾&#xff1f;” 相信魔都的小伙伴已经要被垃圾分类逼疯了&#xff0c;还要面临垃圾桶前&#xff0c;志愿者们的灵魂一问&#xff1a;“你是什么垃圾&#xff1f;” 更糟糕的是&#xff0c;垃圾分类&#xff0c;还要“…

【IPF2020】浪潮集团高级副总裁彭震:智算中心 筑基智慧世界

【快讯】浪潮关注智算中心&#xff0c;据浪潮集团高级副总裁彭震来看主要归结为几个主要问题&#xff0c;分别是算力、数据以及互联。此外针对智算中心的分析往往不仅仅是一个中心的单一要素&#xff0c;更多是很多中心之间彼此互联的关系&#xff0c;如何解决多元融合的问题才…

html-图像标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图像标签学习</title> </head> <body> <!-- img学习 src: 图片地址 必填相对地址&#xff08;推荐&#xff09; &#xff0c; …

工程师如何给女友买包?问问阿里“百事通”

阿里妹导读&#xff1a;工作那么忙&#xff0c;怎么给女朋友买包&#xff1f;是翻看包包的详情页&#xff0c;再从商品评论中去找信息吗&#xff1f;为了帮助类似的同学节省时间&#xff0c;阿里工程师们提出快速回答生成模型RAGE。你问它答&#xff0c;这个“百事通”能从整体…