如何在实际项目中管理spark会话创建

时间:2018-06-16 15:28:57

标签: scala apache-spark

我是scala / spark世界的新手。我通常在本地运行作业所以我使用--master作为本地[k]但是如何在实际应用程序中管理整个项目的spark会话/ spark上下文?

我正在研究围绕sparkSession对象创建的代码结构。例如,创建一个用于创建sparkSession对象的特征并使用整个项目以及单元测试,还有更好的方法吗?

示例代码将不胜感激。

3 个答案:

答案 0 :(得分:1)

通常我只是在我的SparkSession.getOrCreate()方法中通过main创建一个Spark会话,并将其注入我需要的任何地方。如果您需要SparkSession,可以SparkContext。{{1}}

对于测试,我在一些帮助器类中创建Spark会话作为公共常量,并在所有测试中重用它。这样可以节省运行测试的时间。

答案 1 :(得分:0)

根据我的说法,与其将 spark session 传递给您在项目中创建的所有方法和类,不如创建一个从可序列化扩展的特征并创建 sparksession 对象,然后您可以在每个类上扩展该特征/object 您正在使用 sparksession 实例的位置,这将是更清晰和有效的方法。

import org.apache.spark.sql.SparkSession
trait SparkSessionWrapper extends Serializable {
  lazy val spark: SparkSession = {
    SparkSession.builder().appName("TestApp").getOrCreate()
  }
object testProcessor extends SparkSessionWrapper{
 val df = spark.read.format("csv").load("path")
}
object testProcessor2 extends SparkSessionWrapper{
 spark.sql("drop table Test.Testtable") 
}

如果您在您创建的每个对象上扩展该包装器特性,那么您将在您正在使用的对象内的任何方法上获得 sparksession 实例。 通过遵循我们将其声明为惰性的方法方法,将在第一次在代码执行中使用 spark 变量时创建 sparksession 实例,然后它将使用相同的实例。

答案 2 :(得分:0)

使用单例访问器……spark 上下文是单例,所以它也有必要将 spark 会话作为单例……只需创建一个名为 sparkContextProvider 的单例包装器,并让它拥有可以获取 sparkConf、javaSparkContext、sparkContext 的方法, sparkSession、hadoopConfiguration 和喜欢