0%

Spark资源评估

1 Spark资源评估

机器机型 内存 硬盘 核数
M10 128G 3.6T 48
BX1 16G×16 256G 4T×12=48T 80
CG3 256G 3.6T 96

1.1 Spark On Yarn 内存计算

在介绍了,spark任务在yarn运行时需要的Continer数量,以及内存大小之后,我们再来看spark on yarn的时候整体任务在yarn中占用资源大小。

Core: yarn中Core指的是Continer数量,所以Core = ContinerNum

而内存的计算则较为复杂了,设单个Continer向集群申请的资源经我们上面公式算出来的需要申请的内存大小为:excutorTotalMemory ,则该Continer在yarn集群上占用的最终资源为continerMemory。
minContiner = yarn.scheduler.minimum-allocation-mb(continer分配资源的最小值,目前是128)
Increment = yarn.scheduler.increment-allocation-mb(yarn分配资源的增量,也叫规整化参数,默认值为1024 mb)
resultMemory的计算方式如下所示:

1
2
3
4
5
If(totalMemory<=minContiner){
continerMemory = minContiner
}else{
continerMemory = minContiner + Math.ceil((excutorTotalMemory - minContiner)/increment) * increment
}

总结

例如某个spark任务的提交参数为,driverMemory=2G,executorMemory=2G,executorNum = 1
minContiner=512m
Increment =1024m
则该任务
executorContinerMemory计算过程如下

申请资源数:executor = Max(executorMemory*0.1,384M)+executorMemory=2432M
ContinerMymory = 512+Math.ceil((2432-512)/1024.0)*1024 = 2.5G

driverContinerMemory计算过程同上:2.5G
最终该任务在yarn消耗资源为5G
可以看出来,spark任务最终消耗资源并非为初始化资源数。

需要join 75张表,每张表的主键分布不同:

  • 直接join会造成数据倾斜,某个节点撑爆
  • 所有的表都shuffle,会造成shuffle数据量太多,撑爆硬盘

申请的资源:

策略一:

  • join后的表,每隔join20次则repartition一次
  • 待join的子表,partition个数超过30,或行数超过1.5亿,则repartition一次

宽表数据量:

1.2 问题点

  1. dag排布的规则是什么?