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

Spark Tungsten揭秘 Day1

jvm下的性能优化

今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律。

jvm对分布式天生支持

整个Spark分布式系统是建立在分布式jvm基础上的,jvm非常伟大的一点在于把不同机器的计算能力联合起来了,jvm也把不同机器的存储能力连接起来了。

jvm是怎么做到这一点的,jvm本身就是一个软件,有自己的通讯方式以及自己的一套协议,在进行java或者scala开发的时候,就支持了一个最重要的设计模式:代理模式,基于代理模式可以使用其他的进程,这些进程可以在同一个OS,或者不同的OS上,可以使用其他地方的进程,像使用本地进程一样。

jvm一个基本特征是,代理端和实现端看起来是完全一样的接口,因为我们编程时是面向接口的,所以代理模式是一个近乎完美的设计模式,既实现了面向接口编程,又能把不同的功能组合起来。

关于不同机器之间通讯的细节,这个是jvm帮我们处理掉了。所以jvm的口号是网络即OS。屏蔽掉了不同机器的区别。这个带来的影响非常的深远。jvm正在从技术的角度实现"共产主义"目标。

Scala的函数天然是可序列化与可反序列化的。这两者结合起来,导致数据和算法都可以在机器之间传输。这个就构建出了整个分布式。

一般大数据系统都是运行在jvm上的,完成不同机器之间沟通的代价最小。jvm有一个天然的特性,是数据序列化和反序列化的能力,这个就为不同机器传输数据打下了良好的基础,jvm的提供这种能力可以让我们根据接口进行数据的自定义,数据的自定义达到的好处是我们可以随意进行数据建模实现我们数据的业务逻辑,并这个建模在不同机器间进行传输。

GC是jvm头上的乌云

jvm是一个应用程序而已,运行在一个user space进程中,从OS角度讲,进程分为两种,一种是user space,一种是kernel space。从kernel space角度讲,并没有进程之间的差异,内核空间看用户空间的一切,只是一个又一个的句柄。用户空间进程只是注册下,需要进行内存映射。

内存映射是一种算法,用户空间的某个地址和内核空间会进行某种公式的缓存,因为内核空间不是那么大,但是用户空间越来越大,从内核空间讲,用户空间的jvm进程是计算资源的代表,例如对core和内存的使用。

jvm当初重要的目标是跨平台,是一种标准,提供统一的编程,底层来适配不同的硬件。jvm的推出,让我们可以仅关心对象的使用,让我们在对象的三阶段中解放操作,不用关心分配和销毁。学习者和开发者的角度讲简单了很多。从整个分布式角度考虑,jvm提供了很多的便利。类似吃自助餐,直接吃就可以,会有服务员补餐和收餐。

但是,这个是有代价的,jvm会有自己的一套机制来分配和清理,但是这里有个很大的问题,因为程序运行和gc是两套东西,有时候会有冲突,一般gc时都要停止工作,会影响程序的运行,对实时性要求特别高的程序就特别麻烦。这个就是jvm头上的那朵乌云。

Tungsten缘起

为了既享受jvm的好处,又摆脱弊端,就展开了Tungsten,Tungsten在最开始时候使用native级别的存储空间,从而不受jvm gc的影响,而只是被我们程序的逻辑所控制,分配和销毁全由程序说了算。

jvm管理的空间受gc影响和native空间完全是两码事。Tungsten第一阶段,就是这个思路,从jvm走向native。就是把一部分的空间转移到native级别。

第二阶段是程序有效运行的问题,java是后来出现的,是C和C++的一层封装,但这个封装是有代价的,弊端是从语言级别,效率更为低下,因为有一部分时间浪费在处理语言的流程和空间的使用。Tungsten做的是分析代码,看哪些是真正有效的计算,把CPU的有效使用效率最大化。

内存、CPU没问题了,下一步还有什么,是磁盘和内存的切换,所以第三阶段就是使用NIO的方式进行优化。

把这几点都完成后,就可以把机器运用到极致。

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

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

上一篇:python基础——获取对象信息


下一篇:解决 eclipse中properties文件编码问题