、
1、前置知识
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
是否为超线程?
如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。
2、由以上知识计算出单台机器的逻辑总核数。
公理:每个executor分配2~4个core比较合适。但是也要受资源队列的限制。
推理1:集群总核数A=(节点总逻辑核数-1)*节点数
减一是为了给Hadoop等相关守护进程留下一个核心。
推理2:应用程序executor数B=(集群总核数A/每个executor核心数)-1
减一是为了给AM留下一个executor
推理3:每个节点executor数C=应用程序executor数B/节点数
推理4:每个executor的内存D=节点内存/每个节点executor数C
3、关于spark.default.parallelism并行度设置
spark.storage.memoryFraction
参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。
参数调优建议