1. 简述Spark中7种存储级别 ?
在Spark中,存储级别(Storage Level)定义了RDD或DataFrame的数据在不同计算阶段是存储在内存中、磁盘上,或者两者的组合。以下是Spark中7种内置的存储级别:
-
StorageLevel.OFF_HEAP:数据既不存储在JVM堆内存中,也不存储在堆外内存中。这通常用于存储二进制数据,如图片或PDF文件。
-
StorageLevel.NONE:数据不存储在内存或磁盘上。一旦数据被使用,它就会消失。这通常用于不需要持久化或可以重新计算的数据。
-
StorageLevel.DISK_ONLY:数据仅存储在磁盘上,不存储在内存中。这适用于大量数据,需要节省内存但可以牺牲一些I/O性能。
-
StorageLevel.MEMORY_ONLY:数据仅存储在JVM堆内存中。如果内存不足,数据将不会被存储,而是在下次使用时重新计算。
-
StorageLevel.MEMORY_ONLY_SER:数据序列化后仅存储在JVM堆内存中。序列化可以减少内存占用,但会增加CPU使用率,因为需要序列化和反序列化数据。
-
StorageLevel.MEMORY_AND_DISK:数据首先尝试存储在JVM堆内存中,如果内存不足,则溢出到磁盘。这适用于需要持久化但内存有限的情况。
-
StorageLevel.OFF_HEAP:数据存储在JVM堆外内存中。这允许应用程序使用超出JVM堆大小的内存,适用于需要大量内存但希望避免JVM垃圾收集影响的场景。
除了这些内置存储级别,Spark还允许用户自定义存储级别,以满足特定的存储需求。存储级别的选择会影响应用程序的性能和资源使用,因此在设计Spark应用程序时,合理选择存储级别是非常重要的。
2. 简述Spark分哪几个部分(模块)?分别有什么作用(做什么,自己用过哪些,做过什么) ?
Apache Spark是一个庞大的生态系统,由多个模块组成,每个模块都承担着特定的功能。以下是Spark的主要模块及其作用:
-
Spark Core:
- 核心模块,提供了基本的分布式数据操作功能,如RDD(弹性分布式数据集)的创建、转换和行动操作。它是其他所有Spark模块的基础。
-
Spark SQL:
- 提供了对结构化数据的处理能力,支持SQL查询和DataFrame/Dataset API。它允许用户以声明式方式进行数据查询和转换。
-
Spark Streaming:
- 流处理模块,允许用户处理实时数据流。它支持各种数据源,如Kafka、Flume等,并提供了DStream(离散数据流)的概念。
-
MLlib:
- 是Spark的机器学习库,提供了一系列的机器学习算法和工具,包括分类、回归、聚类等,以及模型评估和数据预处理功能。