教程中有多个SparkContexts错误

时间:2014-04-24 21:57:39

标签: python apache-spark

我正在尝试运行非常基本的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 个答案:

答案 0 :(得分:50)

这是因为当你输入" pyspark"在终端中,系统会自动初始化SparkContext(可能是一个Object?),所以你应该在创建一个新的之前停止它。

您可以使用

sc.stop()

在创建新的SparkContext之前。

此外,您可以使用

sc = SparkContext.getOrCreate()

而不是

sc = SparkContext()

我是Spark的新手,我不太了解函数SparkContext()的参数含义,但上面显示的代码对我有用。

答案 1 :(得分:30)

事实证明,以交互方式运行./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”在$ SPARK_HOME位置上传README.md文件。

以下是我以交互方式运行的修改示例程序:

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

执行

答案 2 :(得分:13)

在尝试创建另一个SparkContext之前,您是否尝试过使用sc.stop()?

答案 3 :(得分:2)

您可以在启动PySpark时设置自定义配置,而不是在PySpark提示符下为SparkContext设置自定义配置。

e.g。

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

它会将这些conf应用于PySpark中的sc对象。