问题
分布式大数据分析在很大程度上依赖于Java和Scala等高级语言的可靠性和多功能性。然而,这些高级语言也为数据传输制造了障碍。要在Java虚拟机(JVM)之间传输数据,发送方应将对象转换为字节数组(序列化),接收方应将其转换回对象(反序列化),对象序列化和反序列化(OSD)阶段引入了相当大的性能开销。
现有方法局限性
先前的工作主要集中在优化OSD中的某些阶段,因此对象转换仍然是不可避免的。其中许多方法都需要额外的编程工作来注释序列化点,或更改原始的JVM间通信模。而且他们将传输的数据视为单片字节数组,而不是单个对象,这使得识别重复传输变得困难,并错过了优化机会。
本文方法
本文提出了零变化对象传输(ZCOT),使对象在JVM之间直接复制,而不需要任何转换。ZCOT可以在现有应用程序中使用,只需少量修改,其基于对象的传输可以用于重复数据消除。
-
引入了名为交换空间的全局共享抽象,它是Java堆空间的一部分,可供分布式环境中的多个JVM访问。进一步采用了分布式类数据共享(DCDS)机制,该机制提供了统一的对象格式,使交换空间中的对象对所有JVM都是可解释的。为了与传统的基于操作系统的应用程序保持兼容,提出了两级传输机制,以弥合基于对象的复制和传统的基于字节的传输之间的差距。
-
引入元数据服务器,可以存储对象的位置,并在JVM之间建立数据传输通道。支持基于组的对象管理,它将对象分组,大大减少元数据服务器和JVM之间的流量。还与单个JVM中触发的垃圾回收(GC)集成,并减少了GC暂停时间。
-
提出了重复数据消除机制,以进一步优化数据传输。去重模块利用交换空间抽象来存储哪些对象已经被发送,并避免了将来不必要的对象传输。然而,重复数据消除可能会在不同的数据集之间引入引用(或依赖关系)。为此,扩展了分布式内存管理模块,以考虑组间依赖关系。
本工作在OpenJDK的长期支持版本OpenJDK 11的HotSpot JVM中实现了ZCOT。ZCOT与OpenJDK中的现有功能(如APPCDS[30])集成良好,对Java开发人员保持友好。
测试的结果表明,ZCOT优于其他OSD库,与最先进的OSD优化Naos[39]相比,速度提高了4.35倍。ZCOT在Spark和Flink中都优于默认OSD库,因此应用时间分别提高了23.6%和22.2%。
实验
实验环境:具有四个节点的集群,这些节点由100 Gbit/s的Mellanox ConnectX-5 NIC连,每个节点包含双Xeon E5-2650 CPU和128GB DRAM。
数据集:微基准测试、Spark、Flink(TPC-H)
实验对比:执行时间
实验参数:堆大小、块大小、数据集
总结
针对JVM虚拟机间数据传输的对象序列化和反序列化(OSD)开销。本文提出零变化对象传输(ZCOT),包括三个创新点:(1)引入名为交换空间的全局共享抽象。采用了分布式类数据共享(DCDS)机制,使交换空间中的对象对所有JVM都是可解释的。(2)引入元数据服务器,用于存储对象的位置,并在JVM之间建立数据传输通道。支持基于组的对象管理,减少元数据服务器和JVM之间的流量。与单个JVM中触发的垃圾回收(GC)集成,并减少了GC暂停时间。(3)提出了重复数据消除机制,利用交换空间抽象来存储已发送对象,并避免不必要的对象传输。扩展了分布式内存管理模块,以考虑组间依赖关系,避免重复数据消除在不同的数据集之间引入依赖关系。