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 包Hadoop 有一个抽象的文件系统概念。Java 抽象类 org.apache.hadoop.fs.FileSystem
定义了 Hadoop 中一个文件系统的客户端接口,并且该抽象类有几个具体实现,其中常用的如下表:
文件系统 | URI 方案 | Java 实现 | 描述 |
---|---|---|---|
Local | file:///path | fs.LocalFileSystem | 使用客户端检验和的本地磁盘文件系统。使用 RawLocalFileSystem 表示无校验和的本地磁盘文件系统。 |
HDFS | hdfs://host/path | hdfs.DistributedFileSystem | Hadoop 的分布式文件系统 |
FTP | ftp://host/path | fs.ftp.FTPFileSystem | 由 FTP 服务器支持的文件系统 |
SFTP | sftp://host/path | fs.sftp.SFTPFileSystem | 由 SFTP 服务器支持的文件系统 |
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 |