我正在运行Jupyter
- spark设置,我想用不同的输入参数对我的群集进行基准测试。为了确保enivorment保持不变,我试图重置(重启)SparkContext
,这里有一些伪代码:
import os
import shutil
import pyspark
temp_result_parquet = os.path.normpath('/home/spark_tmp_parquet')
i = 0
while i < max_i:
i += 1
if os.path.exists(temp_result_parquet):
shutil.rmtree(temp_result_parquet) # I know I could simply overwrite the parquet
My_DF = do_something(i)
My_DF.write.parquet(temp_result_parquet)
sc.stop()
time.sleep(10)
sc = pyspark.SparkContext(master='spark://ip:here', appName='PySparkShell')
当我这样做第一次迭代它运行正常但在第二次我收到以下错误:
Py4JJavaError: An error occurred while calling o1876.parquet.
: org.apache.spark.SparkException: Job aborted.
[...]
Caused by: java.lang.IllegalStateException: SparkContext has been shutdown
at org.apache.spark.SparkContext.runJob(SparkContext.scala:2014)
at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1.apply$mcV$sp(FileFormatWriter.scala:188)
我尝试在没有SparkContext
重启的情况下运行代码,但这会导致内存问题。因此,在每次迭代之前擦拭板岩清洁我都是这样做的。 parquet
认为SparkContext
认为const appRoutes: Routes = [
{
path: 'dashboard', component: DashboardPageComponent
},
{
path: 'account', component: DashboardPageComponent
},
{ path: '**', redirectTo: 'dashboard', pathMatch: 'full' }
];
的结果很奇怪。
答案 0 :(得分:0)
长话短说,Spark(包括PySpark)并非旨在在单个应用程序中处理多个上下文。如果您对故事的JVM感兴趣,建议阅读SPARK-2243(已解决,无法解决)。
PySpark做出了许多设计决定,这些决定包括但不限于单例Py4J网关。实际上,您不能在单个应用程序中拥有多个SparkContext。 SparkSession不仅绑定到SparkContext,还引入了自身的问题,例如如果使用本地Hive元存储,则将其处理。此外,还有一些函数在内部使用SparkSession.builder.getOrCreate并取决于您现在看到的行为。一个明显的例子是UDF注册。如果存在多个SQL上下文(例如RDD.toDF),其他功能可能会表现出意外的行为。
多个上下文不仅不受支持,而且我个人认为还违反了单一责任原则。您的业务逻辑不应与所有设置,清理和配置详细信息有关。