教程中的多个SparkContext错误
我正在尝试运行一个非常基础的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 个回答
与其在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对象上。
你有没有在尝试创建另一个SparkContext之前,先用sc.stop()来停止当前的SparkContext?
这个问题发生的原因是,当你在终端输入“pyspark”时,系统会自动初始化一个SparkContext(可能是一个对象?),所以在创建新的SparkContext之前,你需要先停止这个已经存在的。
你可以使用
sc.stop()
在创建新的SparkContext之前。
另外,你也可以使用
sc = SparkContext.getOrCreate()
来替代
sc = SparkContext()
我刚接触Spark,对SparkContext()函数的参数含义了解不多,但上面显示的代码对我来说都能正常工作。
原来,运行命令 ./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 来执行它。