CN108572873A - 一种解决Spark数据倾斜问题的负载均衡方法及装置 - Google Patents
一种解决Spark数据倾斜问题的负载均衡方法及装置 Download PDFInfo
- Publication number
- CN108572873A CN108572873A CN201810374429.5A CN201810374429A CN108572873A CN 108572873 A CN108572873 A CN 108572873A CN 201810374429 A CN201810374429 A CN 201810374429A CN 108572873 A CN108572873 A CN 108572873A
- Authority
- CN
- China
- Prior art keywords
- executor
- data
- subregion
- task
- cpu
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/505—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the load
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种解决Spark数据倾斜问题的负载均衡方法,包括S1:监测计算节点的平均CPU利用率、内存利用率,Spark Executor进程启动后,初始化Executor的权重信息;S2:每个计算节点根据预设抽样比例对本地中间数据进行抽样,然后将本地抽样信息通过消息通信发送给Master节点;S3:Master节点汇总抽样信息,建立数据分布的直方图,预测数据分布总体特征;S4:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,分区过程中对大型Key进行拆分;S5:计算Executor的性能因子,每个数据分区对应一个Executor任务,将任务按照贪心策略分配给性能因子最高的Executor;S6:Executor的权重根据其负载和资源利用率动态调整,重复步骤S5直到任务分配完毕。还包括对应装置。
Description
技术领域
本发明属于在线集群资源调度技术领域,涉及一种解决Spark数据倾斜问题的负载均衡方法及装置。
背景技术
学术界和工业界广泛采用大规模的内存计算平台,处理来自不同应用程序和数据源的大量数据。这些平台通过在内存中缓存中间应用程序数据,并利用更强大、更灵活的基于有向无环图(DAG)的任务调度机制,大大减少磁盘I/O的次数。同时,基于DAG的编程范式为用户提供了表达应用程序需求的灵活性,然而,复杂的任务调度使用户识别应用程序瓶颈以及性能调优带来了巨大挑战。
Spark作为当今流行的内存计算平台,以其先进的设计理念,迅速受到学术界和工业界的追捧。Spark平台的计算效率胜过广泛使用的MapReduce的开源实现Hadoop平台,官方的测试结果表明,当数据从磁盘中读取时,Spark的计算效率是Hadoop MapReduce的10倍以上;当数据从内存中读取时,Spark的计算效率是Hadoop MapReduce的100倍。Spark通过弹性分布式数据集(RDD)设计思想及管道流计算方式,优化了应用程序的执行逻辑。当大数据应用遇到行动算子才会生成一个Spark作业(Job),而一个作业由一系列阶段组成。按照RDD的宽依赖与窄依赖关系,分为两种类型的阶段:Map阶段和Reduce阶段,如图1所示。在Map阶段中,从节点执行原始问题的部分输入数据,当执行完子问题后将结果写入内存或磁盘;在Reduce阶段中,各任务从相应节点拉取计算结果,重新组成原始问题的输出。这种并行计算模式,使得Spark能够通过集群方式,高效地处理大数据任务。
然而,在Spark的执行过程中,由于输入数据分布的不均衡以及Spark默认分区算法分配的不均衡,会出现数据倾斜问题;当发生数据倾斜时,部分任务的执行时间会明显多于其他任务,这一现象在Reduce阶段中尤其明显。由于同一阶段的任务具有同步障碍,只有在当前Stage中运行最慢的任务执行完毕时,才能开始后续阶段中任务的执行,因此,当出现数据倾斜时,会增加整个作业的总完工时间,从而降低程序执行效率,进而增加系统总能耗。
现有的Spark平台中,为了防止Straggler型任务,采用了与Hadoop MapReduce类似的推测执行机制。为了最大化系统性能,理想情况下每个任务的执行时间应大致相同。因原始输入数据的不均衡分布等原因造成任务执行时间差异巨大时,Spark检测到部分任务为Straggler型任务,会尝试在其余空闲节点以相同输入数据启动相同任务,将优先完成的任务的计算结果作为最终结果。当集群由于硬件老化、软件错误配置等原因造成部分任务运行缓慢时,Spark的推测执行机制能有效地减少作业的总完工时间。然而当产生数据倾斜的原因是由于其输入数据分布的不均衡时,Spark的推测执行机制就无能为力了。这是因为输入数据相同的任务在不同机器上重新执行会导致相同的执行时间,而冗余任务占用了集群部分资源,最终将导致整个作业的总完工时间增加。
发明内容
有鉴于此,本发明的一方面,提供一种解决Spark数据倾斜问题的负载均衡方法,该方法能够减轻任务的数据倾斜程度,加快任务执行速度。
为达到上述目的,本发明提供如下技术方案:
一种解决Spark数据倾斜问题的负载均衡方法,包括:
S1:监测计算节点的平均CPU利用率、内存利用率,Spark Executor进程启动后,初始化Executor的权重信息;
S2:每一个计算节点根据预设抽样比例对本地中间数据进行抽样,然后计算节点将本地抽样信息通过消息通信发送给Master节点;
S3:Master节点汇总所有计算节点的抽样信息,然后根据预设抽样比例,建立数据分布的直方图,预测数据分布的总体特征;
S4:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,分区过程中对大型Key进行拆分;
S5:计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
S6:在整个过程中,Executor的权重根据其负载和资源利用率动态调整,重复步骤S5直到任务分配完毕。
进一步,在步骤S1中,Executor的权重初始值
Wi=Speedcpu×(1-Rcpu)×(1-Rmem),
其中,Speedcpu为节点CPU的主频大小,Rcpu表示为节点的CPU平均利用率,Rmem表示为节点的内存利用率。
进一步,在步骤S2中,包括输入RDD数据,并对输入的RDD数据通过RDD算子计算其总记录条数rddSize,即各计算节点根据拥有的RDD数据分区,分别计算每分区的记录条数,最终汇总至Driver端;
根据预设抽样比例a计算总共需要抽取的样本大小
sampleSize=rddSize*a,
然后根据RDD的分区数量rddPartitions,计算每一个分区需要抽取的样本大小
sampleSizePerPartition=math.ceil(sampleSize/rddPartitions);
各计算节点在本地按照sampleSizePerPartition的大小对RDD数据分区进行随机抽样,各计算节点统计本地抽取样本Key值的记录数,然后通过消息通信将(Ki,Ci)发送给Master节点,其中Ki表示Key值,Ci表示相应Key值的记录数;
在步骤S3中,Master节点汇总每个RDD数据分区的样本总数,根据预设抽样比例a,估计数据的总体分布,即求出键值对集合
tuples={(K1,C1),(K2,C2),......(Km,Cm)}。
进一步,根据估算的中间数据键值对集合tuples={(K1,C1),(K2,C2),......(Km,Cm)},计算每个分区平均应该分配的键值对数量设置每个分区被分配的数据量上限为pavg,其中,n表示分区数量,pj为每个分区所包含的键值对数量,1≤j≤n,F为分区函数,F:K→{1,…n},K为中间数据键值对Key值的集合,F表示将中间数据划分到n个分区中;
然后按照Ci值降序排列tuples,依次从队头取出Key,将Ki分配给第一个剩余容量最大的分区,如果该分区剩余容量大于等于Ci,则将Ki直接分配给该分区,并修改该分区剩余容量大小,如果该分区剩余容量小于Ci,则分配该分区剩余容量大小的数据到该分区,将分配的Ki记为Ki_1,并记录Ki_1的分区归属,继续分配剩余Ki到剩余容量最大的分区,如果下次被分配的分区的剩余容量大小仍然不够,则依次将分配的Key标记为Ki_2,Ki_3,...,Ki_n,其中,1≤n≤partitionNum,partitionNum为分区数量,同时记录其分区归属,直到Ki分配完毕,重复该过程直到所有Key都完成预分区过程;如果存在Ki到Ki_1,Ki_2,...,Ki_n的转换关系,则需要将原始(Ki,Ci)转换为(Ki_1,Ci_1),(Ki_2,Ci_2),...,(Ki_n,Ci_n),即将原始Ki按照Ci_j大小转换为多个新的Ki_j,1≤j≤n;
如果当前Key在抽样集合中,则根据记录的Ki或Ki_j的分区归属信息分配Key到相应分区,否则使用默认的哈希算法分配Key到相应分区。
进一步,在步骤S4中,设置分区数量为应用预先分配的CPU核数的整数倍,即
partitionNum=λ*Coreapp,
其中,Coreapp为应用被分配的CPU核数,λ为预设的CPU核数的整数倍数,λ≥1。
进一步,引入控制系统理论中的一种负反馈调节机制,该机制在当前时刻加入上一时刻的调整量,在当前时刻为0时刻时,当前Executor的CPU利用率CUi(tj)的值为其监测值CUi′(tj),在当前时刻大于等于1时刻时,当前Executor的CPU利用率CUi(tj)的值由上一时刻CPU利用率CUi(tj-1)的值以及当前时刻的监测值CUi′(tj)共同决定,每一时刻Executor的CPU利用率的监测值CUi′(tj)直接从系统中获取,CPU利用率的负反馈调节机制为
进一步,Executor内存利用率从原始Spark系统的数据结构中间接获取,在数据存储模块的BlockManagerMasterEndpoint类中包括blockManagerIdByExecutor和blockManagerInfo两个哈希表,所述blockManagerIdByExecutor用于保留Executor和BlockManagerId的一一对应关系,所述blockManagerInfo用于维护BlockManagerId和BlockManagerInfo的一一对应关系,所述BlockManagerInfo中保存有每个BlockManagerId的内存使用状况,根据两个哈希表的传递关系,从BlockManagerInfo中得到每个Executor的剩余内存量remainingMem,每一个Executor的内存利用率
MUi=(1-remainingMem/totalMem)×100%,
其中,totalMem为每个Executor被分配的内存大小。
进一步,在步骤S6中,对Executor的权重调整的过程包括:
S61:初始化每个Executor的计算能力计数值Capabilityi以及监测次数值Counti;
S62:计算每个Executor的CPU利用率CUi以及内存利用率MUi,如果Executor的CPU利用率CUi和内存利用率MUi都没有超过其对应的CPU利用率上界CUupperbound和内存利用率上界MUupperbound,则对其计算能力计数值Capabilityi以及监测次数值Counti都增加1,否则只增加监测次数值Counti;
S63:当监测次数值Counti到达设置的调整周期T时,对Executor的权重进行调整,如果计算能力计数值Capabilityi大于α×T,就增加Executor的权重,如果计算能力计数值Capabilityi小于β×T,就减少Executor的权重,其中,α和β为预设的调节因子;
S64:每次权重调整完毕时都将计算能力计数值Capabilityi以及监测次数值Counti重新设置为0,重复该过程直到任务完成。
进一步,在步骤S5中,包括:
S51:计算每个Executor的性能因子fi=Wi/favg,
favg为所有Executor权重的平均值,
S52:按照Executor的性能因子大小降序排列所有Executor;
S53:遍历所有任务,首先将任务分配到性能因子最大的Executor上,如果该Executor的可用CPU核数大于每个任务需要的CPU核数,则在当前Executor分配该任务,同时更新该Executor的可用CPU核数,任务后续将在该Executor上以最大的数据本地性运行。
本发明的另一方面,提供了一种解决Spark数据倾斜问题的负载均衡装置,包括:
抽样模块:根据预设抽样比例对本地中间数据进行抽样,将本地抽样信息进行汇总,再根据抽样比例,建立数据分布的直方图,预测数据分布的总体特征;
均衡分区模块:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,将中间数据均衡的分配到每个分区中;
权重调整模块:当到达设置的权重调整周期时,根据其负载和资源利用率动态调整Executor的权重;
任务分配模块:计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
执行模块:用于按照所述顺序执行任务。
本发明的有益效果在于:本发明能够减轻任务的数据倾斜程度,加快任务执行速度,提高集群资源利用率,降低系统总能耗。
附图说明
为了使本发明的目的、技术方案和有益效果更加清楚,本发明提供如下附图进行说明:
图1为本发明背景技术所述的Spark集群系统的数据处理示意图;
图2为本发明实施例所述解决Spark数据倾斜问题的负载均衡方法流程图;
图3为本发明实施例所述解决Spark数据倾斜问题的负载均衡装置示意图;
图4为本发明实施例所述的解决Spark数据倾斜问题的负载均衡系统部署示意图;
图5为本发明实施例所述的解决Spark数据倾斜问题的负载均衡样例说明图。
具体实施方式
下面将结合附图,对本发明的优选实施例进行详细的描述。
如图2所示,本实施例所述的一种解决Spark数据倾斜问题的负载均衡方法,包括以下六个步骤:
S101.监测计算节点的平均CPU利用率、内存利用率,Spark Executor进程启动后,初始化Executor的权重信息;
S102.每一个计算节点根据抽样比例对本地中间数据进行抽样,该抽样比例由用户单独设置,然后计算节点将本地抽样信息通过消息通信发送给Master节点;
S103.Master节点汇总所有计算节点的抽样信息,然后根据抽样比例,建立数据分布的直方图,预测数据分布的总体特征;
S104.根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,具体倍数可以由用户指定,分区过程中对大型Key进行拆分;
S105.计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
S106.在整个过程中,Executor的权重需要根据其负载和资源利用率动态调整,重复步骤S105直到任务分配完毕。
本发明的又一实施例,如图3所示,提供了一种解决Spark数据倾斜问题的负载均衡装置300,包括:
抽样模块310:根据预设抽样比例对本地中间数据进行抽样,将本地抽样信息进行汇总,再根据抽样比例,建立数据分布的直方图,预测数据分布的总体特征;
均衡分区模块320:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,将中间数据均衡的分配到每个分区中;
权重调整模块330:当到达设置的权重调整周期时,根据其负载和资源利用率动态调整Executor的权重;
任务分配模块340:计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
执行模块350:用于按照所述顺序执行任务。
本发明实施例还提供了一种包括本发明实施例的图4所示的调度装置的Spark集群系统,该集群系统可按Spark Standalone运行架构进行部署。
可选地,Executor的权重初始值,其中,Speedcpu为节点CPU的主频大小,Rcpu表示为节点的CPU平均利用率,Rmem表示为节点的内存利用率,权重的初始值由节点CPU的主频大小、CPU利用率以及内存利用率共同决定,即初始值与节点硬件属性以及资源利用率高度相关,节点CPU的主频越大、CPU利用率越低、内存利用率越低,该Executor的空闲计算能力越大,分配数据时具有优先分配权。
可选地,对输入的RDD数据通过RDD算子计算其总记录条数rddSize,即各计算节点根据拥有的RDD数据分区,分别计算每分区的记录条数,最终汇总至Driver端;根据设置的抽样比例a计算总共需要抽取的样本大小sampleSize=rddSize*a,然后根据RDD的分区数量rddPartitions,计算每一个分区需要抽取的样本大小
sampleSizePerPartition=math.ceil(sampleSize/rddPartitions);
各计算节点在本地按照sampleSizePerPartition的大小对RDD数据分区进行随机抽样,各计算节点统计本地抽取样本Key值的记录数,然后通过消息通信将(Ki,Ci)发送给Master节点,其中Ki表示Key值,Ci表示相应Key值的记录数;Master节点汇总每个RDD数据分区的样本总数,根据设置的抽样比例a,估计数据的总体分布,即求出键值对集合tuples={(K1,C1),(K2,C2),......(Km,Cm)}。
可选地,根据估算的中间数据键值对集合tuples={(K1,C1),(K2,C2),......(Km,Cm)},计算每个分区平均应该分配的键值对数量设置每个分区被分配的数据量上限为pavg,其中,n表示分区数量,pj为每个分区所包含的键值对数量,1≤j≤n,F为分区函数,F:K→{1,…n},K为中间数据键值对Key值的集合,F表示将中间数据划分到n个分区中;然后按照Ci值降序排列tuples,依次从队头取出Key,将Ki分配给第一个剩余容量最大的分区,如果该分区剩余容量大于等于Ci,则将Ki直接分配给该分区,并修改该分区剩余容量大小,如果该分区剩余容量小于Ci,则分配该分区剩余容量大小的数据到该分区,将分配的Ki记为Ki_1,并记录Ki_1的分区归属,继续分配剩余Ki到剩余容量最大的分区,如果下次被分配的分区的剩余容量大小仍然不够,则依次将分配的Key标记为Ki_2,Ki_3,...,Ki_n,其中,1≤n≤partitionNum,partitionNum为分区数量,同时记录其分区归属,直到Ki分配完毕,重复该过程直到所有Key都完成预分区过程;如果存在Ki到Ki_1,Ki_2,...,Ki_n的转换关系,则需要将原始(Ki,Ci)转换为(Ki_1,Ci_1),(Ki_2,Ci_2),...,(Ki_n,Ci_n),即将原始Ki按照Ci_j大小转换为多个新的Ki_j,1≤j≤n;如果当前Key在抽样集合中,则根据记录的Ki或Ki_j的分区归属信息分配Key到相应分区,否则使用默认的哈希算法分配Key到相应分区。
可选地,为了最大化应用预先分配的资源,设置分区数量为应用预先分配的CPU核数的整数倍,即partitionNum=λ*Coreapp,其中,Coreapp为应用被分配的CPU核数,λ为预设的CPU核数的整数倍数,λ≥1,具体倍数可以由用户自行设置。
可选地,为了减少CPU利用率的抖动误差,引入控制系统理论中的一种负反馈调节机制,该机制在当前时刻加入上一时刻的调整量,即,在当前时刻为0时刻时,当前Executor的CPU利用率CUi(tj)的值为其监测值CUi′(tj),在当前时刻大于等于1时刻时,当前Executor的CPU利用率CUi(tj)的值由上一时刻CPU利用率CUi(tj-1)的值以及当前时刻的监测值CUi′(tj)共同决定,而每一时刻Executor的CPU利用率的监测值CUi′(tj)直接从系统中获取,CPU利用率的负反馈调节机制为
可选地,Executor内存利用率从原始Spark系统的数据结构中间接获取。在数据存储模块的BlockManagerMasterEndpoint类中存在blockManagerIdByExecutor和blockManagerInfo两个哈希表,前者保留了Executor和BlockManagerId的一一对应关系,后者维护了BlockManagerId和BlockManagerInfo的一一对应关系,而BlockManagerInfo中保存了每一个BlockManagerId的内存使用状况,根据两个哈希表的传递关系,可以从BlockManagerInfo中得到每个Executor的剩余内存量remainingMem,每个Executor被分配的内存大小在应用提交时就已经确定,则每一个Executor的内存利用率MUi=(1-remainingMem/totalMem)×100%,其中,totalMem为每个Executor被分配的内存大小。
可选地,计算节点的每个Executor的空闲计算能力是随着其资源使用状况动态变化的,需要在任务执行的过程中对每个Executor的空闲计算能力进行度量,当到达设置的权重调整周期时对Executor的权重进行调整,具体的调整过程为:初始化每个Executor的计算能力计数值Capabilityi以及监测次数值Counti;计算每个Executor的CPU利用率CUi以及内存利用率MUi,如果Executor的CPU利用率CUi和内存利用率MUi都没有超过其对应的CPU利用率上界CUupperbound和内存利用率上界MUupperbound,则对其计算能力计数值Capabilityi以及监测次数值Counti都增加1,否则只增加监测次数值Counti;当监测次数值Counti到达设置的调整周期时T,正式开始对Executor的权重进行调整,如果计算能力计数值Capabilityi大于α×T,则说明当前Executor在周期T内有大于α×T次处于不饱和状态,其空闲计算能力较高,可以执行更多任务,即增加其权重,反之,如果计算能力计数值Capabilityi小于β×T,则说明当前Executor在周期T内有小于β×T次处于不饱和状态,其计算负载较高,应该减少任务的分配,即将其权重减少,其中,α和β为调节因子,由用户根据场景进行设置,在实践中根据经验默认设置为0.8和0.2;每次权重调整完毕时都将计算能力计数值Capabilityi以及监测次数值Counti重新设置为0,重复该过程直到任务完成。
可选地,为了降低计算复杂度,任务分配时主要采取贪心策略,首先计算每个Executor的性能因子fi=Wi/favg,favg为所有Executor权重的平均值,按照Executor的性能因子大小降序排列所有Executor;遍历所有任务,首先将任务分配到性能因子最大的Executor上,如果该Executor的可用CPU核数大于每个任务需要的CPU核数(默认为1核),则在当前Executor分配该任务,同时更新该Executor的可用CPU核数,任务后续将在该Executor上以最大的数据本地性运行;如果任务需要分配多轮,则重复该过程直到所有任务分配完成。
以下通过具体实例来进一步说明本发明各实施例:
如图5所示,假设一个Spark应用中存在3种Key(K1,K2,K3),且需要将其分为3个分区,通过抽样算法估计K1,K2,K3的数量分别为2000、200、100,每个分区平均应该分配的键值对数量为767,将3个分区被分配的数据量上限设置为767,首先对K1进行分配,将K1分配到第1个分区上,由于该分区剩余容量767小于K1数量2000,故分配767个Key到第1个分区上,将这部分Key记为Ki_1,继续分配剩余K1,由于第2个分区剩余容量767小于K1剩余数量1233,故分配767个Key到第2个分区上,将这部分Key记为Ki_2,继续分配剩余K1,由于第3个分区剩余容量767大于K1剩余数量466,则将剩余的K1全部分配到第3个分区,将这部分Key记为Ki_3,K1分配完毕,此时第3个分区剩余容量大小为301,同理分配K2,K3到第3个分区上,此时,3个分区上被分配的键值对数量分别为767、767、766,各分区间的键值对数量大致相同。每一个数据分区对应为一个Executor任务,将任务按照贪心策略分配给性能因子最高的Executor,Executor的权重需要Wi=Speedcpu×(1-Rcpu)×(1-Rmem)根据其负载和资源利用率动态调整,重复该步骤直到任务分配完毕。
最后说明的是,以上优选实施例仅用以说明本发明的技术方案而非限制,尽管通过上述优选实施例已经对本发明进行了详细的描述,但本领域技术人员应当理解,可以在形式上和细节上对其作出各种各样的改变,而不偏离本发明权利要求书所限定的范围。
Claims (10)
1.一种解决Spark数据倾斜问题的负载均衡方法,其特征在于:包括:
S1:监测计算节点的平均CPU利用率、内存利用率,SparkExecutor进程启动后,初始化Executor的权重信息;
S2:每一个计算节点根据预设抽样比例对本地中间数据进行抽样,然后计算节点将本地抽样信息通过消息通信发送给Master节点;
S3:Master节点汇总所有计算节点的抽样信息,然后根据预设抽样比例,建立数据分布的直方图,预测数据分布的总体特征;
S4:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,分区过程中对大型Key进行拆分;
S5:计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
S6:在整个过程中,Executor的权重根据其负载和资源利用率动态调整,重复步骤S5直到任务分配完毕。
2.根据权利要求1所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:在步骤S1中,Executor的权重初始值
Wi=Speedcpu×(1-Rcpu)×(1-Rmem),
其中,Speedcpu为节点CPU的主频大小,Rcpu表示为节点的CPU平均利用率,Rmem表示为节点的内存利用率。
3.根据权利要求2所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:在步骤S2中,包括输入RDD数据,并对输入的RDD数据通过RDD算子计算其总记录条数rddSize,即各计算节点根据拥有的RDD数据分区,分别计算每分区的记录条数,最终汇总至Driver端;
根据预设抽样比例a计算总共需要抽取的样本大小
sampleSize=rddSize*a,
然后根据RDD的分区数量rddPartitions,计算每一个分区需要抽取的样本大小
sampleSizePerPartition=math.ceil(sampleSize/rddPartitions);
各计算节点在本地按照sampleSizePerPartition的大小对RDD数据分区进行随机抽样,各计算节点统计本地抽取样本Key值的记录数,然后通过消息通信将(Ki,Ci)发送给Master节点,其中Ki表示Key值,Ci表示相应Key值的记录数;
在步骤S3中,Master节点汇总每个RDD数据分区的样本总数,根据预设抽样比例a,估计数据的总体分布,即求出键值对集合
tuples={(K1,C1),(K2,C2),......(Km,Cm)}。
4.根据权利要求3所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:根据估算的中间数据键值对集合
tuples={(K1,C1),(K2,C2),......(Km,Cm)},
计算每个分区平均应该分配的键值对数量
设置每个分区被分配的数据量上限为pavg,其中,n表示分区数量,pj为每个分区所包含的键值对数量,
其中F为分区函数,F:K→{1,…n},K为中间数据键值对Key值的集合,F表示将中间数据划分到n个分区中;
然后按照Ci值降序排列tuples,依次从队头取出Key,将Ki分配给第一个剩余容量最大的分区,如果该分区剩余容量大于等于Ci,则将Ki直接分配给该分区,并修改该分区剩余容量大小,如果该分区剩余容量小于Ci,则分配该分区剩余容量大小的数据到该分区,将分配的Ki记为Ki_1,并记录Ki_1的分区归属,继续分配剩余Ki到剩余容量最大的分区,如果下次被分配的分区的剩余容量大小仍然不够,则依次将分配的Key标记为Ki_2,Ki_3,...,Ki_n,其中,1≤n≤partitionNum,partitionNum为分区数量,同时记录其分区归属,直到Ki分配完毕,重复该过程直到所有Key都完成预分区过程;如果存在Ki到Ki_1,Ki_2,...,Ki_n的转换关系,则需要将原始(Ki,Ci)转换为(Ki_1,Ci_1),(Ki_2,Ci_2),...,(Ki_n,Ci_n),即将原始Ki按照Ci_j大小转换为多个新的Ki_j,1≤j≤n;
如果当前Key在抽样集合中,则根据记录的Ki或Ki_j的分区归属信息分配Key到相应分区,否则使用默认的哈希算法分配Key到相应分区。
5.根据权利要求4所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:在步骤S4中,设置分区数量为应用预先分配的CPU核数的整数倍,即
partitionNum=λ*Coreapp,
其中,Coreapp为应用被分配的CPU核数,λ为预设的CPU核数的整数倍数,λ≥1。
6.根据权利要求5所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:引入控制系统理论中的一种负反馈调节机制,该机制在当前时刻加入上一时刻的调整量,在当前时刻为0时刻时,当前Executor的CPU利用率CUi(tj)的值为其监测值CUi′(tj),在当前时刻大于等于1时刻时,当前Executor的CPU利用率CUi(tj)的值由上一时刻CPU利用率CUi(tj-1)的值以及当前时刻的监测值CUi′(tj)共同决定,每一时刻Executor的CPU利用率的监测值CUi′(tj)直接从系统中获取,CPU利用率的负反馈调节机制为
7.根据权利要求6所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:Executor内存利用率从原始Spark系统的数据结构中间接获取,在数据存储模块的BlockManagerMasterEndpoint类中包括blockManagerIdByExecutor和blockManagerInfo两个哈希表,所述blockManagerIdByExecutor用于保留Executor和BlockManagerId的一一对应关系,所述blockManagerInfo用于维护BlockManagerId和BlockManagerInfo的一一对应关系,所述BlockManagerInfo中保存有每个BlockManagerId的内存使用状况,根据两个哈希表的传递关系,从BlockManagerInfo中得到每个Executor的剩余内存量remainingMem,每一个Executor的内存利用率
MUi=(1-remainingMem/totalMem)×100%,
其中,totalMem为每个Executor被分配的内存大小。
8.根据权利要求7所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:在步骤S6中,对Executor的权重调整的过程包括:
S61:初始化每个Executor的计算能力计数值Capabilityi以及监测次数值Counti;
S62:计算每个Executor的CPU利用率CUi以及内存利用率MUi,如果Executor的CPU利用率CUi和内存利用率MUi都没有超过其对应的CPU利用率上界CUupperbound和内存利用率上界MUupperbound,则对其计算能力计数值Capabilityi以及监测次数值Counti都增加1,否则只增加监测次数值Counti;
S63:当监测次数值Counti到达设置的调整周期T时,对Executor的权重进行调整,如果计算能力计数值Capabilityi大于α×T,就增加Executor的权重,如果计算能力计数值Capabilityi小于β×T,就减少Executor的权重,其中,α和β为预设的调节因子;
S64:每次权重调整完毕时都将计算能力计数值Capabilityi以及监测次数值Counti重新设置为0,重复该过程直到任务完成。
9.根据权利要求8所述的解决Spark数据倾斜问题的负载均衡方法,其特征在于:在步骤S5中,包括:
S51:计算每个Executor的性能因子fi=Wi/favg,
favg为所有Executor权重的平均值,
S52:按照Executor的性能因子大小降序排列所有Executor;
S53:遍历所有任务,首先将任务分配到性能因子最大的Executor上,如果该Executor的可用CPU核数大于每个任务需要的CPU核数,则在当前Executor分配该任务,同时更新该Executor的可用CPU核数,任务后续将在该Executor上以最大的数据本地性运行。
10.一种解决Spark数据倾斜问题的负载均衡装置,其特征在于:包括:
抽样模块:对输入数据进行抽样分析,预测数据分布的总体特征;
均衡分区模块:根据数据分布情况,将数据划分为多个分区,分区数为所有Executor总核数的整数倍,将中间数据均衡的分配到每个分区中;
权重调整模块:当到达设置的权重调整周期时,根据其负载和资源利用率动态调整Executor的权重;
任务分配模块:计算Executor的性能因子,每一个数据分区对应为一个Executor任务,然后将任务按照贪心策略分配给性能因子最高的Executor;
执行模块:用于按照所述顺序执行任务。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810374429.5A CN108572873B (zh) | 2018-04-24 | 2018-04-24 | 一种解决Spark数据倾斜问题的负载均衡方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810374429.5A CN108572873B (zh) | 2018-04-24 | 2018-04-24 | 一种解决Spark数据倾斜问题的负载均衡方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108572873A true CN108572873A (zh) | 2018-09-25 |
CN108572873B CN108572873B (zh) | 2021-08-24 |
Family
ID=63574460
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810374429.5A Active CN108572873B (zh) | 2018-04-24 | 2018-04-24 | 一种解决Spark数据倾斜问题的负载均衡方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108572873B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109582119A (zh) * | 2018-11-28 | 2019-04-05 | 重庆邮电大学 | 基于动态电压频率调整的双层Spark节能调度方法 |
CN110069502A (zh) * | 2019-04-24 | 2019-07-30 | 东南大学 | 基于Spark架构的数据均衡分区方法及计算机存储介质 |
CN110262896A (zh) * | 2019-05-31 | 2019-09-20 | 天津大学 | 一种面向Spark系统的数据处理加速方法 |
CN110442594A (zh) * | 2019-07-18 | 2019-11-12 | 华东师范大学 | 一种面向Spark SQL聚集算子的动态执行方法 |
CN110502505A (zh) * | 2019-08-29 | 2019-11-26 | 中国农业银行股份有限公司 | 一种数据迁移方法及装置 |
CN110543366A (zh) * | 2019-08-27 | 2019-12-06 | 上海易点时空网络有限公司 | 用于业务集群的业务模块容量调优方法以及装置、服务器 |
CN111339064A (zh) * | 2020-03-03 | 2020-06-26 | 中国平安人寿保险股份有限公司 | 数据倾斜矫正方法、装置及计算机可读存储介质 |
CN111522647A (zh) * | 2020-07-01 | 2020-08-11 | 金陵科技学院 | 一种最小化租赁成本的公有云服务租赁方法 |
CN112000467A (zh) * | 2020-07-24 | 2020-11-27 | 广东技术师范大学 | 一种数据倾斜处理方法、装置、终端设备及存储介质 |
CN112068959A (zh) * | 2020-09-04 | 2020-12-11 | 北京明略昭辉科技有限公司 | 自适应任务调度方法、系统及包括该方法的检索方法 |
CN113868230A (zh) * | 2021-10-20 | 2021-12-31 | 重庆邮电大学 | 一种基于Spark计算框架的大表连接优化方法 |
CN114201296A (zh) * | 2021-12-09 | 2022-03-18 | 厦门美亚亿安信息科技有限公司 | 一种基于流式处理平台的数据平衡方法和系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110288837A1 (en) * | 2010-05-21 | 2011-11-24 | Fisher-Rosemount Systems, Inc. | Multi-Stage Process Modeling Method |
CN107220123A (zh) * | 2017-05-25 | 2017-09-29 | 郑州云海信息技术有限公司 | 一种解决Spark数据倾斜方法及系统 |
CN107506388A (zh) * | 2017-07-27 | 2017-12-22 | 浙江工业大学 | 一种面向Spark并行计算框架的迭代式数据均衡优化方法 |
US20170371892A1 (en) * | 2016-06-22 | 2017-12-28 | Aol Advertising Inc. | Systems and methods for dynamic partitioning in distributed environments |
-
2018
- 2018-04-24 CN CN201810374429.5A patent/CN108572873B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110288837A1 (en) * | 2010-05-21 | 2011-11-24 | Fisher-Rosemount Systems, Inc. | Multi-Stage Process Modeling Method |
US20170371892A1 (en) * | 2016-06-22 | 2017-12-28 | Aol Advertising Inc. | Systems and methods for dynamic partitioning in distributed environments |
CN107220123A (zh) * | 2017-05-25 | 2017-09-29 | 郑州云海信息技术有限公司 | 一种解决Spark数据倾斜方法及系统 |
CN107506388A (zh) * | 2017-07-27 | 2017-12-22 | 浙江工业大学 | 一种面向Spark并行计算框架的迭代式数据均衡优化方法 |
Non-Patent Citations (2)
Title |
---|
陈少总: "基于Spark的分布式频繁项集挖掘算法研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
黄超杰: "Spark中的数据均衡分配算法研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109582119A (zh) * | 2018-11-28 | 2019-04-05 | 重庆邮电大学 | 基于动态电压频率调整的双层Spark节能调度方法 |
CN110069502A (zh) * | 2019-04-24 | 2019-07-30 | 东南大学 | 基于Spark架构的数据均衡分区方法及计算机存储介质 |
CN110262896A (zh) * | 2019-05-31 | 2019-09-20 | 天津大学 | 一种面向Spark系统的数据处理加速方法 |
CN110442594A (zh) * | 2019-07-18 | 2019-11-12 | 华东师范大学 | 一种面向Spark SQL聚集算子的动态执行方法 |
CN110543366A (zh) * | 2019-08-27 | 2019-12-06 | 上海易点时空网络有限公司 | 用于业务集群的业务模块容量调优方法以及装置、服务器 |
CN110502505A (zh) * | 2019-08-29 | 2019-11-26 | 中国农业银行股份有限公司 | 一种数据迁移方法及装置 |
CN111339064A (zh) * | 2020-03-03 | 2020-06-26 | 中国平安人寿保险股份有限公司 | 数据倾斜矫正方法、装置及计算机可读存储介质 |
CN111522647A (zh) * | 2020-07-01 | 2020-08-11 | 金陵科技学院 | 一种最小化租赁成本的公有云服务租赁方法 |
CN111522647B (zh) * | 2020-07-01 | 2020-10-27 | 金陵科技学院 | 一种最小化租赁成本的公有云服务租赁方法 |
CN112000467A (zh) * | 2020-07-24 | 2020-11-27 | 广东技术师范大学 | 一种数据倾斜处理方法、装置、终端设备及存储介质 |
CN112068959A (zh) * | 2020-09-04 | 2020-12-11 | 北京明略昭辉科技有限公司 | 自适应任务调度方法、系统及包括该方法的检索方法 |
CN113868230A (zh) * | 2021-10-20 | 2021-12-31 | 重庆邮电大学 | 一种基于Spark计算框架的大表连接优化方法 |
CN113868230B (zh) * | 2021-10-20 | 2024-06-04 | 重庆邮电大学 | 一种基于Spark计算框架的大表连接优化方法 |
CN114201296A (zh) * | 2021-12-09 | 2022-03-18 | 厦门美亚亿安信息科技有限公司 | 一种基于流式处理平台的数据平衡方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108572873B (zh) | 2021-08-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108572873A (zh) | 一种解决Spark数据倾斜问题的负载均衡方法及装置 | |
CN109993299B (zh) | 数据训练方法及装置、存储介质、电子装置 | |
CN107704069B (zh) | 一种基于能耗感知的Spark节能调度方法 | |
CN106790726A (zh) | 一种基于Docker云平台的优先级队列动态反馈负载均衡资源调度方法 | |
Tantalaki et al. | Pipeline-based linear scheduling of big data streams in the cloud | |
CN103401939A (zh) | 一种采用混合调度策略的负载均衡方法 | |
CN114816715B (zh) | 一种面向跨地域的流计算延迟优化方法及装置 | |
CN105975345B (zh) | 一种基于分布式内存的视频帧数据动态均衡存储管理方法 | |
CN111309472A (zh) | 一种基于虚拟机预部署的在线虚拟资源分配方法 | |
CN112559122B (zh) | 一种基于电力专用安防设备的虚拟化实例管控方法及系统 | |
US20210390405A1 (en) | Microservice-based training systems in heterogeneous graphic processor unit (gpu) cluster and operating method thereof | |
CN115237580B (zh) | 面向智能计算的流水并行训练自适应调整系统、方法 | |
CN107566535A (zh) | 一种Web地图服务中基于用户并发访问时序规则的自适应负载均衡策略 | |
US20220300323A1 (en) | Job Scheduling Method and Job Scheduling Apparatus | |
Komarasamy et al. | A novel approach for Dynamic Load Balancing with effective Bin Packing and VM Reconfiguration in cloud | |
CN115454649A (zh) | 面向空间操控仿真模型计算的动态任务调度系统 | |
CN108228356A (zh) | 一种流数据的分布式动态处理方法 | |
CN107370783B (zh) | 一种云计算集群资源的调度方法及装置 | |
CN112612613B (zh) | 用于在虚拟分布式异构环境下实现多gpu调度的方法和系统 | |
CN105335236B (zh) | 一种分布式取证动态负载均衡调度方法和装置 | |
CN110990059B (zh) | 一种用于倾斜数据的流式计算引擎运行方法及系统 | |
CN105740077A (zh) | 一种适用于云计算的任务分配方法 | |
CN108304253A (zh) | 基于缓存感知和数据本地性的map任务调度方法 | |
Kumar et al. | Graphsteal: Dynamic re-partitioning for efficient graph processing in heterogeneous clusters | |
CN117453360A (zh) | 计算任务的资源调度方法及装置 |
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 |