为MRJob / pySpark中的每个SparkStep创建新的SparkContext

时间:2018-04-04 20:35:25

标签: pyspark amazon-emr mrjob

我是pySpark的新手,我尝试使用MRJob实现多步EMR / Spark作业,我是否需要为每个SparkStep创建一个新的SparkContext,或者我可以为所有SparkSteps共享相同的SparkContext ?

我试图查找MRJob manual,但不幸的是,目前尚不清楚。

有人可以告诉您正确的方法吗?

  1. 创建单独的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()
    
  2. 创建一个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()
    

1 个答案:

答案 0 :(得分:0)

根据Dave MRJob discussion group的说法,我们应该为每一步创建一个新的SparkContext,因为每一步都是对Hadoop和Spark的全新调用(即上面的#1是正确的方法)。