Spark 的序列化问题总结
Java 序列化
Java 序列化就是指将一个对象转化为二进制的 byte[]
数组,然后以文件的方式进行保存或通过网络传输,等待被反序列化读取出来。序列化常被用于数据存取和通信过程中。
一个 Java 对象要能序列化,必须实现一个特殊的 java.io.Serializable
接口,它的定义如下:
1 |
|
Java 序列化就是指将一个对象转化为二进制的 byte[]
数组,然后以文件的方式进行保存或通过网络传输,等待被反序列化读取出来。序列化常被用于数据存取和通信过程中。
一个 Java 对象要能序列化,必须实现一个特殊的 java.io.Serializable
接口,它的定义如下:
1 |
|
当我们编写的 Spark 项目的依赖较多时,提交运行任务时便很容易出现因为包冲突导致的 java.lang.NoSuchMethodError
报错。原因是当用户提供 Spark 任务运行时,Spark 需要首先加载自身的依赖库(jars),一般位于 $SPARK_HOME/jars
目录下,然后再加载用户提交的 jar 包,当两者存在同样的 jar 但是版本不同时,如果高低版本不能互相兼容,则会报错。
Spark jar 包加载顺序:
SystemClassPath: $SPARK_HOME/jars
即 Spark 安装时候提供的依赖包UserClassPath: Spark-submit --jars
用户提交的依赖包UserClassPath: Spark-submit app.jar
用户的 Spark 任务 jar 包1 |
|
1 |
|
1 |
|
part-00000
的方式保存在输出文件夹中,并且还包含数据校验和文件 part-00000.crc
和 .SUCCESS
文件,其中 part-00000.crc
用来校验数据的完整性,.SUCCESS
文件用来表示本次输出任务成功完成。RDD
是 Resilient Distributed Datasets(弹性分布式数据集)的缩写,是 Spark 中一个重要的抽象概念,它表示跨集群节点且被分区的数据集合,可以并行操作。Spark 为 RDD 提供了丰富的操作算子,可以高效处理数据。
有两种创建 RDD 的方式:并行化驱动程序中的现有集合,或引用外部存储系统中的数据集,例如共享文件系统、HDFS、HBase 或任何提供 Hadoop InputFormat 的数据源。
1 |
|
Spark 部署模式分为本地单机(local)和集群模式,本地单机模式常用于本地开发程序与调试。集群模式又分为 Standalone 模式、Yarn 模式、Mesos 模式
通过测试发现,以下版本组合报错信息最少
组件 | 版本 |
---|---|
Spark | 3.2.2 |
Hadoop | 3.3.1 |
Scala | 2.12.15 |
JDK | 1.8 |