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

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

当数据来源或者数据结构比较复杂,比如采用parquet数据,有个编解码的过程,会有非常大的开销。

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

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

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

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

Spark Tungsten揭秘 Day4 内存和CPU优化使用的更多相关文章

  1. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  2. Spark Tungsten揭秘 Day1 jvm下的性能优化

    Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...

  3. Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle

    Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...

  4. Spark Tungsten in-heap / off-heap 内存管理机制--待整理

    一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...

  5. MySQL 内存和CPU优化相关的参数

    mysql> SHOW GLOBAL STATUS LIKE 'innodb%read%'; +---------------------------------------+--------- ...

  6. Spark Streaming揭秘 Day4-事务一致性(Exactly one)

    Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...

  7. Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件

    1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...

  8. Kakfa揭秘 Day4 Kafka中分区深度解析

    Kakfa揭秘 Day4 Kafka中分区深度解析 今天主要谈Kafka中的分区数和consumer中的并行度.从使用Kafka的角度说,这些都是至关重要的. 分区原则 Partition代表一个to ...

  9. Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming

    Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...

随机推荐

  1. vim中光标的前进和后退

    流行的文本编辑器通常都有前进和后退功能,可以在文件中曾经浏览过的位置之间来回移动.在 vim 中使用 Ctrl-O 执行后退,使用 Ctrl-I 执行前进.相关帮助: :help CTRL-O  :h ...

  2. js学习笔记第二篇

    Js笔记整理 1.StringAPI a)        大小写转换:str.toUpperCase();str.toLowerCase(); b)        获取指定位置字符: Str[i]-- ...

  3. 快递鸟电子面单API对接方法?

    之前说了一下快递公司.菜鸟和快递鸟的电子面单接口,很多人不知道快递鸟要怎么对接,现在为大家讲解一下.快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流 ...

  4. JMS笔记(一)

    1.jms概念 Java Message Service为 Java程序提供一种访问企业消息系统的方法,JMS应用由JMS生产者.JMS Provider.JMS消费者构成 1.1. 一条Messag ...

  5. weblogic服务器内存溢出问题解决

    问题描述: 当我们在weblogic服务器一个域domain上面部署多个工程时,经常会出现内存溢出的情况:java.lang.OutOfMemoryError异常 原因:主要是因为weblogic环境 ...

  6. MVC清除缓存设置+数据验证

    [OutputCache(Location = OutputCacheLocation.None, NoStore = true)] [Table("User")]:定义UserD ...

  7. 嵌入式开发笔记 - U-Boot相关

    1.U-boot使用准备 1.1 U-boot下载 通过德国的denx软件中心提供的FTP下载合集,下载网址: ftp://ftp.denx.de/pub/u-boot/

  8. 纯css 写三角形

    <div style="width: 0;height: 0;border-left: 6px solid transparent;border-right: 6px solid tr ...

  9. Linux - 硬链接与软链接

    在 Linux 的文件系统中,磁盘块分成了 3 个部分.一部分称为数据区,用来存放文件内容.另一部分称为 inode 表,用来存放文件属性.第三部分称为超级块,用来存放文件系统本身的属性.文件的内容和 ...

  10. HDOJ2018母牛的故事

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...