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

时间:2018-09-28 21:06:50

标签: scala apache-spark 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,则应通过{{ 1}},而不是独立的val。

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

spark.sparkContext

我的问题:如果我不直接使用val spark = SparkSession.builder.appName("myApp").getOrCreate() SparkConf,我该在哪里注册Kryo?

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

我有相当广泛的spark.kryo.classesToRegister可以设置conf.json,但是我想让它在各个应用程序之间都具有通用性,所以我不想在这里注册类。

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

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

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

  • “ org.myorg.myapp.myclass”
  • “ myclass”
  • “类org.myorg.myapp.myclass”

我无法确定其中任何一个是否成功注册了任何东西。

1 个答案:

答案 0 :(得分:3)

您尝试过以下操作,由于它实际上是SparkConf API的一部分,因此它应该工作,并且我认为唯一缺少的是只需将其插入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