Spark Tungsten揭秘 Day4 内存和CPU优化使用

Spark Tungsten揭秘 Day4

内存和CPU优化使用

今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的很是大的优化部分。数据结构

对过去的代码研究,咱们会发现,抽象的提升,转过来会变成对CPU和内存的使用。也就是说,抽象提高,会对内存对Cpu会有不少没必要要的使用,执行不少无谓的没有实际做用的操做。好比面向接口调用,就是使用了指针的指针,接口这层并无实际的做用,能够直接跳过。框架

whole-stage code

Spark2.x的Tungsten中作了个很是重要的改进,也就是whole-stage code,把抽象的使用直接合并到具体的函数上。函数

具体来讲,Tungsten引擎会看哪些部分运行比较慢,会把这些比较慢的功能,代码单独放在一个函数中,消除虚函数调用,同时,将数据放在寄存器中,这样就减小CPU无谓的消耗,访问速度更快。性能

好比对RDD执行next方法,RDD是一个抽象类,存在虚函数寻址的过程,会消耗CPU,另一方面做为next访问每条记录都会调用一次方法,开销仍是比较大的。大数据

Spark2.x的做用就是按照本身的逻辑翻译成数据集合的for/while循环,把屡次函数调用变成了一个代码块,极大的提高效率。优化

  • 一方面,没有接口和虚函数的调用。面向对象极大的方便编写工程,可是形成了很大的浪费。CPU也有执行优化的方式,若是是while或者if判断的话,CPU对这种代码的执行比其余代码要快。
  • 另外,CPU操做数据的时候,操做内存比操做磁盘更快,操做寄存器比操做内存更快。

vectorization

刚才说的是循环来源问题,还有一种状况的问题。spa

当数据来源或者数据结构比较复杂,好比采用parquet数据,有个编解码的过程,会有很是大的开销。翻译

这个时候会采用向量化的方式vectorization,相似于构成了一个矩阵,假设处理很复杂的话,这时候能够一批一批进行处理,相似于用mapPartitions替代map。以对parquet进行批量解码为例,性能能够提高5-10倍。指针

可是要作到优化,Spark首先要对代码进行分析,因此全部的子框架都使用到了Tungsten。目前已经完成了on-heap/off-heap、Register/Memory、Cpu的优化,官方主要下一步会对IO操做进一步优化。code

欲知后事如何,且听下回分解!

DT大数据天天晚上20:00YY频道现场授课频道68917580

相关文章
相关标签/搜索