一.简介
Spark对程序提供了非常灵活的配置方式,可以使用环境变量、配置文件、命令行参数,还可以直接在Spark程序中指定,不同的配置方式有不同的优先级,可以相互覆盖。而且这些配置的属性在Web界面中可以直接看到,非常方便我们管理配置。
二.Spark程序配置加载过程
Spark程序一般都是由脚本bin/spark-submit来提交的,交互式编程bin/spark-shell其实也是通过它来提交的。通过这种方式启动的Spark程序的加载配置过程如下:
1.设置SPARK_HOME的值为bin/spark-submit脚本所在目录的上一级目录。
2.计算配置文件目录,从环境变量SPARK_CONF_DIR中读取。如果没有设置,则取默认值${SPARK_HOME}/conf。
3.执行配置文件目录下的shell脚本配置文件spark-env.sh,设置基本的环境变量。
4.加载配置文件目录下的默认配置文件spark-defaults.conf。
5.读取命令行参数,覆盖前面的默认配置。
6.使用SparkConf对象中的选项,覆盖前面的配置。
三.环境变量配置
少量基础的Spark程序配置可以通过环境变量的方式来指定,比如配置文件目录是通过环境变量SPARK_CONF_DIR来指定的,其默认值是${SPARK_HOME}/conf。我们可以在提交Spark程序之前通过指定SPARK_CONF_DIR值的方式来使用其他目录作为配置文件的目录。
环境变量可以在提交程序之前通过export的方式设置,也可以在配置文件目录下的spark-env.sh文件中指定,其中spark-env.sh本身也是一个脚本。常用的配置项如下所示:
1.SPARK_LOCAL_IP:绑定的IP地址。
2.SPARK_PUBLIC_DNS:Driver程序使用的DNS服务器。
3.SPARK_CLASSPATH:额外追加的classpath。
四.Spark属性项配置
Spark属性项的配置可以在3个地方进行,优先级从低到高依次为:
1.spark-defaults.conf
2.命令行参数
3.SparkConf对象
spark-defaults.conf的初始值可以从spark-defaults.conf.template复制而来,如下:
提交程序时,也可以通过命令行的方式指定参数,且优先级大于配置文件,如下:
./bin/spark-submit --name "SparkPi" --master yarn --conf "spark.shuffle.spill=false -XX:+PrintGCTimeStamps" myApp.jar
在Spark 程序中也可以指定配置项,而且优先级最高,不过灵活性不如前面的两种方式,每次改动配置都需要更新代码并编译。Spark程序中通过SparkConf【Spark1.x】对象来设置配置项。如下:
val conf = new SparkConf().setMaster("local[2]").setAppName("SparkPi").set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)
五.配置Spark日志
日志配置是另一项单独的配置,它使用配置文件目录下的log4j.properties作为配置文件。
# Set everything to be logged to the console log4j.rootCategory=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n # Set the default spark-shell log level to WARN. When running the spark-shell, the # log level for this class is used to overwrite the root logger's log level, so that # the user can have different defaults for the shell and regular Spark apps. log4j.logger.org.apache.spark.repl.Main=WARN # Settings to quiet third party logs that are too verbose log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO log4j.logger.org.apache.parquet=ERROR log4j.logger.parquet=ERROR # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR