我正在查看spark-core,我发现了一个未记录的配置,这是spark.executor.allowSparkContext从3.0.1开始可用。我无法在spark官方文档中找到细节。在代码中,这个配置有一个简短的描述
如果设置为true, SparkContext可以在executor中创建。
但是我想知道,SparkContext
如何在executor中创建?据我所知,SparkContext
是在驱动程序上创建的,执行器是由资源管理器分配的。所以SparkContext
总是在executor之前创建。这个配置的用例是什么?
从Spark Core 3.0迁移到3.1:
在Spark 3.0及以下版本中,
SparkContext
可以在执行器中创建。从Spark 3.1开始,创建时会抛出异常执行器中的SparkContext
。您可以通过设置创建时配置spark.executor.allowSparkContext
SparkContext
in executors.
根据此问题SPARK-32160,自3.1版本以来,在创建SparkContext(参见pyspark pyspark/context.py)时添加了一个检查,该检查阻止执行器创建SparkContext
:
if (conf is None or
conf.get("spark.executor.allowSparkContext", "false").lower() != "true"):
# In order to prevent SparkContext from being created in executors.
SparkContext._assert_on_driver()
# ...
@staticmethod
def _assert_on_driver():
"""
Called to ensure that SparkContext is created only on the Driver.
Throws an exception if a SparkContext is about to be created in executors.
"""
if TaskContext.get() is not None:
raise Exception("SparkContext should only be created and accessed on the driver.")
我建议文档和实现中的错误。
如果你了解Spark架构,整个概念就没有意义了。除此之外,我们没有任何声明。
从另一个答案和大量关于这方面的错误文档来看,显然有些地方出了问题。