我正在尝试在Spark HDInsight群集上运行python wordcount,我正在从Jupyter运行它。我不确定这是否是正确的方法,但我找不到任何有关如何在HDInsight Spark集群上提交独立python应用程序的帮助。
代码:
import pyspark
import operator
from pyspark import SparkConf
from pyspark import SparkContext
import atexit
from operator import add
conf = SparkConf().setMaster("yarn-client").setAppName("WC")
sc = SparkContext(conf = conf)
atexit.register(lambda: sc.stop())
input = sc.textFile("wasb:///example/data/gutenberg/davinci.txt")
words = input.flatMap(lambda x: x.split())
wordCount = words.map(lambda x: (str(x),1)).reduceByKey(add)
wordCount.saveAsTextFile("wasb:///example/outputspark")
我得到的错误信息并不明白:
ValueError Traceback (most recent call last)
<ipython-input-2-8a9d4f2cb5e8> in <module>()
6 from operator import add
7 import atexit
----> 8 sc = SparkContext('yarn-client')
9
10 input = sc.textFile("wasb:///example/data/gutenberg/davinci.txt")
/usr/hdp/current/spark-client/python/pyspark/context.pyc in __init__(self, master, appName, sparkHome, pyFiles, environment, batchSize, serializer, conf, gateway, jsc, profiler_cls)
108 """
109 self._callsite = first_spark_call() or CallSite(None, None, None)
--> 110 SparkContext._ensure_initialized(self, gateway=gateway)
111 try:
112 self._do_init(master, appName, sparkHome, pyFiles, environment, batchSize, serializer,
/usr/hdp/current/spark-client/python/pyspark/context.pyc in _ensure_initialized(cls, instance, gateway)
248 " created by %s at %s:%s "
249 % (currentAppName, currentMaster,
--> 250 callsite.function, callsite.file, callsite.linenum))
251 else:
252 SparkContext._active_spark_context = instance
ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=pyspark-shell, master=yarn-client) created by __init__ at <ipython-input-1-86beedbc8a46>:7
实际上是否可以通过这种方式运行python作业?如果是 - 似乎是SparkContext定义的问题......我尝试了不同的方法:
sc = SparkContext('spark://headnodehost:7077', 'pyspark')
和
conf = SparkConf().setMaster("yarn-client").setAppName("WordCount1")
sc = SparkContext(conf = conf)
但没有成功。什么是运行作业或配置SparkContext的正确方法?
答案 0 :(得分:2)
如果从Jupyter笔记本运行,则为您预先创建Spark上下文,并且创建单独的上下文不正确。要解决此问题,只需删除创建上下文的行,然后直接从以下位置开始:
input = sc.textFile("wasb:///example/data/gutenberg/davinci.txt")
如果您需要运行独立程序,可以使用pyspark从命令行运行它,或者使用在集群上运行的Livy服务器使用REST API提交它。
答案 1 :(得分:0)
看起来我自己可以回答我的问题。 代码中的一些更改证明是有用的:
conf = SparkConf()
conf.setMaster("yarn-client")
conf.setAppName("pyspark-word-count6")
sc = SparkContext(conf=conf)
atexit.register(lambda: sc.stop())
data = sc.textFile("wasb:///example/data/gutenberg/davinci.txt")
words = data.flatMap(lambda x: x.split())
wordCount = words.map(lambda x: (x.encode('ascii','ignore'),1)).reduceByKey(add)
wordCount.saveAsTextFile("wasb:///output/path")
答案 2 :(得分:0)
我刚刚在我的代码中解决了一个类似的错误,发现它只是因为pyspark只接受来自SparkContext()的一个对象。提交后,任何更改和代码运行都会遇到该问题并返回错误消息初始化。我的解决方案只是重新启动平台内核,并在重新启动笔记本时重新运行我的笔记本脚本。然后它运行没有错误。