Spark
Apache Spark 是内存计算引擎,通过将中间数据缓存在内存中,比 Hadoop MapReduce 快 10~100 倍。支持批处理、SQL、流处理、机器学习、图计算,是大数据生态中应用最广的计算框架。
架构
Driver(用户程序入口,生成 DAG,与 Executor 通信)
│
▼
Cluster Manager(资源分配:Standalone / YARN / Kubernetes)
│
├── Executor 1(执行 Task,缓存数据)
├── Executor 2
└── Executor 3
| 角色 | 职责 |
|---|---|
| Driver | 解析用户代码,生成逻辑/物理执行计划,协调 Executor |
| Executor | 执行 Task,存储 RDD 缓存,向 Driver 汇报状态 |
| Cluster Manager | 分配资源,管理 Executor 生命周期 |
核心抽象
RDD(弹性分布式数据集)
Spark 的基础数据结构,不可变、分区、可并行操作:
val sc = new SparkContext(conf)
val lines = sc.textFile("hdfs:///data/input.txt")
// Transformation(懒执行,不触发计算)
val words = lines.flatMap(_.split(" "))
val pairs = words.map(w => (w, 1))
val counts = pairs.reduceByKey(_ + _)
// Action(触发计算)
counts.saveAsTextFile("hdfs:///data/output")DataFrame / Dataset
结构化数据抽象,支持 SQL 优化(Catalyst 优化器):
val spark = SparkSession.builder().appName("demo").getOrCreate()
val df = spark.read.json("hdfs:///data/users.json")
df.filter($"age" > 18)
.groupBy($"city")
.agg(count("*").as("cnt"))
.orderBy($"cnt".desc)
.show()Spark SQL
df.createOrReplaceTempView("users")
val result = spark.sql("""
SELECT city, COUNT(*) AS cnt
FROM users
WHERE age > 18
GROUP BY city
ORDER BY cnt DESC
""")
// 读取 Hive 表(需开启 Hive 支持)
val hiveDf = spark.table("hive_db.user_log")Structured Streaming
val stream = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "user_events")
.load()
stream
.selectExpr("CAST(value AS STRING) as msg")
.groupBy(window($"timestamp", "5 minutes"))
.count()
.writeStream
.format("console")
.outputMode("update")
.start()
.awaitTermination()性能调优
// 缓存热点数据
df.cache()
df.persist(StorageLevel.MEMORY_AND_DISK) // 内存不足溢写磁盘
// 广播小表,避免 Shuffle Join
val broadcastDf = broadcast(smallDf)
largeDf.join(broadcastDf, "user_id")
// 合理设置 Shuffle 分区数(默认 200,按数据量调整)
spark.conf.set("spark.sql.shuffle.partitions", "400")提交作业
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 10 \
--executor-cores 4 \
--executor-memory 8g \
--class com.example.WordCount \
my-app.jar \
hdfs:///input hdfs:///outputSpark vs MapReduce vs Flink
| 维度 | MapReduce | Spark | Flink |
|---|---|---|---|
| 计算模型 | 批处理 | 批处理为主,微批流 | 真流处理 |
| 延迟 | 分钟级 | 秒级(微批) | 毫秒级 |
| 内存利用 | 磁盘为主 | 内存为主 | 内存为主 |
| 容错机制 | 任务重试 | RDD 血缘重算 | Checkpoint 精确一次 |
| 适用场景 | 超大规模离线 | 批处理/交互式分析 | 实时流处理 |