我是pySpark的新手,我尝试使用MRJob实现多步EMR / Spark作业,我是否需要为每个SparkStep创建一个新的SparkContext,或者我可以为所有SparkSteps共享相同的SparkContext ?
我试图查找MRJob manual,但不幸的是,目前尚不清楚。
有人可以告诉您正确的方法吗?
创建单独的SparkContext:
class MRSparkJob(MRJob):
def spark_step1(self, input_path, output_path):
from pyspark import SparkContext
sc = SparkContext(appName='appname')
...
sc.stop()
def spark_step2(self, input_path, output_path):
from pyspark import SparkContext
sc = SparkContext(appName='appname')
...
sc.stop()
def steps(self):
return [SparkStep(spark=self.spark_step1),
SparkStep(spark=self.spark_step2)]
if __name__ == '__main__':
MRSparkJob.run()
创建一个SparkContext并在不同的SparkSteps
之间共享class MRSparkJob(MRJob):
sc = None
def spark_step1(self, input_path, output_path):
from pyspark import SparkContext
self.sc = SparkContext(appName='appname')
...
def spark_step2(self, input_path, output_path):
from pyspark import SparkContext
... (reuse the same self.sc)
self.sc.stop()
def steps(self):
return [SparkStep(spark=self.spark_step1),
SparkStep(spark=self.spark_step2)]
if __name__ == '__main__':
MRSparkJob.run()
答案 0 :(得分:0)
根据Dave MRJob discussion group的说法,我们应该为每一步创建一个新的SparkContext,因为每一步都是对Hadoop和Spark的全新调用(即上面的#1是正确的方法)。