Spark大师之路:Spark的配置系统

本文介绍了Spark的配置系统,包括SparkConf类用于设置任务属性,如Master和AppName,环境变量通过spark-env.sh配置,日志则通过log4j.properties控制。SparkConf提供了预定义配置项,允许自定义Spark任务参数。环境变量的设置影响Spark运行,而日志配置通过log4j.properties模板实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Spark的配置系统主要分为三个部分:第一个部分是控制Spark任务运行属性的,一般会影响到Spark的运行情况和任务性能;第二个部分是系统变量,可以配置一些运行需要的环境变量及运行参数;第三部分是日志部分,Spark通过log4j来记录任务日志,所以这部分是通过配置log4j来实现的。 

Spark属性

Spark属性配置涵盖了任务运行时的大部分参数,并且可以根据不同的任务来实现不同的配置。这部分之前是依靠Java系统变量(也就是通过-D配置的变量)来实现的,但是自从0.9.0-incubating版本之后,这项任务就被一个单独的类SparkConf来承担了。SparkConf类中有很多预定义的配置项,一个简单的例子如下:

import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 14-3-27
 * Time: 下午11:54
 * To change this template use File | Settings | File Templates.
 */
object TestSpark {
  def main(args: Array[String]) =
  {
    val conf = new SparkConf().setMaster("local").setAppName("testSparkConf")
    val sc = new SparkContext(conf)
    println(sc.textFile("d:/conf.txt").count)
  }
}

 

这段代码最开始初始化并构建了一个SparkConf类的对象conf,使用其中的setMaster和setAppName方法将这个驱动程序的Master设为本地模式,将其名称设为testSparkConf。然后使用这个SparkConf类对象初始化了一个SparkContext类,将之前的配置项传递给sc,这样就可以控制驱动程序了。

conf.txt的内容如下:

aaa
b
cc
ddd

 

sc读取其中的内容,并使用count方法打印出它内容的行数,程序输出结果为:4

我们下载Spark的源码,在org.apache.spark包中找到SparkConf.scala,打开后可以看到内容如下:

package org.apache.spark

import scala.collection.JavaConverters._
import scala.collection.mutable.HashMap

import java.io.{ObjectInputStream, ObjectOutputStream, IOException}

/**
 * Configuration for a Spark application. Used to set various Spark parameters as key-value pairs.
 *
 * 省略 *
 * @param loadDefaults whether to also load values from Java system properties
 */
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging {

  /** Create a SparkConf that loads defaults from system properties and the classpath */
  def this() = this(true)

  private val settings = new HashMap[String, String]()

  if (loadDefaults) {
    // Load any spark.* system properties
    for ((k, v) <- System.getProperties.asScala if k.startsWith("spark.")) {
      settings(k) = v
    }
  }

  /** Set a configuration variable. */
  def set(key: String, value: String): SparkConf = {
    if (key == null) {
      throw new NullPointerException("null key")
    }
    if (value == null) {
      throw new NullPointerException("null value")
    }
    settings(key) = value
    this
  }

  /**
   * The master URL to connect to, such as "local" to run locally with one thread, "local[4]" to
   * run locally with 4 cores, or "spark://master:7077" to run on a Spark standalone cluster.
   */
  def setMaster(master: String): SparkConf = {
    set("spark.master", master)
  }

  /** Set a name for your application. Shown in the Spark web UI. */
  def setAppName(name: String): SparkConf = {
    set("spark.app.name", name)
  }

  ------------------省略部分代码--------------------------------
  /** Remove a parameter from the configuration */
  def remove(key: String): SparkConf = {
    settings.remove(key)
    this
  }

  /** Get a parameter; throws a NoSuchElementException if it's not set */
  def get(key: String): String = {
    settings.getOrElse(key, throw new NoSuchElementException(key))
  }

  /** Get a parameter, falling back to a default if not set */
  def get(key: String, defaultValue: String): String = {
    settings.getOrElse(key, defaultValue)
  }

  ------------------省略部分代码--------------------------------
  /** Does the configuration contain a given parameter? */
  def contains(key: String): Boolean = settings.contains(key)

  ------------------省略部分代码-------------------------------- }

 

可以看到,SparkConf类中只是对一个HashMap的封装,初始化时使用System.getProperties读取JVM属性,然后将以"spark."为前缀的属性读取出来,存进这个名为settings的HashMap中。

其中的set、get、remove、contains操作也分别是对应HashMap操作的封装。

另外SparkConf还定义了很多特例化的属性,比如setMaster就是对spark.master属性的设置,setAppName就是对属性spark.app.name的设置。所以我们给出的第一段代码也可以使用

-Dspark.master=local -Dspark.app.name=testSparkConf


来代替SparkConf中的配置。

SparkConf还可以配置很多运行参数,这些可以在http://spark.apache.org/docs/latest/configuration.html#spark-properties中查看他们的简介,有一些和任务调优有关,在此不做深入探究,以后会慢慢分析。

另外,当你配置了参数并启动驱动之后,可以通过4040端口中的Environment标签页来查看配置项是否和预期中的相同。

环境变量

Spark运行驱动程序都使用spark-class脚本,后面跟需要运行的类以及其他参数,在spark-class中有这么一句代码:

# Load environment variables from conf/spark-env.sh, if it exists
if [ -e "$FWDIR/conf/spark-env.sh" ] ; then
  . $FWDIR/conf/spark-env.sh
fi


也就是说,每次运行驱动程序,都会从spark-env.sh中加载环境变量。这个脚本在bin目录下,其中环境变量的作用域仅限于spark-env.sh所在的节点。但是有一个例外,就是使用SPARK_JAVA_OPTS可以配置我们上一节所说的Spark属性,其作用域为整个Spark驱动程序。当然我们不建议这么做,修改脚本比在驱动程序代码中设定更合乎逻辑。

以下几项是可以在spark-env.sh中配置的环境变量:

JAVA_HOME, 这个不用多说了吧
PYSPARK_PYTHON, 使用PySpark时,需要在这里指定Python的bin目录
SPARK_LOCAL_IP, 节点的IP地址
SPARK_LIBRARY_PATH, 当Spark需要使用到本地库时,需要配置它们的路径
SPARK_CLASSPATH, 可以通过配置此项指定Spark的classpath,当然更推荐的方法是使用SparkContext中的addJar方法,以及SparkConf中的setJars方法
SPARK_JAVA_OPTS, 在这里可以配置程序运行时的一些JVM变量,在这里配置相对使用SparkConf配置的优点是可以随节点不同而配置不同的选项,一般使用-D方式来实现
另外,当使用Standalone模式运行Spark程序时,所需的配置也可以在此处指定。比如使用的核心数量和内存大小。


日志设定

在conf目录下有一个log4j.properties.template文件,里面给定了log4j的配置模板,你可以自行创建或者根据模板创建一个名为log4j.properties的文件,用来控制log4j的各种行为。具体配置内容请查看log4j的相关文档,此处不做赘述。

结语

Spark的配置系统就是这些内容,总结一下有以下几点:

如果你配置和整个Application相关的项,请使用SparkConf类;

如果配置本机相关的项或者是环境变量,请使用spark-env.sh;

日志相关,使用log4j.properties进行控制。

 

参考http://spark.apache.org/docs/latest/configuration.html

声明:本文为原创,禁止用于任何商业目的,转载请注明出处:http://blog.csdn.net/asongoficeandfire/article/details/23625847

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值