【问题标题】:How to access SparkContext in pyspark script如何在 pyspark 脚本中访问 SparkContext
【发布时间】:2015-03-11 23:29:18
【问题描述】:

以下 SOF 问题 How to run script in Pyspark and drop into IPython shell when done? 讲述了如何启动 pyspark 脚本:

 %run -d myscript.py

但是我们如何访问现有的 spark 上下文呢?

只新建一个是行不通的:

 ---->  sc = SparkContext("local", 1)

 ValueError: Cannot run multiple SparkContexts at once; existing 
 SparkContext(app=PySparkShell, master=local) created by <module> at 
 /Library/Python/2.7/site-packages/IPython/utils/py3compat.py:204

但是尝试使用现有的.. 什么现有的?

In [50]: for s in filter(lambda x: 'SparkContext' in repr(x[1]) and len(repr(x[1])) < 150, locals().iteritems()):
    print s
('SparkContext', <class 'pyspark.context.SparkContext'>)

即SparkContext 实例没有变量

【问题讨论】:

  • 第一次运行时会发生什么:from pyspark import SparkContext?
  • 从 Spark 2.0.0 开始,您可以在不发生冲突的情况下创建 sparkSession 有一个 sparkContext 属性来访问原始上下文。

标签: python apache-spark pyspark


【解决方案1】:

包括以下内容:

from pyspark.context import SparkContext

然后在SparkContext 上调用静态方法:

sc = SparkContext.getOrCreate()

【讨论】:

  • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
  • sc 是现有 SparkContext OP 正在寻找的。之前没有办法获取现有的 SparkContext,但是添加了静态方法 getOrCreate() 来获取现有的上下文,如果不存在则创建一个新的。
  • 它对我有用! 3倍!但是你能解释一下吗?
【解决方案2】:

wordcount 的独立 python 脚本:使用 contextmanager

编写可重用的 spark 上下文
"""SimpleApp.py"""
from contextlib import contextmanager
from pyspark import SparkContext
from pyspark import SparkConf


SPARK_MASTER='local'
SPARK_APP_NAME='Word Count'
SPARK_EXECUTOR_MEMORY='200m'

@contextmanager
def spark_manager():
    conf = SparkConf().setMaster(SPARK_MASTER) \
                      .setAppName(SPARK_APP_NAME) \
                      .set("spark.executor.memory", SPARK_EXECUTOR_MEMORY)
    spark_context = SparkContext(conf=conf)

    try:
        yield spark_context
    finally:
        spark_context.stop()

with spark_manager() as context:
    File = "/home/ramisetty/sparkex/README.md"  # Should be some file on your system
    textFileRDD = context.textFile(File)
    wordCounts = textFileRDD.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
    wordCounts.saveAsTextFile("output")

print "WordCount - Done"

启动:

/bin/spark-submit SimpleApp.py

【讨论】:

    【解决方案3】:

    如果你已经创建了一个 SparkSession:

    spark = SparkSession \
        .builder \
        .appName("StreamKafka_Test") \
        .getOrCreate()
    

    然后你可以像这样访问“现有的”SparkContext:

    sc = spark.sparkContext
    

    【讨论】:

      【解决方案4】:

      当你在终端输入 pyspark 时,python 会自动创建 spark 上下文 sc。

      【讨论】:

      • 那是 bin/pyspark program 不是独立的 pyspark script
      • 并且sc变量不是自动创建的,SparkContext实例是自动创建的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多