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:///output

维度MapReduceSparkFlink
计算模型批处理批处理为主,微批流真流处理
延迟分钟级秒级(微批)毫秒级
内存利用磁盘为主内存为主内存为主
容错机制任务重试RDD 血缘重算Checkpoint 精确一次
适用场景超大规模离线批处理/交互式分析实时流处理

相关链接

  • Hadoop — Spark 可运行在 YARN 上,读写 HDFS 数据
  • HDFS — Spark 常用的数据源和输出目标
  • Hive — SparkSQL 可直接读取 Hive 元数据和表数据
  • Flink — 实时流处理首选,与 Spark 互补