在Spark 2+中通过SparkSession向Kryo注册类



我正在从Spark 1.6迁移到2.3。

我需要向 Kryo 注册自定义类。 所以我在这里看到的是:https://spark.apache.org/docs/2.3.1/tuning.html#data-serialization

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)

问题是... 在 Spark 2+ 指令中的其他任何地方,它都表明SparkSession是一切的必经之路...... 如果您需要SparkContext它应该通过spark.sparkContext而不是作为独立的 val。

所以现在我使用以下(并从我的代码中删除了 conf、sc 等的任何痕迹(......

val spark = SparkSession.builder.appName("myApp").getOrCreate()

我的问题:如果我不直接使用SparkConfSparkContext,我在哪里向 Kryo 注册课程?

我在这里看到spark.kryo.classesToRegister:https://spark.apache.org/docs/2.3.1/configuration.html#compression-and-serialization

我有一个相当广泛的conf.json来设置spark-defaults.conf,但我想让它在应用程序之间通用化,所以我不想在这里注册类。

当我看这里时:https://spark.apache.org/docs/2.3.1/api/scala/index.html#org.apache.spark.sql.SparkSession

这让我觉得我可以做以下事情来增强我的spark-defaults.conf

val spark = 
SparkSession
.builder
.appName("myApp")
.config("spark.kryo.classesToRegister", "???")
.getOrCreate()

但是,如果我想注册org.myorg.myapp.{MyClass1, MyClass2, MyClass3}???是什么? 我找不到这种用途的例子。

会不会是:

.config("spark.kryo.classesToRegister", "MyClass1,MyClass2,MyClass3")

.config("spark.kryo.classesToRegister", "class org.myorg.mapp.MyClass1,class org.myorg.mapp.MyClass2,class org.myorg.mapp.MyClass3")

还是别的什么?

编辑

当我尝试通过 Spark-shell 测试不同的格式时spark.conf.set("spark.kryo.classesToRegister", "any,any2,any3")无论我在字符串any,any2,any3中输入什么,我都不会收到任何错误消息。

我尝试制作以下每种格式any

  • "org.myorg.myapp.myclass">
  • "我的班级">
  • "class org.myorg.myapp.myclass">

我无法判断这些是否成功注册了任何东西。

您是否尝试过以下内容,它应该可以工作,因为它实际上是SparkConfAPI 的一部分,我认为唯一缺少的是您只需将其插入SparkSession

private lazy val sparkConf = new SparkConf()
.setAppName("spark_basic_rdd").setMaster("local[*]").registerKryoClasses(...)
private lazy val sparkSession = SparkSession.builder()
.config(sparkConf).getOrCreate()

如果您需要 Spark 上下文,可以调用:private lazy val sparkContext: SparkContext = sparkSession.sparkContext

最新更新