重新启动Spark上下文

时间:2017-08-24 13:42:18

标签: python apache-spark pyspark

我正在运行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' } ]; 的结果很奇怪。

1 个答案:

答案 0 :(得分:0)

长话短说,Spark(包括PySpark)并非旨在在单个应用程序中处理多个上下文。如果您对故事的JVM感兴趣,建议阅读SPARK-2243(已解决,无法解决)。

PySpark做出了许多设计决定,这些决定包括但不限于单例Py4J网关。实际上,您不能在单个应用程序中拥有多个SparkContext。 SparkSession不仅绑定到SparkContext,还引入了自身的问题,例如如果使用本地Hive元存储,则将其处理。此外,还有一些函数在内部使用SparkSession.builder.getOrCreate并取决于您现在看到的行为。一个明显的例子是UDF注册。如果存在多个SQL上下文(例如RDD.toDF),其他功能可能会表现出意外的行为。

多个上下文不仅不受支持,而且我个人认为还违反了单一责任原则。您的业​​务逻辑不应与所有设置,清理和配置详细信息有关。

Source