Spark 是一个用于大规模数据处理的开源分布式计算系统。它提供了高效的数据处理能力,支持多种数据处理场景,包括批处理、流处理、机器学习和图计算等。最近的面试中面试官问的比较多,特地总结一些
1.Spark 运行时各个组件及作用
-
集群管理器(Cluster Manager):Spark 运行时需要一个集群管理器来管理计算资源。常见的集群管理器包括 Apache Mesos、Hadoop YARN 和 Spark 自带的 Standalone 模式。
-
资源调度(Resource Scheduling):一旦连接到集群管理器,Spark 就需要一个资源调度器来分配计算资源给不同的 Spark 应用程序。资源调度器决定哪些任务运行在哪些节点上,并确保任务的执行不会受到资源竞争的影响。
-
执行引擎(Execution Engine):Spark 使用 DAG(Directed Acyclic Graph)执行引擎执行任务。Spark 应用程序被转换成一个由一系列阶段(Stages)组成的 DAG,每个阶段包含一组可以并行执行的任务。Spark 支持两种类型的操作:转换(Transformations)和行动(Actions)。转换会生成新的数据集,而行动会触发作业的执行。
-
内存管理(Memory Management):Spark 运行时使用内存来加速数据处理。它使用内存来缓存中间数据,并尽可能地减少磁盘 I/O。Spark 提供了多种内存管理策略,包括静态分配和动态分配,以及可调整的内存分配。
-
任务调度(Task Scheduling):一旦 DAG 被构建,Spark 将任务调度到集群中的工作节点上执行。任务调度器负责将任务分配给可用的计算资源,并确保任务的并行执行。
-
数据分区(Data Partitioning):在 Spark 中,数据通常被分成多个分区,每个分区可以在集群中的不同节点上并行处理。数据分区的良好设计可以提高任务的并行度和性能。
-
容错性(Fault Tolerance):Spark 提供了容错机制,使得在节点失败时能够恢复计算,并且不会丢失数据。这通过RDD(Resilient Distributed Dataset)的分布式数据集实现,以及RDD的血统(Lineage)记录和任务重新执行来实现。
2.Spark 运行原理主要涉及以下几个方面
-
分布式数据集(Resilient Distributed Dataset,RDD):Spark 的核心数据抽象是 RDD,它代表一个可以并行操作的、可分区的数据集合。RDD 具有容错性,因此可以在节点故障时进行恢复。Spark 中的所有计算都是围绕 RDD 进行的。
-
惰性求值(Lazy Evaluation):Spark 中的转换操作是惰性的,即当应用一个转换操作时,它并不立即执行,而是构建一个执行计划(DAG),只有当遇到行动操作时,才会触发实际的计算。
-
行动操作(Actions):行动操作是对 RDD 执行实际计算并返回结果的操作,例如 collect、count、saveAsTextFile 等。当执行行动操作时,Spark 才会根据之前构建的执行计划执行转换操作,并将结果返回给驱动程序。
-
转换操作(Transformations):转换操作是对 RDD 进行变换的操作,例如 map、filter、reduceByKey 等。这些操作会生成一个新的 RDD,而不改变原始的 RDD。
-
任务调度(Task Scheduling):Spark 会将转换操作划分为一系列的任务,并将这些任务分发给集群中的各个节点执行。任务调度器负责将任务分配给可用资源,并优化任务执行顺序以提高性能。
-
内存计算(In-Memo