0. SparkConfiguration

SparkConfiguration

Spark 提供了三个地方来设置配置参数:

Spark properties
控制着绝大多数的参数设置, 一般可以通过 SparkConf 对象来进行设置, 又或者是通过 Java 系统参数.
在提交命令中加入 --conf 一般也可以进行设置.
环境变量
可以为每台机器配置单独的环境变量, 通过在 每个节点上 conf/spark-env.sh 进行配置
日志
通过 log4j.properties来进行配置.
Spark Properties
Spark 属性控制大多数应用程序设置,并为每个应用程序单独配置。这些属性可以直接在 SparkConf 上设置并传递给您的 SparkContext。
SparkConf 可以让你配置一些常见的属性(例如 master URL 和应用程序名称),以及通过 set() 方法来配置任意 key-value pairs(键值对)。

val conf = new SparkConf()
         .setMaster("local[2]")
         .setAppName("CountingSheep")
val sc = new SparkContext(conf)

一些时间类型的配置, 其接收的时间格式如下:

25ms (milliseconds)
5s (seconds)
10m or 10min (minutes)
3h (hours)
5d (days)
1y (years)

一些存储类型的配置, 其接收的格式如下:

1b (bytes)
1k or 1kb (kibibytes = 1024 bytes)
1m or 1mb (mebibytes = 1024 kibibytes)
1g or 1gb (gibibytes = 1024 mebibytes)
1t or 1tb (tebibytes = 1024 gibibytes)
1p or 1pb (pebibytes = 1024 tebibytes)

通常情况下来说 默认的单位都是 bytes, 但也有一小部分的 默认单位是 kb 或 mb, 因此在查看文档时, 需要注意其单位.

然而, 在某些情况下, 我们并不想要通过 硬编码的方式 将配置参数 写在 Spark代码里. 很明显的, 不够灵活.

因此有另一种方式传入参数, 当然, 这种传参的优先级是要低于 将配置写在代码里的.

./bin/spark-submit --name "My app" --master local[4] 
--conf spark.eventLog.enabled=false
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" 
myApp.jar

对于上面这种传参方式, 除了一些比较特别的参数, 必须参数, 如 master, name这种参数, 其他的都可以通过 --conf 传入. 
可以通过 ./bin/spark-submit --help 展示这些可用参数.

当然, 即使是动态传参, 我们也并不仅仅支持这一种方式.

通过 conf/spark-defaults.conf 也可以进行传参. 不过优先级更低于上一种方式. 将参数名称与值 通过空格隔开即可.

spark.master            spark://5.6.7.8:7077
spark.executor.memory   4g
spark.eventLog.enabled  true
spark.serializer        org.apache.spark.serializer.KryoSerializer

在设置参数的过程中:

spark-defaults.conf的优先级最低, 其次是 --conf 最高的是 SparkConf.set(), 另外一点需要注意的是, 在Spark的版本迭代中, 
旧有参数 可能会被 新的参数名称代替, 这并不意味着, 在新版本中不能够使用旧的名称. 而是新的名称优先级会更高点.

Spark Properties 主要可以分为两类:

一种是与部署有关的. 如 "spark.driver.memory", "spark.executor.instances", 这一类的参数不能够通过SparkConf指定, 
而是通过 cluster manage 和 cluster mode 来决定的, 因此建议通过 --conf的方式 进行配置.

第二种是Spark运行时配置, 如 "spark.task.maxFailures", 这种属性就可以通过任意方式进行配置.

配置的参数可以通过 spark ui 的 4040端口进行查看, 需要注意的是, 仅仅包含, 通过以上三种方式设定的属性, 其他类型的配置都只会展示默认值.

一、Hive-SQL / Spark-SQL参数配置和调优

#设置计算引擎
set hive.execution.engine=spark;

#设置spark提交模式
set spark.master=yarn-cluster;

#设置作业提交队列
set spark.yarn.queue=${queue_name};

#设置队列的名字
set mapreduce.job.queuename=root.users.hdfs;

#设置作业名称
set spark.app.name=${job_name};

#该参数用于设置Spark作业总共要用多少个Executor进程来执行
set spark.executor.instances=25;

#设置执行器计算核个数
set spark.executor.cores=4;

#设置执行器内存
set spark.executor.memory=8g

#设置任务并行度
set mapred.reduce.tasks=600;

#设置每个executor的jvm堆外内存
set spark.yarn.executor.memoryOverhead=2048;

#设置内存比例(spark2.0+)
set spark.memory.fraction=0.8;

#设置对象序列化方式
set spark.serializer=org.apache.serializer.KyroSerializer;

#设置动态分区
set hive.exec.dynamic.partition=true; --开启动态分区功能
set hive.exec.dynamic.partition.mode=nonstrict; --允许所有分区是动态的
set hive.exec.max.dynamic.partitions.pernode=1000; --每个mapper/reducer可以创建的最大动态分区数
--set hive.exec.dynamic.partitions=10000; 这个可不要
insert overwrite table test partition(country,state) select * from test2; --添加动态分区示例

二、shell脚本spark-submit参数配置

# python版本提交spark任务
spark-submit \
--master yarn \
--deploy-mode client \
--driver-memory 24G \
--driver-cores 8 \
--num-executors 100 \
--executor-cores 8 \
--executor-memory 24G \
--conf spark.driver.maxResultSize=24G \
--conf spark.kubernetes.executor.limit.cores=12 \
--conf spark.kryoserializer.buffer.max=1024m \
--conf spark.kryoserializer.buffer=512m \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \
--conf spark.sql.shuffle.partitions=3200 \
--conf spark.default.parallelism=3200 \
--conf spark.storage.memoryfraction=0.3 \
--conf spark.shuffle.memoryFraction=0.3 \
--conf spark.sql.hive.mergeFiles=true \
--conf spark.blacklist.enabled=true \
--conf spark.speculation=true \
--conf spark.sql.sources.readWithSubdirectories.enabled=false \
--conf spark.sql.autoBroadcastJoinThreshold=102400 \
--py-files utils.py \
--name analysis \
analysis.py ${calc_date}

#scala 版本提交 spark任务
spark-submit --class com.ad.data.algorithms.model.runModel \
--master yarn \
--deploy-mode cluster \
--driver-memory 16G \
--conf spark.driver.maxResultSize=16G \
--driver-cores 8 \
--num-executors 100 \
--executor-cores 8 \
--executor-memory 16G \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \
--conf spark.sql.shuffle.partitions=3200 \
--conf spark.default.parallelism=3200 \
--conf spark.storage.memoryfraction=0.4 \
--conf spark.shuffle.memoryFraction=0.4 \
--conf spark.sql.hive.mergeFiles=true \
--conf spark.blacklist.enabled=true \
--conf spark.speculation=true \
--conf spark.hadoop.hive.exec.orc.split.strategy=ETL \
--name segment-model \
${basePath}/../algorithms-model.jar ${calculateDate} ${cateCodes}

三、sparkSession中配置参数

from pyspark.sql import SparkSession
from pyspark.sql.functions import lit, col, expr

if __name__ == '__main__':
    script, calc_date = argv
    spark = SparkSession.builder.appName("analysis")\
        .config("spark.sql.autoBroadcastJoinThreshold", 102400)\
        .config("spark.driver.maxResultSize", "24G")\
        .enableHiveSupport().getOrCreate()