使用 spark-shell 时使用 sparkConf.set(..) 自定义 SparkContext
Posted
技术标签:
【中文标题】使用 spark-shell 时使用 sparkConf.set(..) 自定义 SparkContext【英文标题】:Customize SparkContext using sparkConf.set(..) when using spark-shell 【发布时间】:2015-10-02 13:33:56 【问题描述】:在 Spark 中,有 3 种主要方法可以指定用于创建 SparkContext
的 SparkConf
的选项:
-
作为 conf/spark-defaults.conf 中的属性
例如,线路:
spark.driver.memory 4g
作为 spark-shell 或 spark-submit 的参数
例如,spark-shell --driver-memory 4g ...
在您的源代码中,在使用SparkConf
实例创建SparkContext
之前配置它:
例如,sparkConf.set( "spark.driver.memory", "4g" )
但是,当使用 spark-shell
时,在您收到 shell 提示时,已经在名为 sc
的变量中为您创建了 SparkContext。使用 spark-shell 时,如果在您有机会执行任何 Scala 语句之前已经创建了 SparkContext,您如何使用上面列表中的选项 #3 来设置配置选项?
特别是,我正在尝试使用 Kyro 序列化和 GraphX。将 Kryo 与 GraphX 一起使用的规定方法是在自定义 SparkConf
实例时执行以下 Scala 语句:
GraphXUtils.registerKryoClasses( sparkConf )
在运行spark-shell
时如何实现这一点?
【问题讨论】:
【参考方案1】:Spark 2.0+
您应该可以使用SparkSession.conf.set
方法在运行时设置一些 配置选项,但它主要限于SQL 配置。
火花
您可以简单地停止现有上下文并创建一个新上下文:
import org.apache.spark.SparkContext, SparkConf
sc.stop()
val conf = new SparkConf().set("spark.executor.memory", "4g")
val sc = new SparkContext(conf)
正如您在official documentation 中看到的那样:
一旦将 SparkConf 对象传递给 Spark,它就会被克隆,并且用户不能再对其进行修改。 Spark 不支持在运行时修改配置。
如您所见,停止上下文是 shell 启动后唯一适用的选项。
您始终可以使用配置文件或spark-shell
的--conf
参数来设置将用作默认上下文的所需参数。如果是 Kryo,您应该看看:
spark.kryo.classesToRegister
spark.kryo.registrator
在Spark Configuration 中查看Compression and Serialization。
【讨论】:
如何在 Azure Databricks notebook 中添加执行程序内存和驱动程序内存?以上是关于使用 spark-shell 时使用 sparkConf.set(..) 自定义 SparkContext的主要内容,如果未能解决你的问题,请参考以下文章
如何在公司代理后面使用 spark-shell 解析外部包?
如何使用 spark-avro 包从 spark-shell 读取 avro 文件?