一种Spark框架Shuffle过程中存储与计算分离的重构实现方法技术

技术编号:37270009 阅读:8 留言:0更新日期:2023-04-20 23:39
该专利主要针对Spark框架的Shuffle层进行存储和计算的分离,通过使用gRPC,将需要Shuffle的数据发送到Rocksdb数据库,将数据直接写进Rocksdb,并且进行Shuffle的聚合操作,再通过读取数据库的方式,将聚合的结果读出来,完成原Shuffle的一系列操作。相对于原Spark的操作,此方法在执行Shuffle的时候可以完全隔离内存和持久化操作,全部由Rocksdb进行替代,提升了性能,降低了分布式大数据处理的成本。的成本。

【技术实现步骤摘要】
一种Spark框架Shuffle过程中存储与计算分离的重构实现方法


[0001]此专利所属领域为信息技术,为计算机科学领域中人工智能与大数据方向的研究调查以及落地实施的专利技术型总结专利。本专利技术的领域为大数据处理,提出一种对原生Spark的shuffle(洗牌,本说明书中shuffle和洗牌具有相同含义)过程进行存储和计算的分离设计方法,对shuffle阶段的内存持久化进行,从整体上降低系统的内存使用,并且提升了一定的性能,降低了分布式数据处理的成本。

技术介绍

[0002]目前,在大数据领域,最常用的项目和科研大数据框架是Spark框架和Flink框架。在工程中,大数据的作用往往是为人工智能算法分析铺路的重要部分。在实时或离线的数据处理和分析中,将要对数据实施集中的数据清洗以及过滤操作,计算和处理人工智能的数据集。这是工程大数据开发的主要作用。
[0003]在执行Spark框架的Shuffle运算时,Shuffle的读取阶段会将内存和磁盘中的数据进行一个整合的过程,整合结束,会生成一个全新的RDD,而原本的数据也就通过key值,合并成了一个全新的数据类型,而Mapper到Shuffle的过程保证了每一个partition中的key都是完全相同的,之后再利用聚合的方法进行归并。这里主要存在的问题是,如果中间步骤产生的key杂乱无章,就会产生过多的partition,导致大量磁盘IO操作,带来很大的性能损耗。
[0004]目前国外有一些技术驱动的公司开始着手针对Spark的底层原理进行优化,主要优化的方法主要针对于Shuffle本身带来的频繁的读取问题去进行优化,例如Intel公司推出了一种名为Persistent Memory的元件,从硬件角度上去进行性能优化。本专利技术从重构Shuffle处理流程的思路,提出一种存储和计算分离的架构设计与实现方法,是一种较新颖的性能优化方法。

技术实现思路

[0005]本专利技术要解决的技术问题是:
[0006]针对原生Spark的shuffle过程,提出一种计算与存储分离的重构优化方法,目标为减少shuffle过程中的磁盘IO对数据处理性能的影响,缩短数据处理的时间。
[0007]本专利技术的技术方案是:
[0008]对Shuffle阶段的存储和计算功能进行解耦,将Shuffle写入阶段的数据直接发送到一类键值对类型的非关系型数据库(本实施方案选择Rocksdb)上进行聚合;在读取数据的时候,再调用gRPC方法返回客户端完成一次Shuffle操作。总体来说,给Shuffle模块新增了两个组件storage和scheduler(具体细节在实施方式中详细说明)。此外还有各个模块之间以及每一个模块与driver mapper reducer端的RPC通信功能。
具体实施方式
[0009]首先分别介绍storage和scheduler的实施方式。
[0010](1)Storage的设计与实施
[0011]此部分采用rust语言开发了Shuffle Service的分布式存储系统,在数据存储方面,选用了键值对类型的非关系型数据库。
[0012]本专利技术让Mapper针对Executor微批次发送数据单元,当Executor的存储层拉取到数据之后,本地指定一个唯一的key,value存储的就是数据本身,之后每过一段时间,令reducer端针对Rocksdb本身的value进行聚合操作,合并key,进行Shuffle本身的核心操作。在这里,为了解决溢出写的性能问题,针对storage存储层增加了一个Scheduler调度器。
[0013]Storage运行在多个节点,为整个系统提供存储功能。节点之间不再需要通信聚集当前计算的结果,而是各自独立运行Rocksdb作为kv存储系统。各个节点定期去往scheduler节点发送心跳,汇报自身情况。但是storage节点本身具备对key进行排序以及合并mapper的功能。
[0014]本专利技术中mapper将处理好的中间结果发送给storage部分。storage本质是一个基于Rocksdb数据库的分布式存储集群。通过哈希算法将序列化之后的数据,根据原数据所在的partitionId作为key,发送到Rocksdb之后,再将这些key使用随机算法打散,解决数据倾斜问题。最后reducer再去storage上去拉取数据消费。其中,mapper的过程始终在内存上完成,但是如果内存不够,就会溢写到磁盘上,在整个ResultStage都结束之后,会清除这些溢写内容。
[0015](2)Scheduler的设计与实施
[0016]针对reducer对storage的存储器Rocksdb的value做merge的时候产生的大量IO延迟会延迟操作系统响应,并导致async

reader和writer的工作无法正常协调的问题。本专利技术设计了scheduler部分,它从某种角度和zookeeper有异曲同工之妙,可以根据storage读写的频率调度不同的方案去匹配系统性能。
[0017]Spark的Shuffle Executor中有一个会影响到系统整体性能的关键设计,就是溢写。当Executor所能处理的数据达到了内存的上限时,就会溢写到磁盘。当reducer的数据准备聚合的时候,会对这些溢写的数据进行异步读。此专利技术通过Scheduler可以自由监控storage的内存使用情况,如果当前的数据已经要达到溢出,会产生报警通知,并且通知给当前集群下的所有storage节点,并且将多余的数据加载到消息队列中,做一个数据的阻塞,这样还可以保证系统本身的安全,当内存足够了之后,就可以将消息队列的数据,再去让reducer拉取过来进行一个聚合操作。
[0018]Scheduler负责根据心跳信息更新storage的状态,响应driver端对获取storage列表和删除Shuffle数据的请求。接受driver的心跳是为了能在故障的时候删除对应的Shuffle数据。
[0019]执行driver的时候,实际上是在客户端所创建的线程的数量,线程有多少,就会创建多少个mapper,这个时候mapper里面可能会有很多很多个[k,v]对,然后不同的mapper里面可能会有若干相同的[k,v],然后用Rocksdb进行merge操作,merge的过程都是在内存中进行的,如果内存不够用,会自然的形成网络的阻塞,这部分是写入的过程。同时,创建的
mapper的数量也要和partition的数量是一样的,实际上storage是将key完成了一个聚合操作,最后用read方法读出来一个迭代器返回给reducer。
本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.通过引入独立的存储层对Spark框架shuffle过程中的存储与计算进行解耦重构。a)使用键值对类型的非关系型数据库Rocksdb集群来实现独立的存储层。b)使用Scheduler模块...

【专利技术属性】
技术研发人员:陈志付一健
申请(专利权)人:天津工业大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1