spark内核的三大核心:基于RDD的调度系统、Tungsten和Catalyst解析优化引擎
Tungsten
Tungsten面对: Memory , CPU, Disk IO 和 NetWork IO
spark 1.6是第一阶段面对Memory, spark 2.0的时候面对的是CPU
磁盘IO和网络IO主要发生在Shuffle阶段,Shuffle有Hash, Sort, Tungsten。默认是Sort,Tungsten未完善,Hash在spark 2.0已经废弃不用了。Hash其实在数据量小且不需要排序时是比较快的。
Tungsten的第一方面:内存的优化
Tungsten是一个更底层的机制,可以认为它不存在,有点相当于JVM中的JIT功能。JVM的数据放在堆内或者堆外,把数据放在堆外的好处是
1:可以避免GC,
2:使用原生数据。磁盘上1G的数据,如果使用JVM加载进来的话要用比1G大的存储空间,可能是3G,总之会膨胀。
TaskMemoryManager基于Page的概念屏蔽掉了底层是On-heap或者是Off-heap的概念,使用逻辑地址做指针,通过逻辑地址来具体定位到我们的记录具体在Page中的位置, 逻辑地址的表示:long类型的64bit的一个数字来表示的。

On-heap和Off-heap寻址方式:
On-heap:先找到对象,然后再找索引。
Off-heap:根据地址找到索引。
Tungsten的第二方面:CPU的优化
Tungsten有翻译方法的功能而且是面向Stage的翻译, Stage里面有很多的方法,如果Stage里面有5000个方法,并不会有5000次的方法调用,因为是函数式编程,会合并成为一个普通的代码块,如for循环。
寄存器:把数据放在寄存器里面会比放在内存里面读取更快,因为寄存器离CPU更近。
网友评论