Scala 连接到Spark群集时出现序列化问题
我有一个用Scala编写的Spark应用程序,它可以从拼花文件中进行写入和读取。 该应用程序公开了一个HTTP API,当它接收到请求时,会通过一个长期存在的上下文将工作发送到Spark集群,该上下文在应用程序的生命周期中一直保持。 然后将结果返回给HTTP客户端 当我使用本地模式,以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
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本身,但没有将其依赖项放在一起。不确定为什么错误消息没有提供任何信息
你能分享你正在运行的代码吗?你能分享你正在运行的代码吗?