使用 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 种主要方法可以指定用于创建 SparkContextSparkConf 的选项:

    作为 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-shell 时的番石榴版本

spark-shell 及 日志配置

如何使用 spark-avro 包从 spark-shell 读取 avro 文件?

为啥 spark-shell 因 NullPointerException 而失败?

在 Mac 上本地启动 spark-shell 时出错