一、Spark的定位:计算引擎,不是存储系统
不是数据库,也不是HDFS那样的存储方案。
它是计算层:任务调度、内存管理、容错恢复、与存储系统交互、分布式数据集API等。
典型架构是:HDFS/Hive/HBase/S3等存储+Spark计算+YARN/K8s/Standalone等资源调度。
所以Spark常被理解为"大数据计算的操作系统/发动机",存储仍然沿用Hadoop生态。
spark可以先用一句话理解:它是一个面向大数据的通用分布式计算引擎,负责"算",不负责"存"。它最早是为了替代Hadoop中又慢又难用的MapReduce计算引擎而出现的;底层数据仍可放在HDFS、Hive、HBase等存储系统中,Spark把数据读出来,在集群上分布式计算,再把结果写回去或交给下游。
二、为什么Spark比MapReduce块?
核心不是简单"内存计算"四个字,而是:
DAG有向无环图计算模型:Spark回把一个作业拆成有依赖关系的阶段,尽量形成流水线执行。
减少不必要的shuffle:MapReduce很多操作要反复落盘,Spark的DAG调度可以在不涉及跨节点数据交换时,把中间结果放在内存中连续计算,减少磁盘IO。
但注意:Spark不是"所有数据都放内存、绝不落盘"。一旦涉及shuffle,比如groupBy、join、repartition,shuffle数据仍会写磁盘。内存计算是优势,不是万能。
通俗类比:MapReduce像每道工序做完都把半成品搬进仓库;Spark像流水线,能连续传递的就尽量在内存里传下去,但遇到必须跨车间交换物料时,还是得落地。
三、Spark的核心抽象:RDD及更高层API
RDD(弹性分布式数据集):Spark Core的核心抽象,表示分布在多个节点上的、不可变的、可分区的数据集,支持并行计算和容错。
后来Spark又提供了更易用的DataFrame/Dataset,尤其通过Spark SQL用SQL方式处理结构化数据。
你可以把RDD理解成"分布在集群上的一堆数据分区 + 一串计算操作",Spark通过血缘关系实现容错:某个分区丢了,可以按计算链重算。
四、Spark的内置模块
Spark Core:基础功能,任务调度、内存管理、错误恢复、存储交互、RDD API。
Spark SQL:处理结构化数据,支持SQL/HQL,支持Hive表、Parquet、JSON等数据源。
Spark Streaming:流式计算组件;现代Spark更常用Structured Streaming做流处理。
Spark MLlib:机器学习库、分类、回归、聚类、协同过滤、模型评估等。
集群管理器:Spark可以跑在Hadoop YARN、Apache Mesos、Spark Standalone上,现代也常跑在Kubernetes上。
五、Spark怎么在集群上跑?
典型运行结果包括:
Driver:负责解析程序、生成DAG、划分阶段、调度任务。
Executor:在worker节点上执行具体task,缓存数据,汇报结果。
Cluster Manager:如YARN、Standalone、K8s,负责分配资源。
DAGScheduler/TaskScheduler:DAGScheduler把作业切成stage,TaskScheduler把task分给executor。
所以Spark程序通常分两步理解:Driver端做逻辑计划和调度,Executor端做分布式执行。
六、Spark能干什么
它是一套通用引擎,常见用途包括:
批处理ETL:清洗、转换、聚合大规模数据。
交互式查询:用Spark SQL做数据仓库分析。
流处理:实时统计、实时风控、日志处理。
机器学习:特征处理、模型训练。
图计算:GraphX等图处理场景。
数据科学:PySpark、SparkR、Scala/Java API。