scala - 在 Scala 中创建 SparkSession 对象以在单元测试和 Spark-submit 中使用的最佳实践

标签 scala apache-spark spark-submit

我尝试编写一个从 DataFrame 到 DataFrame 的转换方法。 我也想用scalatest来测试一下。

如您所知,在使用 Scala API 的 Spark 2.x 中,您可以按如下方式创建 SparkSession 对象:

import org.apache.spark.sql.SparkSession

val spark = SparkSession.bulider
     .config("spark.master", "local[2]")
     .getOrCreate()

这段代码在单元测试中工作得很好。 但是,当我使用 Spark-submit 运行此代码时,集群选项不起作用。 例如,

spark-submit --master yarn --deploy-mode client --num-executors 10 ...

不创建任何执行程序。

我发现当我删除上述代码的 config("master", "local[2]") 部分时,会应用 Spark-submit 参数。 但是,如果没有大师设置,单元测试代码就无法工作。

我尝试将 Spark (SparkSession) 对象生成部分拆分为测试和主要部分。 但是有很多代码块需要spark,例如import Spark.implicit,_spark.createDataFrame(rdd, schema)

是否有任何最佳实践来编写代码来创建 Spark 对象以测试和运行 Spark-Submit?

最佳答案

一种方法是创建一个提供 SparkContext/SparkSession 的特征,并在测试用例中使用它,如下所示:

trait SparkTestContext {
  private val master = "local[*]"
  private val appName = "testing"
  System.setProperty("hadoop.home.dir", "c:\\winutils\\")
  private val conf: SparkConf = new SparkConf()
    .setMaster(master)
    .setAppName(appName)
    .set("spark.driver.allowMultipleContexts", "false")
    .set("spark.ui.enabled", "false")

  val ss: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
  val sc: SparkContext = ss.sparkContext
  val sqlContext: SQLContext = ss.sqlContext
}

您的测试类 header 看起来像这样:

类 TestWithSparkTest 通过带有匹配器的 SparkTestContext 扩展 BaseSpec{

关于scala - 在 Scala 中创建 SparkSession 对象以在单元测试和 Spark-submit 中使用的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45407406/

相关文章:

java - 将 java.util.Collections.synchronizedList 与 Scala 的 .asScala 转换器一起使用

hadoop - newHadoopAPI中的多个输入路径可用于Spark读取Lzo文件

apache-spark - Spark webUI - 完成的应用详情页面

hadoop - 关于在 spark 上配置配置单元的问题

maven - 在集群模式下运行spark-submit命令时如何覆盖spark jar? (好的http3)

java - 如何使用 Scala 类作为跨类加载器的共享根对象?

scala - git变量是什么样的轴?

scala - SparkSQL Dataframe 函数是否爆炸保留顺序?

apache-spark - Spark中的HDFS文件访问

apache-spark - spark 提交应用程序中的 Scala ScriptEngine 问题