第五十一讲
Spark优化之“钨丝计划”
1,“钨丝计划”产生背景
2,“钨丝计划”内幕详解
3,“钨丝计划”下的Shuffle
一:“钨丝计划”产生的本质原因
1,
Spark作为一个一体化多元化的大数据处理通用平台,性能一直是其根本性的追求之一,Spark基于内存迭代(部分基于磁盘迭代)的模型极大的满足了人们对分布式系统处理性能的渴望。但是由于Spark是采用Scala+Java语言编写的,所以运行在了JVM平台,淡然JVM是一个绝对伟大的平台,因为JVM让整个离散的主机融为了一体(网络即OS),但是JVM的死穴GC反过来限制了Spark(也就是说平台限制了Spark)。所以Tungsten聚焦于CPU和Memory的使用,以期望达到对分布式硬件潜能的终极压榨!
2,
对Memory的使用,Tungsten使用了Off-Heap,也就是在JVM之外的内存空间(这就好像C语言对内存的分配,使用和销毁)。C语言和C++可以分配堆外内存。此时Spark实现了自己的独立的内存管理,就避免了JVM的GC引发的性能问题。其实还包含避免序列化和发序列化。OS的角度就不需要考虑序列化和发序列化。
3,
对于Memory管理方面一个至关重要的内容Cache,Tungsten提出了Cache-awarecomputation,也就是说使用对缓存友好的算法和数据结构来完成数据的存储和复用。
4,
对于CPU而言,Tungsten提出了Code Generation,其首先在Spark SQL使用,通过Tungsten要把该功能普及到Spark的所有功能中;
总结:Tungsten的内存管理机制独立于JVM,所以Spark操作数据的时候具体操作的是BinaryData,而不是JVM Object!!!Java和Scala同样能操作BinaryData,而且还免去了序列化和发序列化的过程。
二:“钨丝计划”内幕讲解
1,
内存管理方面:Off-Heap,在JVM外面分配内存,不受JVM管理,所以就没有GC的问题。Spark使用了sun.misc.Unsafe来进行Off-heap级别的内存分配,指针使用及内存释放。Spark为了统一管理Off-Heap和On-Heap而提出了Page。如果是在Off-Heap,指针的形式,如果是On-Heap的形式,不仅有指针的形式,还有JVM的Java Object。首先找到哪个Page,再找偏移量,找到具体的物理地址。
加载中,请稍候......