1.1 spark提交模式,有什么不同
spark提交模式有两种:集群模式(cluster)和客户端模式(client)
cluster模式下,Spark的Driver会运行在YARN集群内的ApplicationMaster进程中,ApplicationMaster已经启动之后,提交任务的客户端退出也不会影响任务的运行。 client模式下,Driver启动在客户端进程内,ApplicationMaster进程只用来向YARN集群申请资源。
1.2 cluster模式提交spark任务流程
-
编写 Spark 应用程序并打包成 jar 包。
-
安装和配置 Spark 集群。集群管理器如 YARN、Mesos 或 Spark Standalone 等,都需要安装和配置好。
-
使用 Spark 提供的提交工具来提交应用程序。可以使用命令行或脚本调用
spark-submit
工具,将应用程序提交到集群中运行。在提交时需要指定一些参数,如主类名、jar 包路径、资源参数等。 -
集群管理器分配资源。集群管理器会根据应用程序的需求分配计算资源,如内存、CPU 等,并启动运行相应的 Executor。
-
Driver 程序启动。在某个 Executor 上被分配了被称为 Driver 的任务的节点上,Spark 应用程序启动 Driver 程序,它是负责执行应用程序逻辑的控制节点。
-
任务执行。Driver 将任务分发给 Executor 执行,Executor 运行在集群的各个 Worker 节点上。Executor 接收任务后开始读取数据,并对数据进行处理。
-
结果返回。Executor 处理完任务后把结果返回给 Driver,Driver 会将结果汇总并返回给客户端。
1.3 spark的检查点概念和使用
在 Spark 中,检查点是一种容错机制,可以将 RDD(弹性分布式数据集)持久化到分布式文件系统中,以避免因节点故障等异常情况而导致的数据丢失。
具体来说,检查点是通过将 RDD 重算并将结果存储在可靠的存储介质(如 HDFS、S3 等)中来实现的。Checkpoint 操作会强制执行一次宽依赖操作,并将计算结果写入磁盘。这样,当某个节点或 Executor 发生故障时,Spark 可以从磁盘读取数据,并从检查点重新启动 RDD 的计算过程,以保证作业的正确执行。
使用检查点可以为数据处理任务提供更高的容错性和可靠性,但同时也会增加磁盘 I/O 和网络传输开销。因此在使用检查点时需要注意以下几点:
-
需要在创建 RDD 时指定检查点目录,以及检查点间隔时间。
-
需要确保检查点目录的可用性和稳定性,建议使用可靠的分布式文件系统如 HDFS 或 S3。
-
不要过于频繁地使用检查点,否则会导致不必要的开销。一般建议根据应用程序运行环境和数据规模等实际情况来选择检查点间隔时间。
使用 Spark 的检查点功能,可以有效提高数据处理应用程序的容错性和可靠性,避免因节点故障等异常情况导致的数据丢失。
1.4 RDD、DataFrame、DataSet区别
RDD(Resilient Distributed Dataset,弹性分布式数据集)、DataFrame、DataSet 都是 Spark 框架中常用的数据处理模型。它们之间的主要区别如下:
-
数据类型:RDD 是以弹性数据集(Resilient Distributed Dataset)为基础的、面向对象的数据类型,可以存储任意类型的对象。DataFrame 和 DataSet 则是基于表结构的数据类型,其中 DataFrame 是基于 RDD 实现的,其数据结构类似于关系型数据库中的表格(行和列),每个列都有自己的数据类型,而 DataSet 是基于强类型编程语言实现的数据类型。
-
执行计划:RDD 的执行计划是基于带有缓存机制的有向无环图(DAG)实现的,而 DataFrame 和 DataSet 的执行计划是基于 Catalyst 优化器和 Tungsten 执行引擎实现的。这使得 DataFrame 和 DataSet 相对于 RDD 具有更好的性能和灵活性。
-
编程方式:RDD 编程主要基于函数式编程模型,需要开发人员手动管理内存、序列化等问题;而 DataFrame 和 DataSet 利用了 Spark SQL 提供的 API,采用声明式 SQL 语句的编程方式,大大简化了编程难度。
-
类型检查:RDD 是一种弱类型的数据类型,编译时不能进行类型检查,而 DataFrame 和 DataSet 具有静态类型检查机制,编译时能够检查数据类型是否匹配。
-
应用场景:RDD 更适合处理低层次的数据结构和复杂的数据处理任务;DataFrame 更适合处理结构化数据和 SQL 相关的查询操作,如数据过滤、聚合等;DataSet 则在类型安全和高性能方面具有优势,在需要强类型约束的情况下使用更为合适。