Spark
问题
什么是 Spark?它比 Hive 快在哪里?
答案
Spark 核心概念
Spark 是基于内存计算的分布式处理引擎,比 MapReduce 快 10~100 倍。
Spark vs Hive
| 对比 | Spark | Hive (MapReduce) |
|---|---|---|
| 计算模型 | 内存计算 | 磁盘 MapReduce |
| 速度 | 快 10~100x | 慢 |
| API | RDD/DataFrame/SQL | 纯 SQL |
| 适用 | ETL、ML、流 | 大规模离线 ETL |
Spark SQL 示例
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, count
spark = SparkSession.builder.appName("analysis").getOrCreate()
# 读取 Hive 表
df = spark.sql("""
SELECT user_id, event_name, pay_amount
FROM dwd.user_action
WHERE dt = '2024-01-15'
""")
# DataFrame API 分析
result = (df
.groupBy("user_id")
.agg(
count("*").alias("event_cnt"),
sum("pay_amount").alias("total_amount")
)
.filter(col("total_amount") > 100)
.orderBy(col("total_amount").desc())
)
result.show()
常见性能调优
| 优化点 | 方法 |
|---|---|
| 数据倾斜 | salting key、broadcast join |
| 小文件 | coalesce() 合并输出 |
| 内存 | 调整 executor-memory、避免 collect() |
| 序列化 | 使用 Kryo 序列化 |
| Shuffle | 减少 shuffle 次数、调整分区数 |
数据分析师的 Spark 使用建议
- 优先用 Spark SQL(门槛低,性能好)
- 避免在 Driver 端
collect()大数据集 - 结果写回 Hive 表用
saveAsTable()
常见面试问题
Q1: Spark 为什么比 MapReduce 快?
答案:
- 内存计算:中间结果在内存中传递,不落盘
- DAG 优化:将多步操作优化为一个执行计划
- 延迟计算:Transformation 延迟执行,统一优化
Q2: RDD 和 DataFrame 有什么区别?
答案:
- RDD:底层 API,类型安全,无查询优化
- DataFrame:高层 API,有 Schema,Catalyst 优化器加速
- 推荐使用 DataFrame / Spark SQL(性能更好)