我正在从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?
我在这里看到SparkContext
:https://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
我无法确定其中任何一个是否成功注册了任何东西。
答案 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