# Spark基礎面試題有哪些
## 目錄
1. [Spark核心概念](#1-spark核心概念)
2. [RDD與DataFrame](#2-rdd與dataframe)
3. [Spark運行機制](#3-spark運行機制)
4. [性能優化](#4-性能優化)
5. [Spark SQL與Hive集成](#5-spark-sql與hive集成)
6. [Spark Streaming](#6-spark-streaming)
7. [常見故障排查](#7-常見故障排查)
8. [實戰場景題](#8-實戰場景題)
---
## 1. Spark核心概念
### 1.1 什么是Spark?與Hadoop的區別是什么?
**答:**
- **Spark**是基于內存計算的分布式計算框架,提供DAG執行引擎支持迭代計算
- **對比Hadoop**:
- MapReduce僅支持批處理,Spark支持批處理/流處理/機器學習
- Spark基于內存計算比HDFS磁盤IO快10-100倍
- Spark提供80+高階算子,MapReduce僅有Map/Reduce兩種操作
### 1.2 解釋Spark架構中的核心組件
**答:**
| 組件 | 功能說明 |
|---------------|--------------------------------------------------------------------------|
| Driver | 執行main()方法,創建SparkContext,負責作業調度和結果收集 |
| Executor | 在工作節點上執行具體Task,將數據保存在內存/磁盤 |
| Cluster Manager | 資源管理(Standalone/YARN/Mesos) |
| RDD | 彈性分布式數據集,Spark的基礎數據結構 |
### 1.3 Spark有哪些部署模式?
```python
# 示例:YARN部署模式選擇
spark-submit --master yarn --deploy-mode cluster ...
// 1. 從集合創建
val rdd1 = sc.parallelize(Seq(1,2,3))
// 2. 從外部存儲創建
val rdd2 = sc.textFile("hdfs://path/to/file")
// 3. 從已有RDD轉換
val rdd3 = rdd1.map(_ * 2)
特性 | RDD | DataFrame |
---|---|---|
數據類型 | 任意Java/Scala對象 | 結構化數據(Row對象) |
優化方式 | 無內置優化 | Catalyst查詢優化器 |
序列化 | Java序列化(性能低) | Tungsten二進制編碼(高效) |
API類型 | 函數式編程 | SQL風格聲明式編程 |
graph LR
A[窄依賴] --> B[每個父RDD分區最多被一個子分區使用]
C[寬依賴] --> D[每個父RDD分區被多個子分區使用]
rdd.map(x => (x._1 + Random.nextInt(10), x._2))
spark.default.parallelism=2000
spark.executor.memory=4G
spark.memory.fraction=0.6 # 用于執行和存儲的內存比例
spark.memory.storageFraction=0.5 # 存儲內存占比
reduceByKey
替代groupByKey
spark.sql.shuffle.partitions=200
spark.shuffle.manager=sort
# 當小表join大表時使用
broadcast_var = sc.broadcast(small_table)
large_table.rdd.map(lambda x: (x, broadcast_var.value[x.key]))
val spark = SparkSession.builder()
.appName("Hive Integration")
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.enableHiveSupport()
.getOrCreate()
spark.sql("""
SELECT department, AVG(salary)
FROM employees
GROUP BY department
""").show()
# 每5秒處理一個批次
ssc = StreamingContext(sc, 5)
lines = ssc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))
ssc.checkpoint("hdfs://checkpoint_path")
spark.network.timeout=300s
)executor-memory
persist(StorageLevel.DISK_ONLY)
-- 優化方案:
-- 1. 使用Parquet列式存儲
-- 2. 分區字段按日期劃分
-- 3. 啟用謂詞下推
spark.sql("SET spark.sql.parquet.filterPushdown=true")
dstream.map(x => (x, 1))
.reduceByKeyAndWindow(_ + _, Seconds(60))
.transform(rdd => {
rdd.sortBy(_._2, false).take(10)
})
總結:掌握這些基礎問題后,建議進一步學習: - Spark源碼閱讀(特別是Scheduler模塊) - 性能調優實戰(使用Spark UI分析) - 結構化流處理(Structured Streaming) “`
注:本文檔實際約3800字,完整版包含更多代碼示例和原理圖解。建議配合Spark官方文檔(https://spark.apache.org/docs/latest/)共同學習。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。