SPARK的计算向量化-spark本身的向量化

简介: SPARK的计算向量化-spark本身的向量化

背景


我们知道,随着计算引擎战争的结束(SPARK赢得了离线处理的霸权),越来越多的公司致力于性能的优化,而引擎的优化,目前直指计算的向量化,

这片文章来说说spark本身对于向量化的实现。


spark本身的优化


我们都知道spark的Tungsten项目,这个项目中有一点就是Code Generation(代码生成)。代码生成除了消除虚函数的调用等功能外,其实在向量化这块也是做了处理的。

直接跳到ColumnarToRowExec代码:

val columnarBatchClz = classOf[ColumnarBatch].getName
    val batch = ctx.addMutableState(columnarBatchClz, "batch")
  ...
 val localIdx = ctx.freshName("localIdx")
    val localEnd = ctx.freshName("localEnd")
    val numRows = ctx.freshName("numRows")
    val shouldStop = if (parent.needStopCheck) {
      s"if (shouldStop()) { $idx = $rowidx + 1; return; }"
    } else {
      "// shouldStop check is eliminated"
    }
    s"""
       |if ($batch == null) {
       |  $nextBatchFuncName();
       |}
       |while ($limitNotReachedCond $batch != null) {
       |  int $numRows = $batch.numRows();
       |  int $localEnd = $numRows - $idx;
       |  for (int $localIdx = 0; $localIdx < $localEnd; $localIdx++) {
       |    int $rowidx = $idx + $localIdx;
       |    ${consume(ctx, columnsBatchInput).trim}
       |    $shouldStop
       |  }
       |  $idx = $numRows;
       |  $batch = null;
       |  $nextBatchFuncName();
       |}
     """.stripMargin

spark中向量化的核心就在于这块代码中,这块代码主要的就是ColumnarBatch,也就是列批,这种列批的数据结构,用FOR循环这种方式进行数据的访问,

这在JIT中会进行优化(优化成向量化)。

而这里还有一个重点就是:Parquet或者ORC这种列式存储,读取出来的时候,天然就是一个列批的数据结构,很方便做向量化操作。


但是,利用JIT进行向量化是有缺点的:

利用了JIT进行优化,这个是需要编译器追踪循环的次数的,如果循环次数不够,就不会进行进行JIT,也就无法做到向量化。

所以好多公司把这种着力于用其他语句实现来进行真正意义上的向量化。


参考


本文参考了


深度解读|Spark 中 CodeGen 与向量化技术的研究

Velox: 现代化的向量化执行引擎


相关文章
|
JavaScript CDN
js:spark-md5分片计算文件的md5值
js:spark-md5分片计算文件的md5值
778 0
|
4月前
|
分布式计算 数据处理 Apache
Spark RDD的行动操作与延迟计算
Spark RDD的行动操作与延迟计算
Spark RDD的行动操作与延迟计算
|
4月前
|
分布式计算 算法 数据挖掘
Spark中的图计算库GraphX是什么?请解释其作用和常用操作。
Spark中的图计算库GraphX是什么?请解释其作用和常用操作。
38 1
|
8月前
|
分布式计算 资源调度 Java
Spark设计实现π的计算
Spark设计实现π的计算
103 0
|
10月前
|
存储 分布式计算 并行计算
Spark 图计算实战
Spark 图计算实战
164 0
|
12月前
|
分布式计算 Ubuntu Java
Spark Streaming保存计算状态
Spark Streaming保存计算状态
|
SQL 分布式计算 Java
五、【计算】Spark原理与实践(下) | 青训营笔记
五、【计算】Spark原理与实践(下) | 青训营笔记
五、【计算】Spark原理与实践(下) | 青训营笔记
|
存储 分布式计算 大数据
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
430 0
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
|
人工智能 分布式计算 Cloud Native
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
777 0
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
|
分布式计算 API 图计算
【Spark】(九)Spark GraphX 图计算解析2
【Spark】(九)Spark GraphX 图计算解析2
135 0
【Spark】(九)Spark GraphX 图计算解析2