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

Creating new SparkContext for each SparkStep in MRJob/ pySpark

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

我试图查找 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()
    

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