跳转到主要内容
工程的博客

激动人心的火花SQL的性能改进在地平线上

2014年6月2日 工程的博客

分享这篇文章

Lakehouse读取的数据探索为什么lakehouses未来的数据架构和数据仓库的父亲,Bill Inmon。


Apache 1.0火花出了门,我们想给一个预览的下一个重大举措引发项目。今天,火花是最活跃的组成部分火花SQL——一个紧密集成的关系引擎,与核心互火花API。火花SQL火花1.0中被释放,并将提供一个更轻的重量,敏捷执行后端为未来版本的鲨鱼。在这篇文章中,我们想强调的一些方式紧密集成到Scala和火花与火花为我们提供强大的工具来优化查询执行SQL。这篇文章概述了最激动人心的特性之一,动态代码生成,并解释什么类型的性能提升这个特性可以提供使用查询从著名的基准,TPC-DS。作为基线,我们比较性能与当前鲨鱼释放。我们很高兴报告说,在这些情况下火花SQL优于鲨鱼,有时显著。注意,以下测试的开发分支火花SQL,其中包括一些新的性能特性。

SharkVsSparkSql虽然这是只有少数查询从TPC-DS基准测试中,我们计划将来释放更全面的结果。

现在我们看到东西在哪里去,让我们深入的技术细节我们如何计划。这是第一个在一系列的博客关于优化SQL火花。

运行时字节码生成

一个更昂贵的操作,需要由一个数据库在查询表达式的评价。JVM的内存模型可以显著增加的成本评估。要理解为什么是这种情况,让我们来看一个具体的例子:

选择一个+b

在上面的查询中,有一个表达式,将评估表的每一行,a + b。通常情况下,该表达式将会由一个表达式树。ExpressionTree

树的每个节点由一个对象来表示的评价方法,知道如何计算表达式的结果给出一个输入行。在这个例子中,添加对象评估方法被调用时,它将依次调用评估它的每个孩子,然后计算返回值的总和。这种方法从性能角度来看有什么问题吗?在实践中,性能损失来自几个这解释执行的细节:

  • 虚拟函数调用——每次评估被称为给定表达式对象,a虚函数调用。这些类型的函数调用可以扰乱流水线处理器,减缓执行。问题恶化时,表情是非常复杂的,比如那些TPC-DS基准。
  • 拳击的原始值——因为评估需要能够返回许多不同类型的值根据表达式(整数、字符串、浮动等)需要有一个通用的返回类型的对象。这意味着额外的对象需要分配给每个步骤的评估。廉价而现代jvm得到更好地分配的对象,这真的可以增加成本。
  • Genericity成本——这些表达式树需要能够处理许多不同的数据类型。然而,实际的函数,需要添加两个整数是不同于需要添加两个双打,例如。这genericity意味着评估代码通常需要额外if指令分支基于类型的数据被处理。

总之,上述问题可能会导致在查询执行时间显著增加。幸运的是,还有另一种方式!在开发分支火花的SQL,我们实现了一个版本的动态表达式求值程序为每个查询生成自定义字节码。尽管这样一代可能听起来像一个艰巨的任务,它实际上直接使用Scala 2.10中的一个新特性来实现,运行时反射。在高级别上,字节码生成方法,而不是使用一个表达式树来评估a + b,火花SQL将在运行时创建新的类定义代码类似如下:

val答:Int=inputRow.getInt (0)val b:Int=inputRow.getInt (1)瓦尔结果:Int=一个+bresultRow.setInt (0,结果)

解释评价相比,生成的代码适用于原始值(因此不分配任何对象),包括任何额外的函数调用。

使用但是

而引发SQL不是唯一的系统来执行动态生成查询执行的代码,使用Scala反射大大简化了实现,使它更容易扩展和提高。这个功能的关键Scala中的一个新特性,被称为但是。但是很容易构建树的Scala代码在运行时,无需构建复杂的手工ast。但是,你简单的前缀字符串在Scala中以字母“q”。你这样做,告诉Scala编译器将字符串的内容视为代码,而不是文本。您还可以使用$变量不同的代码片段拼接在一起。例如,上面的代码生成加法表达式可以简单表达如下:

defgenerateCode(艾凡:表达式):树= e{匹配案例属性(顺序)= & >“inputRow.getInt(序数美元)”例添加(左、右)= & >”“”{val leftResult = $ {generateCode(左)}val rightResult = $ {generateCode(右)}leftResult + rightResult}”“”}

在实践中,生成的代码更复杂,因为它还需要处理null值。如果你想看到完整的版本生成的代码示例表达式,它是可用的在这里

结论

动态代码生成只是冰山的一角,我们店里有更多的改进,包括:提高铺集成,能够自动查询半结构化数据(例如JSON),火花SQL和JDBC访问。请继续关注更新其他我们正在引发SQL优化!

免费试着砖
看到所有工程的博客的帖子