Scala 连接到Spark群集时出现序列化问题

Scala 连接到Spark群集时出现序列化问题,scala,apache-spark,apache-spark-sql,cluster-computing,parquet,Scala,Apache Spark,Apache Spark Sql,Cluster Computing,Parquet,我有一个用Scala编写的Spark应用程序,它可以从拼花文件中进行写入和读取。 该应用程序公开了一个HTTP API,当它接收到请求时,会通过一个长期存在的上下文将工作发送到Spark集群,该上下文在应用程序的生命周期中一直保持。 然后将结果返回给HTTP客户端 当我使用本地模式,以local[*]为主模式时,这一切都可以正常工作。 然而,当我试图连接到Spark集群时,我就遇到了序列化问题。 使用Spark的默认序列化程序,我得到以下结果: java.lang.ClassCastExcept

我有一个用Scala编写的Spark应用程序,它可以从拼花文件中进行写入和读取。 该应用程序公开了一个HTTP API,当它接收到请求时,会通过一个长期存在的上下文将工作发送到Spark集群,该上下文在应用程序的生命周期中一直保持。 然后将结果返回给HTTP客户端

当我使用本地模式,以
local[*]
为主模式时,这一切都可以正常工作。 然而,当我试图连接到Spark集群时,我就遇到了序列化问题。 使用Spark的默认序列化程序,我得到以下结果:

java.lang.ClassCastException:无法将scala.collection.immutable.List$SerializationProxy的实例分配给org.apache.spark.sql.execution.FilterExec.otherPreds类型的字段org.apache.spark.sql.execution.FilterExec

如果我启用Kryo序列化程序,我会得到
java.lang.IllegalStateException:unread block data

当试图读取拼花文件时会发生这种情况,但是我认为这与拼花文件本身无关,只是与发送到Spark集群的代码的序列化有关

从大量的互联网搜索中,我发现这可能是由Spark版本甚至Java版本之间的不兼容造成的。 但是使用的版本是相同的

该应用程序是用Scala 2.12.8编写的,附带Spark 2.4.3。 Spark cluster正在运行Spark 2.4.3(使用Scala 2.12编译的版本)。 运行Spark cluster和应用程序的机器使用的是openJDK 1.8.0_212

根据另一项互联网搜索,问题可能是因为
spark.master
URL不匹配。 因此,我将
spark defaults.conf
中的
spark.master
设置为我在应用程序中用于连接它的相同值


但是,这并没有解决这个问题,我现在已经没有什么想法了。

我不完全确定根本的解释是什么,但我通过将我的应用程序的jar复制到Spark的
jars
目录中来修复它。然后我仍然遇到了一个错误,但是另一个错误:缺少一个
Cats/kernel/Eq
类。因此,我将
cats内核的jar添加到Spark的
jars
目录中

现在一切都好了。我在另一个堆栈溢出线程中读到的一些信息可以解释这一点:

我认为,无论何时使用lambda执行任何类型的映射操作(它引用项目的方法/类),都需要将它们作为额外的jar提供。Spark确实序列化了lambda本身,但没有将其依赖项放在一起。不确定为什么错误消息没有提供任何信息


我不完全确定底层的解释是什么,但我通过将应用程序的jar复制到Spark的
jars
目录中修复了它。然后我仍然遇到了一个错误,但是另一个错误:缺少一个
Cats/kernel/Eq
类。因此,我将
cats内核的jar添加到Spark的
jars
目录中

现在一切都好了。我在另一个堆栈溢出线程中读到的一些信息可以解释这一点:

我认为,无论何时使用lambda执行任何类型的映射操作(它引用项目的方法/类),都需要将它们作为额外的jar提供。Spark确实序列化了lambda本身,但没有将其依赖项放在一起。不确定为什么错误消息没有提供任何信息


你能分享你正在运行的代码吗?你能分享你正在运行的代码吗?