一、Spark运行架构
1. 核心组件
Driver(驱动器):
执行main方法,负责将用户程序转换为作业(Job)。
调度任务(Task)到Executor,并监控任务执行状态。
通过UI展示作业运行情况。
类比:类似于项目经理,统筹全局并分配任务。
2.核心概念
Executor: 集群中应用在工作节点上的虚拟机进程,用于计算。
并行度: 分布式计算框架中多个任务同时运行的数量,可以动态修改。
3.Executor(执行器):
工作节点(Worker)中的JVM进程,负责运行具体的Task。
提供缓存机制(存储RDD),加速计算。
核心功能:执行任务、返回结果、缓存数据。
4.Master & Worker:
Master负责资源调度与集群监控(类似YARN的ResourceManager)。
Worker负责处理数据(类似YARN的NodeManager)。
5.提交流程(以YARN为例)
Client模式:
Driver运行在本地机器,适合调试。
流程:Driver申请资源 → 启动ApplicationMaster → 分配Executor → 任务执行。
6.Cluster模式:
Driver运行在YARN集群,适合生产环境。
流程:ApplicationMaster直接作为Driver,管理任务执行。
7.算子
转换算子: 对数据格式和内容进行转换,如映射和筛选。
行动算子: 触发实际计算,读取到行动算子时才会真正运行。
二、RDD(弹性分布式数据集)
1. 核心特性
弹性:支持自动容错、数据分片调整、存储介质切换(内存/磁盘)。
不可变:RDD只读,转换操作生成新RDD。
分布式:数据分片存储在集群节点,并行计算。
2. 核心属性
分区列表:决定并行度。
依赖关系:窄依赖(1父分区→1子分区)与宽依赖(Shuffle依赖)。
分区器:Hash分区(默认)和Range分区,仅适用于Key-Value类型RDD。
3. 持久化机制
Cache/Persist:
将数据缓存至内存或磁盘,避免重复计算。
注意:缓存可能丢失,需依赖血缘关系(Lineage)恢复。
4. Checkpoint:
将数据持久化到HDFS,切断血缘依赖,提高容错效率。
最佳实践:Checkpoint前先Cache,避免重复计算。
5.任务划分
层级关系:Application → Job → Stage → Task。
每个Action算子生成一个Job。
Stage数量 = 宽依赖数 + 1。
Task数 = 最后一个RDD的分区数。
三、Spark Core编程基础
1. 环境配置
依赖:JDK 1.8、Scala 2.12、Spark 3.0.0。
IDEA插件:需安装Scala插件,配置Maven依赖(spark-core_2.12)。
2. WordCount示例
scala
object WordCount {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
val sc = new SparkContext(sparkConf)
val fileRDD = sc.textFile("input/word.txt")
val result = fileRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
result.collect().foreach(println)
sc.stop()
}
}
关键步骤:
读取文件 → 分词 → 转换结构 → 聚合 → 输出结果。
3. RDD创建方式
内存集合:parallelize或makeRDD(底层相同)。
外部存储:textFile读取HDFS或本地文件。
其他RDD转换:通过算子生成新RDD。
RDD依赖关系
血缘关系: 记录RDD的转换行为,以便恢复丢失的分区。
依赖关系: 相邻RDD之间的关系。
窄依赖: 每个上游RDD的分区最多被子RDD的一个分区使用。
宽依赖: 形象比喻成独生子女,涉及多个分区依赖。
RDD 的文件读取与保存
文件格式:主要包括 text 文件、CSV 文件、object 文件等。
文件系统:包括本地文件系统、HDFS、HBase 和数据库等。
读取与保存方法:使用 SC.textFile() 和 saveAs() 方法进行文件读取和保存。
RDD 创建案例
环境配置:JDK、Scala 和 Maven 插件的安装与配置。
创建 RDD:介绍了三种创建 RDD 的方式:
根据集合内存创建
根据外部文件创建
从其他 RDD 创建
3. 应用场景:
批处理(如日志分析)、迭代计算(机器学习)、实时流处理(结合Structured Streaming)。
总结:Spark Core通过RDD实现了高效的分布式计算,其弹性、容错和并行化特性使其成为大数据处理的核心工具。掌握运行架构、RDD操作及编程实践是深入应用Spark的基础。