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 | If(totalMemory<=minContiner){ |
总结
例如某个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 问题点
- dag排布的规则是什么?