在Spark中,有3种主要方法来指定用于创建SparkConf
的SparkContext
的选项:
spark.driver.memory 4g
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。在GraphX上使用Kryo的规定方式是在自定义
SparkConf
实例时执行以下Scala语句:GraphXUtils.registerKryoClasses( sparkConf )
运行
spark-shell
时如何完成此操作?
最佳答案
Spark 2.0+
您应该能够使用SparkSession.conf.set
方法在运行时设置一些配置选项,但是它主要限于SQL配置。
Spark <2.0
您可以简单地停止现有上下文并创建一个新上下文:
import org.apache.spark.{SparkContext, SparkConf}
sc.stop()
val conf = new SparkConf().set("spark.executor.memory", "4g")
val sc = new SparkContext(conf)
正如您在official documentation中可以看到的:Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified by the user. Spark does not support modifying the configuration at runtime.
因此,您可以看到停止上下文是启动Shell后唯一适用的选项。
您始终可以使用配置文件或
--conf
的spark-shell
参数来设置所需的参数,这些参数将用作默认上下文。如果是Kryo,您应该看一下:spark.kryo.classesToRegister
spark.kryo.registrator
请参阅Compression and Serialization中的Spark Configuration。
关于scala - 使用spark-shell时使用sparkConf.set(..)自定义SparkContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397731/