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 ...
随机推荐
- 最新cocoapods安装流程,安装过程中遇到的问题及解决方法
最近重新安装了一次cocoapods,参考的安装流程:http://blog.csdn.net/showhilllee/article/details/38398119/ 但是现在的cocoapods ...
- Android 高级UI设计笔记09:Android如何实现无限滚动列表
ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...
- cmd运行java,含传参,引用jar
1,创建一个java project,完成编码 在Eclipse的资源管理器中选中你要打包的项目,右键点击,选择“导出”项,弹出导出对话框,在下面的Java目录下选择“JAR 文件”项,下一步,在导出 ...
- 根据url获取网页内容
PrintWriter out = null; out = response.getWriter(); try{ URL getUrl = new URL("http://www.kuaid ...
- [改善Java代码]数组的真实类型必须是泛型类型的子类型
List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...
- [改善Java代码]使用匿名类的构造函数
建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...
- 编程计算int类型整数的最大值和最小值
方法一:将一个int类型整数不断加1,加到最大值,再加1,就变成负值(最小值) 最大值就是除最高位外,其余位都为1,-1即是所有位全部是1,右移1位后最高位变0 最小值即是最高位为1,其余位为0, ...
- Angular 2.0 从0到1 (四)
第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...
- Nginx - Windows 环境安装 Nginx
1. 访问 http://nginx.org/en/download.html,下载 Windows 版本的安装包 2. 解压安装包,双击 nginx.exe,启动 nginx 3. 访问 http: ...
- Git CMD - status: Show the working tree status
命令参数 git status [<options>…] [--] [<pathspec>…] 命令格式 --short, -s 短格式输出. -- long 长格式输出, ...