Apache spark 使用检查点火花流更改中流配置

Apache spark 使用检查点火花流更改中流配置,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我有一个Spark streaming/DStream应用程序,如: 其中,我的上下文使用一个配置文件,在该文件中,我可以使用appConf.getString等方法提取项目。所以我实际上使用: val context = StreamingContext.getOrCreate( appConf.getString("spark.checkpointDirectory"), () => createStreamContext(sparkConf, appConf))

我有一个Spark streaming/DStream应用程序,如:

其中,我的上下文使用一个配置文件,在该文件中,我可以使用
appConf.getString
等方法提取项目。所以我实际上使用:

val context = StreamingContext.getOrCreate(
    appConf.getString("spark.checkpointDirectory"), 
    () => createStreamContext(sparkConf, appConf))
其中
val sparkConf=new sparkConf()…


如果我停止应用程序并更改应用程序文件中的配置,除非我删除检查点目录内容,否则不会拾取这些更改。例如,我想动态更改
spark.streaming.kafka.maxRatePerPartition
spark.windowDurationSecs
。(编辑:我将关闭应用程序,更改配置文件,然后重新启动应用程序。)如何动态更改这些设置或强制执行(编辑的WORD)配置更改,而不破坏我的检查点目录(即将包括状态信息的检查点)

您是否按照文档建议的方式,使用
StreamingContext.getOrCreate
创建流式处理上下文,它将前面的
检查点目录
作为参数

// Function to create and setup a new StreamingContext
def functionToCreateContext(): StreamingContext = {
    val ssc = new StreamingContext(...)   // new context
    val lines = ssc.socketTextStream(...) // create DStreams
    ...
    ssc.checkpoint(checkpointDirectory)   // set checkpoint directory
    ssc
}

// Get StreamingContext from checkpoint data or create a new one
val context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _)

// Do additional setup on context that needs to be done,
// irrespective of whether it is being started or restarted
context. ...

// Start the context
context.start()
context.awaitTermination()

如何在不破坏检查点目录的情况下动态更改这些设置或强制执行配置更改

如果深入到
StreamingContext.getOrCreate的代码中:

def getOrCreate(
    checkpointPath: String,
    creatingFunc: () => StreamingContext,
    hadoopConf: Configuration = SparkHadoopUtil.get.conf,
    createOnError: Boolean = false
  ): StreamingContext = {
    val checkpointOption = CheckpointReader.read(
      checkpointPath, new SparkConf(), hadoopConf, createOnError)
    checkpointOption.map(new StreamingContext(null, _, null)).getOrElse(creatingFunc())
}
您可以看到,如果
CheckpointReader
在类路径中有检查点数据,它将使用
new SparkConf()
作为参数,因为重载不允许传递自定义创建的
SparkConf
。默认情况下,
SparkConf
将加载声明为环境变量或传递到类路径的任何设置:

class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging {

  import SparkConf._

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

因此,实现所需的一种方法是在代码中创建
SparkConf
对象,您可以通过
spark.driver.extraClassPath
spark.executor.extraClassPath
将参数传递到
spark submit

从检查点目录还原时无法添加/更新spark配置。您可以在文档中找到spark检查点行为:

当程序第一次启动时,它将创建一个新的StreamingContext,设置所有流,然后调用start()。 当程序在失败后重新启动时,它将从检查点目录中的检查点数据重新创建StreamingContext


所以,若您使用检查点目录,那个么在重新启动作业时,它将从检查点数据重新创建一个StreamingContext,该数据将包含旧的sparkConf

是的,我做了几乎和上面一样的事情。唯一的主要区别是我的
ssc.sockettexstream(…)
更像
KafkaUtils.createDirectStream
,并将ssc作为一个参数。我花了一段时间才弄明白这一点。。。我错过了一个非常微妙的点,我需要充分了解这一点。如果我使用
context.sparkContext.getConf.set(“spark.xxxx”,“10”)
,我可以设置需要使用的任何spark Conf参数(在您建议的位置)。这是我需要知道的最后一件事。我将不得不回复,因为
…getConf.set()
似乎并没有动态地改变上下文——我认为Yuval推荐的或一种尚未提及的技术必须起作用。有什么想法吗?
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging {

  import SparkConf._

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