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

kmh*_*kmh 4 scala kryo apache-spark

我正在从 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)
Run Code Online (Sandbox Code Playgroud)

问题是... Spark 2+ 指令中的其他地方,它表明这SparkSession是解决所有问题的方法...并且如果您需要SparkContext它应该通过spark.sparkContext而不是作为独立的 val。

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

val spark = SparkSession.builder.appName("myApp").getOrCreate()
Run Code Online (Sandbox Code Playgroud)

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

我在这里看到spark.kryo.classesToRegisterhttps ://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()
Run Code Online (Sandbox Code Playgroud)

???但如果我想注册怎么办org.myorg.myapp.{MyClass1, MyClass2, MyClass3}?我找不到这种用法的示例。

可不可能是:

.config("spark.kryo.classesToRegister", "MyClass1,MyClass2,MyClass3")
Run Code Online (Sandbox Code Playgroud)

或者

.config("spark.kryo.classesToRegister", "class org.myorg.mapp.MyClass1,class org.myorg.mapp.MyClass2,class org.myorg.mapp.MyClass3")
Run Code Online (Sandbox Code Playgroud)

或者是其他东西?

编辑

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

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

  • “org.myorg.myapp.myclass”
  • “我的课”
  • “类 org.myorg.myapp.myclass”

我不知道这些是否成功注册了任何东西。

Dan*_*osa 5

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

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

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