scala - 使用spark-shell时使用sparkConf.set(..)自定义SparkContext

标签 scala apache-spark serialization kryo

在Spark中,有3种主要方法来指定用于创建SparkConfSparkContext的选项:

  • 作为conf / spark-defaults.conf中的属性
  • 例如,该行:spark.driver.memory 4g
  • 作为args到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。在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后唯一适用的选项。
    您始终可以使用配置文件或--confspark-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/

    相关文章:

    scala - 从相同特征派生的案例类的模式匹配

    java - 将scala代码添加到java文件中

    azure - 通过 JDBC 访问 Azure HDInsights 中的 Spark

    java - 在 Java 中查找不可序列化字段的好方法

    scala - 调用 stddev 超过 1,000 列时 SparkSQL 作业失败

    scala - 尽管@specialized,由于类型删除导致重复方法

    scala - 丰富 SparkContext 而不会引发序列化问题

    apache-spark - PySpark 修复/删除控制台进度条

    java - 如何通过网络将java .class从一台机器传输到另一台机器?

    c# - 在 EF 模型的 JSON 序列化期间向嵌套对象添加属性