Spark 篇:为什么 Spark 适合大规模离线计算
Spark 通过 Driver、Executor、RDD、DataFrame 和 Spark SQL 组成一套通用分布式计算引擎,尤其适合大规模离线 ETL 和分析。
Spark 篇:为什么 Spark 适合大规模离线计算
Spark 的出现,很大程度上是为了解决 MapReduce 写起来重、迭代慢、表达能力弱的问题。它用更通用的计算模型和内存计算能力,成为离线 ETL、数据分析和机器学习里的常见选择。
Rendering diagram...
Driver 和 Executor
Driver 是 Spark 应用的控制端,负责生成作业、切分 Stage、调度 Task。
Executor 运行在 Worker 节点上,负责真正执行 Task、缓存数据、读写 Shuffle。
这种架构让 Spark 可以把一个大作业拆成大量并行任务执行。
RDD
RDD 是 Resilient Distributed Dataset,弹性分布式数据集。它是 Spark 早期最核心的抽象。
RDD 支持 map、filter、reduceByKey 等转换操作,也能通过 lineage 实现容错。如果某个分区丢失,可以根据依赖关系重新计算。
lines = sc.textFile("s3://logs/app.log")
errors = lines.filter(lambda line: "ERROR" in line)
counts = errors.map(lambda line: (line.split()[0], 1)).reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("s3://result/error-count")
DataFrame 和 Spark SQL
现代 Spark 使用 DataFrame 和 Spark SQL 更多。DataFrame 带有结构信息,优化器可以理解列、类型、过滤条件和 Join。
df = spark.read.parquet("s3://warehouse/orders")
df.groupBy("order_date").sum("amount").show()
相比 RDD,DataFrame 更容易被 Catalyst 优化器优化,也更适合数据仓库 ETL。
Spark 适合什么
Spark 适合:
- 离线 ETL。
- 大规模批处理。
- 数据湖加工。
- 特征工程。
- 交互式分析。
- 机器学习批训练。
不太适合极低延迟、强状态实时处理和复杂事件时间语义,这些场景 Flink 往往更自然。
小结
Spark 是通用分布式批处理引擎。Driver/Executor 架构负责调度和执行,RDD 提供底层弹性抽象,DataFrame/Spark SQL 提供高级优化能力。