CN107590077B - 一种Spark负载访存行为追踪方法及装置 - Google Patents
一种Spark负载访存行为追踪方法及装置 Download PDFInfo
- Publication number
- CN107590077B CN107590077B CN201710866369.4A CN201710866369A CN107590077B CN 107590077 B CN107590077 B CN 107590077B CN 201710866369 A CN201710866369 A CN 201710866369A CN 107590077 B CN107590077 B CN 107590077B
- Authority
- CN
- China
- Prior art keywords
- information
- accessed data
- virtual address
- rdd
- code value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种Spark负载访存行为追踪方法,包括:在执行区,在UnsafeShuffleWriter对象的hashcode、第一被访问数据的RDD信息以及ShuffleExternalSorter对象的hashcode之间建立对应关系;获取第一被访问数据的虚拟地址和物理地址的相关信息,并根据UnsafeShuffleWriter对象的hashcode、第一被访问数据的RDD信息以及ShuffleExternalSorter对象的hashcode之间的对应关系,得到第一被访问数据的RDD信息、虚拟地址的相关信息和物理地址的相关信息的对应关系并保存在文件中;在存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取存储或读取操作对应的第二被访问数据的RDD信息、虚拟地址的相关信息及物理地址的相关信息,然后将上述三者之间的对应关系保存在文件中。本发明还提供一种Spark负载访存行为追踪装置,可打通Spark、JVM、OS三层,使Spark语义一直延伸到硬件层。
Description
技术领域
本发明涉及数据处理技术领域,尤其涉及一种Spark负载访存行为追踪方法及装置。
背景技术
Spark是专为大规模数据处理而设计的快速通用的计算引擎。内存计算是Spark的重要特征,即数据的存储和处理都在内存之中。因此,一款Spark应用程序的特征,很大程度反映在它对内存的使用行为上。与JVM(Java Virtual Machine,Java虚拟机)一样,Spark也有着自己的内存管理机制。图1展示了Spark***中各层的内存语义。
如图1所示,Spark将所管理的内存分为Execution区(执行区)和Storage区(存储区)两部分。Execution区为中间数据结果的处理提供缓存,Storage区用于存储数据。Spark所管理的内存,可以来自JVM堆,也可以直接从操作***获得。
对Spark应用进行性能分析时,图1所示的每一层中都有追踪工具可以利用,但现有的追踪工具的结果之间是独立的,彼此之间无法建立联系。因此,无法***地了解Saprk负载访存行为在Spark、JVM、OS(Operating System,操作***)三层的内在联系,从而较难对Spark应用进行性能分析。
发明内容
本发明的主要目的在于提供一种Spark负载访存行为追踪方法及装置,可打通Spark、JVM、OS三层,将Spark语义和各层性能指标建立联系,从而方便对Spark应用进行性能分析。
为实现上述目的,本发明实施例第一方面提供了一种Spark负载访存行为追踪方法,Spark管理的内存包括执行区和存储区,所述方法包括:
在所述执行区,当所述Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,并保存在文件中;
在所述存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,所述哈希表以BlockId为键,以MemoryEntry为值,所述对象包括所述第二被访问数据的BlockId和MemoryEntry;
将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,所述第二被访问数据的RDD信息包括获取的BlockId。
本发明实施例第二方面提供了一种Spark负载访存行为追踪装置,Spark管理的内存包括执行区和存储区,所述装置包括:
建立单元,用于在所述执行区,当所述Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
第一追踪单元,用于获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系;
保存单元,用于将所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系保存在文件中;
第二追踪单元,用于在所述存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,所述哈希表以BlockId为键,以MemoryEntry为值,所述对象包括所述第二被访问数据的BlockId和MemoryEntry;
所述保存单元,还用于将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,所述第二被访问数据的RDD信息包括获取的BlockId。
本发明实施例中,通过针对执行区和存储区采用不同的追踪策略,打通了Spark、JVM、OS三层,使Spark语义一直延伸到硬件层,从而很容易地得到Spark访存行为是什么样的,对应的物理内存是如何响应的,这对于理解程序行为对性能的影响十分重要。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中Spark***中各层的内存语义的示意图;
图2为本发明一实施例提供的Spark负载访存行为追踪方法中对Spark的执行区的访存行为进行追踪的实现流程示意图;
图3为本发明一实施例提供的Spark负载访存行为追踪方法中对Spark的存储区的访存行为进行追踪的实现流程示意图;
图4为本发明另一实施例提供的Spark负载访存行为追踪方法中对Spark的执行区的访存行为进行追踪的实现流程示意图;
图5为本发明另一实施例提供的Spark负载访存行为追踪方法中对Spark的存储区的访存行为进行追踪的实现流程示意图;
图6为本发明实施例提供的Spark负载访存行为追踪方法中追踪结果的示意图;
图7为通过本发明实施例提供的Spark负载访存行为追踪方法将Spark语义延伸至硬件的工作流程示意图;
图8为本发明一实施例提供的Spark负载访存行为追踪装置的结构示意图。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明一实施例提供了一种Spark负载访存行为追踪方法,对Spark的执行区和存储区分别执行不同的追踪策略。其中,对执行区的追踪策略请参阅图2,对存储区的追踪策略请参阅图3。
请参阅图2,图2为本发明一实施例提供的Spark负载访存行为追踪方法中对Spark的执行区的访存行为进行追踪的实现流程示意图,如图2所示,实现对执行区的访存行为的追踪,主要包括以下步骤:
S101、在执行区,当Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、第一被访问数据的RDD信息以及UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
Spark中的Partition是RDD(Resilient Distributed Datasets,弹性分布式数据集)的最小单元,RDD是由分布在各个节点上的Partition组成的。Partition是指Spark在计算过程中生成的数据在计算空间内的最小单元。对于RDD中的每一个Partition,如果其后的RDD与之存在Shuffle依赖,则Spark会启动一个ShuffleMapTask(以下简称Task)线程处理其中的数据,被处理的数据即可视为第一被访问数据,这个过程要读出Partition中的数据,然后将读出的数据写入到执行区内存以进行排序整理。其工作流程为:Task线程内调用UnsafeShuffleWriter(以下简称Writer)写缓存,Writer内部又调用ShuffleExternalSorter(以下简称Sorter),Sorter内部会为被访问的数据申请一块内存(JVM堆内或堆外),然后将数据写到这块内存之中。
当Spark启动Task线程对第一被访问数据进行处理时,获取Task线程调用的Writer对象的哈希码值(hashcode)、第一被访问数据的RDD信息以及Writer调用的Sorter对象的哈希码值(hashcode),然后在获取的Writer对象的hashcode、第一被访问数据的RDD信息和Sorter对象的hashcode之间建立对应关系。
第一被访问数据的RDD信息可以但不限于包括:Spark语义。Spark语义是指被访问的数据在Spark程序中的意义,例如,属于哪个RDD的哪个Partition。具体的,RDD信息可以包括:RDD id(RDD的唯一身份标识信息)与Partition id(Partition的唯一身份标识信息)。进一步的,RDD信息还可以包括访问时间和访问类型。其中,访问时间是指何时发起的这次访问。由于Spark中多线程的存在,得到的访问序列未必是严格地按照时间顺序排列的,虽然差别很小,但仍不能依靠写记录的顺序,而是要记下一个绝对时间,以此排列访问记录。访问类型是指读或写,对执行区的访存行为进行追踪时,对数据的访问类型为写入,也即第一被访问数据为写入执行区内存的数据。
S102、获取ShuffleExternalSorter为第一被访问数据申请的虚拟地址的相关信息以及该虚拟地址对应的物理地址的相关信息,并根据UnsafeShuffleWriter对象的哈希码值、第一被访问数据的RDD信息以及ShuffleExternalSorter对象的哈希码值之间的对应关系,得到第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,并保存在文件中;
具体的,第一被访问数据的虚拟地址的相关信息可以但不限于包括:第一被访问数据的虚拟地址以及虚拟页信息。第一被访问数据的物理地址的相关信息可以但不限于包括:第一被访问数据的物理地址以及物理页信息。其中,虚拟页信息是指被访问的数据属于哪些虚拟页,该数据是否跨页,页是在内存中还是被交换到了外存。物理页信息可以但不限于包括:物理页号以及NUMA(Non Uniform Memory Access Architecture)节点等信息。
首先,通过访问操作***页表(OS页表),得到与Sorter为第一被访问数据申请的虚拟地址对应的虚拟页信息以及物理地址的相关信息,并将虚拟地址及其对应的虚拟页信息作为第一被访问数据的虚拟地址的相关信息。
然后,通过利用Sorter对象的hashcode,根据Writer对象的hashcode、第一被访问数据的RDD信息以及Sorter对象的hashcode之间的对应关系,得到第一被访问数据的RDD信息,进而得到Sorter为第一被访问数据申请的虚拟地址的相关信息、该虚拟地址对应的物理地址的相关信息以及第一被访问数据的RDD信息三者之间的对应关系。然后将上述三者的对应关系记录在文件中。
可选的,于本发明另一实施例中,可以在设备中预设Spark内存跟踪工具程序模块(简称为追踪模块,以下简写为SMTT),通过SMTT,利用哈希表,实现上述步骤S101和S102中对Execution区(执行区)内存的追踪。具体的,请参阅图4,图4为本发明另一实施例提供的Spark负载访存行为追踪方法中中对Spark的执行区的访存行为进行追踪的实现流程示意图。如图4所示,通过SMTT,利用哈希表,实现上述步骤S101和S102中对Execution区内存的追踪,具体可以包括以下步骤:
①、在Task线程中,将Task线程调用的Writer对象的hashcode和第一被访问数据的RDD信息传给SMTT,SMTT将Writer对象的hashcode和第一被访问数据的RDD信息写入第一哈希表,第一哈希表以Writer对象的hashcode为键(Key),以第一被访问数据的RDD信息为值(Value),其中第一被访问数据的RDD信息即Writer对象的RDD信息;
②在Writer中,将Writer对象的hashcode和Writer调用的Sorter对象的hashcode传给SMTT,通过SMTT将Writer对象的hashcode和Sorter对象的hashcode写入第二哈希表,第二哈希表以Sorter对象的hashcode为Key,以Writer对象的hashcode为Value;
③在Sorter中,将Sorter对象的hashcode和Sorter为第一被访问数据申请的虚拟地址传给SMTT;
④通过SMTT,在SMTT内部,在第二哈希表中查找与Sorter对象的hashcode对应的Writer对象的hashcode;
⑤通过SMTT,在SMTT内部,在第一哈希表中查找与Writer对象的hashcode对应的第一被访问数据的RDD信息;
⑥通过SMTT,在SMTT内部,通过访问OS页表,得到与传入的虚拟地址对应的虚拟页信息以及物理地址的相关信息;
⑦通过SMTT,在SMTT内部,将上述第一被访问数据的RDD信息、虚拟地址、虚拟页信息以及物理地址的相关信息合成一条记录,并保存在文件中。该记录中记录有上述第一被访问数据的RDD信息、虚拟地址、虚拟页信息以及物理地址的相关信息之间的对应关系。其中虚拟地址和虚拟页信息可视为虚拟地址的相关信息。
请参阅图3,图3为本发明一实施例提供的Spark负载访存行为追踪方法中对Spark的存储区的访存行为进行追踪的实现流程示意图,如图3所示,实现对存储区的访存行为的追踪,主要包括以下步骤:
S103、在存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取存储或读取操作的对象,并根据对象得到存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及第二被访问数据的虚拟地址对应的物理地址的相关信息,该哈希表以BlockId为键,以MemoryEntry为值,获取的对象包括第二被访问数据的BlockId和MemoryEntry;
可以理解的,执行区的第一被访问数据与存储区的第二被访问数据不是一个数据。执行区的数据只短暂的存在于内存之中。存储区的数据,理论上,若应用程序不主动释放且内存够用,会一直存在于内存之中。这两个过程是相互独立的,在Spark运行过程中,会根据不同的情况将RDD数据放入存储区或执行区。具体的,一方面,如果应用程序对RDD做了持久化操作,则RDD数据会被放入存储区;另一方面,如果两个RDD转换之间需要有Shuffle操作,则前一个RDD的数据会被写入存储区。换言之,第一被访问数据只包括写入的数据,而第二被访问数据包括写入和读取的数据。
持久化,也就是说,将第二被访问数据缓存到内存中或磁盘中。对于持久化到内存中的RDD,Spark的MemoryStore提供了统一的存或取接口。MemoryStore的内部维护了一个哈希表,该哈希表以BlockId为Key,以MemoryEntry为Value。其中BlockId就是RDD id(RDD的唯一身份标识信息)与Partition id(Partition的唯一身份标识信息)的组合,根据BlockId可以知道当前存储的数据属于哪个RDD的哪个Partition,也就是说,BlockId可视为被访问数据的RDD信息。MemoryEntry存储数据,其内部有一个ByteBuffer数组,而每一个ByteBuffer内部有一个字节数组,这个字节数组才是真正存放数据的容器。根据该字节数组可以得到存储区中第二被访问数据的虚拟地址。通过访问OS页表,得到与该虚拟地址对应的虚拟页信息以及物理地址的相关信息,并将得到的虚拟地址及其对应的虚拟页信息作为第二被访问数据的虚拟地址的相关信息。
S104、将第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在文件中,第二被访问数据的RDD信息包括获取的BlockId。
具体的,将存储区中的第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息组合成一条记录保存至文件。该记录中存储有存储区中的第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息三者之间的对应关系。
可选的,于本发明另一实施例中,可以通过SMTT,实现上述步骤S103和S104中对Storage(存储区)内存的追踪。具体的,请参阅图5,图5为本发明另一实施例提供的Spark负载访存行为追踪方法中对Spark的存储区的访存行为进行追踪的实现流程示意图。如图5所示,通过SMTT,实现上述步骤S103和S104中对Storage区内存的追踪,具体可以包括以下步骤:
①当对MemoryStore维护的哈希表执行存储或读取操作时,将存储或读取的哈希表中的BlockId和MemoryEntry传给SMTT,该BlockId即为存储区中第二被访问数据的RDD信息;
②通过SMTT,在SMTT内部,获取MemoryEntry的成员变量ByteBuffer数组;
③通过SMTT,在SMTT内部,利用Unsafe类提供的接口,获取ByteBuffer数组中每一个ByteBuffer对象的成员变量hb的值,成员变量hb的值为字节数组在JVM堆中的起始地址;
④在不使用指针压缩的情况下,数组在JVM堆中的前24个字节为头信息,其后紧跟着才是数据,根据这种格式,将成员变量hb的值与JVM堆的头信息的长度相加,得到存储区中的第二被访问数据的虚拟地址;
⑤通过访问OS页表,得到存储区中的第二被访问数据的虚拟地址对应的虚拟页信息及物理地址的相关信息;
⑥将BlockId作为存储区中的第二被访问数据的RDD信息,与存储区中的第二被访问数据的虚拟地址、虚拟页信息和物理地址的相关信息一起组合成一条记录,并保存到文件中,该记录中存储有存储区中的第二被访问数据的RDD信息、虚拟地址、虚拟页信息和物理地址的相关信息之间的对应关系。其中虚拟地址和虚拟页信息可视为虚拟地址的相关信息。
通过上述步骤,SMTT采用在Spark源码中进行插桩的方式获取Spark数据结构,然后对其逐层地进行地址转换,直至硬件层。最终SMTT输出的追踪结果,即保存有第二被访问数据的RDD信息、虚拟地址的相关信息和物理地址的相关信息之间的对应关系的文件,如图6所示。可以理解的,如图6所示,在访问序列中,一次访问记录应包含如下信息:访问时间、访问类型、Spark语义、虚拟地址、虚拟页信息、物理地址以及物理页信息。
其中,访问时间,是指何时发起的这次访问。由于Spark中多线程的存在,得到的访问序列未必是严格地按照时间顺序排列的,虽然差别很小,但仍不能依靠写记录的顺序,而是要记下一个绝对时间,以此排列访问记录。
访问类型,是对数据的访问,有可能是读,也有可能是写,这对分析性能十分必要。
Spark语义,是指被访问的数据在Spark程序中的意义,例如,属于哪个RDD的哪个Partition。
虚拟地址,对于被访问的数据,是指操作***分配的虚拟地址。这是最终找到物理地址的依据。同时,如果这些内存从JVM堆上分配,虚拟地址也反映了数据在JVM堆内的位置。
虚拟页信息,用于指示被访问的数据属于哪些虚拟页。数据是否跨页了,页是在内存中还是被交换到了外存,这些对于分析性能十分重要。
物理地址,用于指示被访问的数据最终在物理内存是如何分布的,是否具有很明显的局部性,这些需要进行深入地分析。
物理页信息,用于指示被访问的数据属于哪些物理页。这些物理页的热度如何,在NUMA***中,这些物理页是否跨节点了,这些信息对于性能分析不可忽略。
从SMTT输出的追踪结果可以看到,SMTT本身并不提供任何性能指标、只是记录现象,根据这些记录,可以从不同角度挖掘出自己感兴趣的信息,所以更具有普适性。实际使用中,可以将SMTT与其他性能分析工具结合。例如:先用现有的性能分析工具(如perf)跟踪到问题所在,然后从SMTT的记录中,根据具体侧重点进行相应的分析,从而找出问题是如何产生的。
进一步的,请参阅图7,图7为通过本发明实施例提供的Spark负载访存行为追踪方法将Spark语义延伸至硬件的工作流程示意图。如图7所示,SMTT会在Spark层抓取到Spark数据的访问序列。对于其中每一次被访问的数据,SMTT会找出它们所占内存来自JVM堆内还是堆外,进而找出它们在操作***中的逻辑地址。然后,根据逻辑地址,SMTT会判断这些数据是在物理内存中,还是被交换到了外存。如果是在物理内存中,SMTT会给出它们所在的NUMA节点、物理页号、物理地址等信息。
经过这样的流程,Spark数据在物理硬件上的分布一目了然,这对于分析Spark应用程序的数据访问特性与***性能的关系有着非常重要的意义。
本实施例提供的Spark负载访存行为追踪方法,通过针对执行区和存储区采用不同的追踪策略,打通了Spark、JVM、OS三层,使Spark语义一直延伸到硬件层,从而很容易地得到Spark访存行为是什么样的,对应的物理内存是如何响应的,这对于理解程序行为对性能的影响十分重要。
请参阅图8,为本发明一实施例提供的Spark负载访存行为追踪装置的结构示意图。本实施例提供的Spark负载访存行为追踪装置可以是上述图2至图7所示Spark负载访存行为追踪方法的执行主体。如图8所示,该装置包括:
建立单元701,用于在所述执行区,当所述Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
第一追踪单元702,用于获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系;
保存单元703,用于将所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系保存在文件中;
第二追踪单元704,用于在所述存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,所述哈希表以BlockId为键,以MemoryEntry为值,所述对象包括所述第二被访问数据的BlockId和MemoryEntry;
保存单元703,还用于将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,所述第二被访问数据的RDD信息包括获取的BlockId。
进一步的,建立单元701,具体用于将所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息传给追踪模块,通过所述追踪模块将所述UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息写入第一哈希表,所述第一哈希表以所述UnsafeShuffleWriter对象的哈希码值为键,以所述第一被访问数据的RDD信息为值;
建立单元701,还具体用于将所述UnsafeShuffleWriter对象的哈希码值和所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值传给所述追踪模块,通过所述追踪模块将所述UnsafeShuffleWriter对象的哈希码值和所述ShuffleExternalSorter对象的哈希码值写入第二哈希表,所述第二哈希表以所述ShuffleExternalSorter对象的哈希码值为键,以所述UnsafeShuffleWriter对象的哈希码值为值。
进一步的,所述第一被访问数据的虚拟地址的相关信息包括所述第一被访问数据的虚拟地址及其对应的虚拟页信息;
第一追踪单元702,具体用于将所述ShuffleExternalSorter对象的哈希码值和为所述第一被访问数据申请的虚拟地址传给所述追踪模块,通过所述追踪模块,在所述第二哈希表中查找与所述ShuffleExternalSorter对象的哈希码值对应的所述UnsafeShuffleWriter对象的哈希码值,通过所述追踪模块,在所述第一哈希表中查找与所述UnsafeShuffleWriter对象的哈希码值对应的所述第一被访问数据的RDD信息,以及通过所述追踪模块,访问操作***页表,得到与所述虚拟地址对应的虚拟页信息以及物理地址的相关信息;
保存单元703,具体用于通过追踪模块,将所述第一被访问数据的RDD信息、虚拟地址、虚拟页信息以及物理地址的相关信息合成一条记录,并保存在所述文件中。
进一步的,所述第二被访问数据的虚拟地址的相关信息包括所述第二被访问数据的虚拟地址及其对应的虚拟页信息;
第二追踪单元704,具体用于当对MemoryStore维护的哈希表执行存储或读取操作时,将存储或读取的所述哈希表中的BlockId和MemoryEntry传给所述追踪模块,通过所述追踪模块,获取所述MemoryEntry的成员变量ByteBuffer数组,通过所述追踪模块,利用Unsafe类提供的接口,获取所述ByteBuffer数组中每一个ByteBuffer对象的成员变量hb的值,所述成员变量hb的值为字节数组在JVM堆中的起始地址,将所述成员变量hb的值与所述JVM堆的头信息的长度相加,得到所述第二被访问数据的虚拟地址,以及通过访问操作***页表,得到所述第二被访问数据的虚拟地址对应的虚拟页信息以及物理地址的相关信息。
进一步的,保存单元703,还具体用于将所述BlockId作为所述第二被访问数据的RDD信息,与所述第二被访问数据的虚拟地址、虚拟页信息和物理地址的相关信息一起组合成一条记录,并保存到所述文件中。
上述各功能单元实现各自功能的具体过程,可参考图2至图7所示的方法实施例中的相关内容,此处不再赘述。
本发明实施例提供的Spark负载访存行为追踪装置,通过针对执行区和存储区采用不同的追踪策略,打通了Spark、JVM、OS三层,使Spark语义一直延伸到硬件层,从而很容易地得到Spark访存行为是什么样的,对应的物理内存是如何响应的,这对于理解程序行为对性能的影响十分重要。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上为对本发明所提供的一种Spark负载访存行为追踪方法及装置的描述,对于本领域的技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种Spark负载访存行为追踪方法,Spark管理的内存包括执行区和存储区,其特征在于,所述方法包括:
在所述执行区,当所述Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,并保存在文件中;
在所述存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,所述哈希表以BlockId为键,以MemoryEntry为值,所述对象包括所述第二被访问数据的BlockId和MemoryEntry;
将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,所述第二被访问数据的RDD信息包括获取的BlockId。
2.如权利要求1所述的方法,其特征在于,所述在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系,具体包括:
获取所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息,将所述UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息写入第一哈希表,所述第一哈希表以所述UnsafeShuffleWriter对象的哈希码值为键,以所述第一被访问数据的RDD信息为值;
获取所述UnsafeShuffleWriter对象的哈希码值和所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值,将所述UnsafeShuffleWriter对象的哈希码值和所述ShuffleExternalSorter对象的哈希码值写入第二哈希表,所述第二哈希表以所述ShuffleExternalSorter对象的哈希码值为键,以所述UnsafeShuffleWriter对象的哈希码值为值。
3.如权利要求2所述的方法,其特征在于,所述第一被访问数据的虚拟地址的相关信息包括所述第一被访问数据的虚拟地址及其对应的虚拟页信息;
所述获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,并保存在文件中,具体包括:
获取所述ShuffleExternalSorter对象的哈希码值和为所述第一被访问数据申请的虚拟地址;
在所述第二哈希表中查找与所述ShuffleExternalSorter对象的哈希码值对应的所述UnsafeShuffleWriter对象的哈希码值;
在所述第一哈希表中查找与所述UnsafeShuffleWriter对象的哈希码值对应的所述第一被访问数据的RDD信息;
访问操作***页表,得到与所述虚拟地址对应的虚拟页信息以及物理地址的相关信息;
将所述第一被访问数据的RDD信息、虚拟地址、虚拟页信息以及物理地址的相关信息合成一条记录,并保存在所述文件中。
4.如权利要求1所述的方法,其特征在于,所述第二被访问数据的虚拟地址的相关信息包括所述第二被访问数据的虚拟地址及其对应的虚拟页信息;
所述当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,具体包括:
当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述哈希表中的BlockId和MemoryEntry,获取所述MemoryEntry的成员变量ByteBuffer数组;
利用Unsafe类提供的接口,获取所述ByteBuffer数组中每一个ByteBuffer对象的成员变量hb的值,所述成员变量hb的值为字节数组在JVM堆中的起始地址;
将所述成员变量hb的值与所述JVM堆的头信息的长度相加,得到所述第二被访问数据的虚拟地址;
通过访问操作***页表,得到所述第二被访问数据的虚拟地址对应的虚拟页信息以及物理地址的相关信息。
5.如权利要求4所述的方法,其特征在于,所述将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,具体包括:
将所述BlockId作为所述第二被访问数据的RDD信息,与所述第二被访问数据的虚拟地址、虚拟页信息和物理地址的相关信息一起组合成一条记录,并保存到所述文件中。
6.一种Spark负载访存行为追踪装置,Spark管理的内存包括执行区和存储区,其特征在于,所述装置包括:
建立单元,用于在所述执行区,当所述Spark启动ShuffleMapTask线程对第一被访问数据进行处理时,在所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值之间建立对应关系;
第一追踪单元,用于获取所述ShuffleExternalSorter为所述第一被访问数据申请的虚拟地址的相关信息以及所述虚拟地址对应的物理地址的相关信息,并根据所述UnsafeShuffleWriter对象的哈希码值、所述第一被访问数据的RDD信息以及所述ShuffleExternalSorter对象的哈希码值之间的对应关系,得到所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系;
保存单元,用于将所述第一被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系保存在文件中;
第二追踪单元,用于在所述存储区,当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述存储或读取操作的对象,并根据所述对象得到所述存储或读取操作对应的第二被访问数据的虚拟地址的相关信息以及所述第二被访问数据的虚拟地址对应的物理地址的相关信息,所述哈希表以BlockId为键,以MemoryEntry为值,所述对象包括所述第二被访问数据的BlockId和MemoryEntry;
所述保存单元,还用于将所述第二被访问数据的RDD信息、虚拟地址的相关信息以及物理地址的相关信息之间的对应关系,保存在所述文件中,所述第二被访问数据的RDD信息包括获取的BlockId。
7.如权利要求6所述的装置,其特征在于,
所述建立单元,具体用于将所述ShuffleMapTask线程调用的UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息传给第一追踪单元,通过所述第一追踪单元将所述UnsafeShuffleWriter对象的哈希码值和所述第一被访问数据的RDD信息写入第一哈希表,所述第一哈希表以所述UnsafeShuffleWriter对象的哈希码值为键,以所述第一被访问数据的RDD信息为值;
所述建立单元,还具体用于将所述UnsafeShuffleWriter对象的哈希码值和所述UnsafeShuffleWriter调用的ShuffleExternalSorter对象的哈希码值传给所述第一追踪单元,通过所述第一追踪单元将所述UnsafeShuffleWriter对象的哈希码值和所述ShuffleExternalSorter对象的哈希码值写入第二哈希表,所述第二哈希表以所述ShuffleExternalSorter对象的哈希码值为键,以所述UnsafeShuffleWriter对象的哈希码值为值。
8.如权利要求7所述的装置,其特征在于,
所述第一被访问数据的虚拟地址的相关信息包括所述第一被访问数据的虚拟地址及其对应的虚拟页信息;
所述第一追踪单元,具体用于获取所述ShuffleExternalSorter对象的哈希码值和为所述第一被访问数据申请的虚拟地址,在所述第二哈希表中查找与所述ShuffleExternalSorter对象的哈希码值对应的所述UnsafeShuffleWriter对象的哈希码值,在所述第一哈希表中查找与所述UnsafeShuffleWriter对象的哈希码值对应的所述第一被访问数据的RDD信息,访问操作***页表,得到与所述虚拟地址对应的虚拟页信息以及物理地址的相关信息;
所述保存单元,具体用于通过第一追踪单元,将所述第一被访问数据的RDD信息、虚拟地址、虚拟页信息以及物理地址的相关信息合成一条记录,并保存在所述文件中。
9.如权利要求6所述的装置,其特征在于,所述第二被访问数据的虚拟地址的相关信息包括所述第二被访问数据的虚拟地址及其对应的虚拟页信息;
所述第二追踪单元,具体用于当对MemoryStore维护的哈希表执行存储或读取操作时,获取所述哈希表中的BlockId和MemoryEntry,获取所述MemoryEntry的成员变量ByteBuffer数组,利用Unsafe类提供的接口,获取所述ByteBuffer数组中每一个ByteBuffer对象的成员变量hb的值,所述成员变量hb的值为字节数组在JVM堆中的起始地址,将所述成员变量hb的值与所述JVM堆的头信息的长度相加,得到所述第二被访问数据的虚拟地址,以及通过访问操作***页表,得到所述第二被访问数据的虚拟地址对应的虚拟页信息以及物理地址的相关信息。
10.如权利要求9所述的装置,其特征在于,所述保存单元,还具体用于将所述BlockId作为所述第二被访问数据的RDD信息,与所述第二被访问数据的虚拟地址、虚拟页信息和物理地址的相关信息一起组合成一条记录,并保存到所述文件中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710866369.4A CN107590077B (zh) | 2017-09-22 | 2017-09-22 | 一种Spark负载访存行为追踪方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710866369.4A CN107590077B (zh) | 2017-09-22 | 2017-09-22 | 一种Spark负载访存行为追踪方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107590077A CN107590077A (zh) | 2018-01-16 |
CN107590077B true CN107590077B (zh) | 2020-09-11 |
Family
ID=61047659
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710866369.4A Active CN107590077B (zh) | 2017-09-22 | 2017-09-22 | 一种Spark负载访存行为追踪方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107590077B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019056305A1 (zh) * | 2017-09-22 | 2019-03-28 | 深圳大学 | 一种Spark负载访存行为追踪方法及装置 |
CN113495679B (zh) * | 2020-04-01 | 2022-10-21 | 北京大学 | 基于非易失存储介质的大数据存储访问与处理的优化方法 |
CN111736776B (zh) * | 2020-06-24 | 2023-10-10 | 杭州海康威视数字技术股份有限公司 | 一种数据存储、读取方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170212680A1 (en) * | 2016-01-22 | 2017-07-27 | Suraj Prabhakar WAGHULDE | Adaptive prefix tree based order partitioned data storage system |
CN107179883A (zh) * | 2017-05-19 | 2017-09-19 | 深圳大学 | 一种基于SSD和HDD的混合存储***的Spark架构优化方法 |
-
2017
- 2017-09-22 CN CN201710866369.4A patent/CN107590077B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170212680A1 (en) * | 2016-01-22 | 2017-07-27 | Suraj Prabhakar WAGHULDE | Adaptive prefix tree based order partitioned data storage system |
CN107179883A (zh) * | 2017-05-19 | 2017-09-19 | 深圳大学 | 一种基于SSD和HDD的混合存储***的Spark架构优化方法 |
Non-Patent Citations (1)
Title |
---|
SPARK内存管理及缓存策略研究;孟红涛;《计算机科学》;20170630;第44卷(第6期);第31-35,74页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107590077A (zh) | 2018-01-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7930515B2 (en) | Virtual memory management | |
CN108459826B (zh) | 一种处理io请求的方法及装置 | |
US9530499B2 (en) | Semiconductor memory device and information processing device | |
CN108205577B (zh) | 一种数组构建、数组查询的方法、装置及电子设备 | |
US10552377B2 (en) | Data discard method for journaling file system and memory management apparatus thereof | |
US7870122B2 (en) | Self-tuning index for flash-based databases | |
CN111459919B (zh) | 数据查询方法、加载组件、搜索组件和存储介质 | |
CN107590077B (zh) | 一种Spark负载访存行为追踪方法及装置 | |
CN111832065A (zh) | 使用电路实现的软件和用于密钥-值存储的方法 | |
CN109976669B (zh) | 一种边缘存储方法、装置和存储介质 | |
CN112181902B (zh) | 数据库的存储方法、装置及电子设备 | |
US8782375B2 (en) | Hash-based managing of storage identifiers | |
CN104239237A (zh) | 一种tlb管理方法及装置 | |
CN115470156A (zh) | 基于rdma的内存使用方法、***、电子设备和存储介质 | |
CN107102900B (zh) | 一种共享内存空间的管理方法 | |
US20230142948A1 (en) | Techniques for managing context information for a storage device | |
US20140013054A1 (en) | Storing data structures in cache | |
US20230409235A1 (en) | File system improvements for zoned storage device operations | |
CN108614781B (zh) | 基于NANDflash的有效数据查找方法和NANDflash存储设备 | |
CN113778911A (zh) | L2p数据缓存方法、装置、可读存储介质及电子设备 | |
CN109871355B (zh) | 一种快照元数据存储方法、装置及设备、介质 | |
CN108139980A (zh) | 用于合并存储器页的方法和存储器合并功能 | |
US12038852B2 (en) | Partial logical-to-physical (L2P) address translation table for multiple namespaces | |
WO2019056305A1 (zh) | 一种Spark负载访存行为追踪方法及装置 | |
US11829341B2 (en) | Space-efficient persistent hash table data structure |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |