教程中的多个SparkContext错误

45 投票
4 回答
58047 浏览
提问于 2025-04-18 04:09

我正在尝试运行一个非常基础的Spark+Python的pyspark教程,具体可以查看这个链接:http://spark.apache.org/docs/0.9.0/quick-start.html

当我尝试初始化一个新的SparkContext时,

from pyspark import SparkContext
sc = SparkContext("local[4]", "test")

我遇到了以下错误:

ValueError: Cannot run multiple SparkContexts at once

我在想,之前我运行示例代码时,是否加载了一些东西到内存中,但没有清理掉。有没有办法查看当前内存中已经存在的SparkContexts,或者清理它们,以便示例代码可以正常运行呢?

4 个回答

2

与其在PySpark提示符下设置SparkContext的自定义配置,不如在启动PySpark的时候就设置好这些配置。

比如:

pyspark --master yarn --queue my_spark_pool1 --conf 
   spark.driver.extraLibraryPath="${LD_LIBRARY_PATH}" --conf 
   spark.executorEnv.LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"

这样做会把这些配置应用到PySpark中的sc对象上。

14

你有没有在尝试创建另一个SparkContext之前,先用sc.stop()来停止当前的SparkContext?

83

这个问题发生的原因是,当你在终端输入“pyspark”时,系统会自动初始化一个SparkContext(可能是一个对象?),所以在创建新的SparkContext之前,你需要先停止这个已经存在的。

你可以使用

sc.stop()

在创建新的SparkContext之前。

另外,你也可以使用

sc = SparkContext.getOrCreate()

来替代

sc = SparkContext()

我刚接触Spark,对SparkContext()函数的参数含义了解不多,但上面显示的代码对我来说都能正常工作。

34

原来,运行命令 ./bin/pyspark 进入交互模式时,会自动加载一个叫做 SPARKCONTEXT 的东西。下面是我启动 pyspark 时看到的内容:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 0.9.1
      /_/

Using Python version 2.6.6 (r266:84292, Feb 22 2013 00:00:18)
Spark context available as sc.

...所以你可以选择在一开始运行 "del sc" 来删除这个自动定义的东西,或者直接使用这个自动定义的 "sc"。

另外一个问题是,示例代码似乎在查看一个普通的 NFS 文件系统位置,但实际上它是想查看 Hadoop 的 HDFS 文件系统。我在运行代码之前,需要用命令 "hadoop fs -put README.md README.md" 把 README.md 文件上传到 $SPARK_HOME 目录。

这是我在交互模式下运行的修改后的示例程序:

from pyspark import SparkContext
logFile = "README.md"
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print "Lines with a: %i, lines with b: %i" % (numAs, numBs)

这是我修改后的独立 Python 文件:

"""SimpleApp.py"""
from pyspark import SparkContext
logFile = "README.md"  # Should be some file on your system
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print "Lines with a: %i, lines with b: %i" % (numAs, numBs)

我现在可以用命令 $SPARK_HOME/bin/pyspark SimpleApp.py 来执行它。

撰写回答