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
刚才说的是循环来源问题,还有一种情况的问题。
当数据来源或者数据结构比较复杂,比如采用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优化使用的更多相关文章
- Spark Tungsten揭秘 Day3 内存分配和管理内幕
Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle
Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...
- Spark Tungsten in-heap / off-heap 内存管理机制--待整理
一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...
- MySQL 内存和CPU优化相关的参数
mysql> SHOW GLOBAL STATUS LIKE 'innodb%read%'; +---------------------------------------+--------- ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件
1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...
- Kakfa揭秘 Day4 Kafka中分区深度解析
Kakfa揭秘 Day4 Kafka中分区深度解析 今天主要谈Kafka中的分区数和consumer中的并行度.从使用Kafka的角度说,这些都是至关重要的. 分区原则 Partition代表一个to ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
随机推荐
- couldn't set tty to ppp discipline invalid argument
参考: http://pptpclient.sourceforge.net/howto-diagnosis.phtml#conventions http://blog.chinaunix.net/ui ...
- Linux编程之《进程/线程绑定CPU》
Intro----- 通常我们在编写服务器代码时,可以通过将当前进程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率,下面将完整代码贴上. /***** ...
- Recommended you 3 most popular Nissan pincode calculators
Have you still felt confused on how to choose a satisfactory Nissan pin code calculator in the marke ...
- cocos2d-x之MoonWarriors用c++实现
玩了sample里面的cocos2d-html5的MoonWarriros,感觉效果做得挺不错的,但是源代码是javascript,鄙人又不会这门语言. github上也有别人贡献的c++代码,不过还 ...
- Visual studio 2013 添加 GitHub
- [改善Java代码]优先使用整型池
建议28: 优先使用整型池 看如下代码: public class Client { public static void main(String[] args) { Scanner input = ...
- CSS3秘笈第三版涵盖HTML5学习笔记1~5章
第一部分----CSS基础知识 第1章,CSS需要的HTML HTML越简单,对搜索引擎越友好 div是块级元素,span是行内元素 <section>标签包含一组相关的内容,就像一本书中 ...
- 编写SASS的一些技巧
更好的为变量命名 变量是Sass中最简单的特性之一,但有时候也会使用不当.创建站点范围内有语义化的变量,是不可或缺的工作.如果命名不好,他会变得难以理解和重复使用. 这里有一些命名变量的小技巧,提供参 ...
- Jackson - Quickstart
JSON Three Ways Jackson offers three alternative methods (one with two variants) for processing JSON ...
- Ehcache(2.9.x) - API Developer Guide, Key Classes and Methods
About the Key Classes Ehcache consists of a CacheManager, which manages logical data sets represente ...