1. Spark 核心概念
1.1 RDD(彈性分布式數據集)
- 定義:RDD(Resilient Distributed Dataset)是 Spark 的核心抽象,是不可變、可分區、容錯的分布式數據集合。
- 特性:
- 彈性:自動進行內存和磁盤之間的數據存儲切換。
- 分布式:數據分區存儲在集群的多個節點上。
- 容錯:通過 Lineage(血緣關系)重建丟失的數據分區。
- 創建方式:
- 從 HDFS、本地文件等外部數據源創建。
- 從現有 RDD 轉換而來。
- 并行化集合(如?
sc.parallelize([1,2,3])
)。
1.2 轉換(Transformation)與動作(Action)
- 轉換:惰性操作,返回新的 RDD(如?
map
,?filter
,?reduceByKey
)。 - 動作:觸發計算并返回結果(如?
collect
,?count
,?saveAsTextFile
)。 - 惰性計算:轉換操作不會立即執行,只有當動作觸發時才會進行計算。
1.3 共享變量
- 廣播變量(Broadcast Variables):在每個節點緩存一份只讀變量,減少數據傳輸。
- 累加器(Accumulators):只能通過關聯操作累加,用于計數或求和等場景。
2. Spark 編程模型
2.1 SparkContext
- Spark 應用的入口點,負責與集群管理器通信,創建 RDD、累加器和廣播變量。
- 在 Spark 2.x 后,推薦使用?
SparkSession
?統一處理 SQL 和 DataFrame 操作。
2.2 基本操作示例
python
運行
# Python API (PySpark) 示例
from pyspark.sql import SparkSession# 創建 SparkSession
spark = SparkSession.builder \.appName("WordCount") \.getOrCreate()# 創建 RDD
lines = spark.sparkContext.textFile("hdfs://path/to/input.txt")# 轉換操作
words = lines.flatMap(lambda x: x.split(" "))
pairs = words.map(lambda x: (x, 1))
counts = pairs.reduceByKey(lambda a, b: a + b)# 動作操作
counts.saveAsTextFile("hdfs://path/to/output")# 關閉 SparkSession
spark.stop()
3. Spark SQL & DataFrame
3.1 DataFrame
- 帶 Schema 的分布式數據集,類似于關系型數據庫的表。
- 支持 SQL 查詢和多種數據源(JSON、Parquet、Hive 等)。
- 性能優化:Catalyst 優化器自動生成高效執行計劃。
3.2 Spark SQL
- 通過 SQL 或 DSL 操作結構化數據。
- 示例:
python
運行
# 創建 DataFrame
df = spark.read.json("hdfs://path/to/data.json")# SQL 查詢
df.createOrReplaceTempView("people")
results = spark.sql("SELECT name, age FROM people WHERE age > 20")# DataFrame API
results.select("name", "age").filter(df["age"] > 20).show()
4. Spark 集群架構
4.1 組件
- Driver:運行用戶程序的主進程,負責調度任務。
- Executor:工作節點上的進程,執行具體任務并緩存數據。
- Cluster Manager:資源調度(如 YARN、Kubernetes、Standalone)。
4.2 任務執行流程
- Driver 分解作業為 DAG(有向無環圖)。
- DAG Scheduler 將 DAG 劃分為多個 Stage。
- Task Scheduler 將任務分配給 Executor 執行。
5. Spark 部署模式
5.1 本地模式
- 單節點運行,主要用于開發和測試。
bash
spark-submit --master local[4] my_script.py
5.2 集群模式
- Standalone:Spark 自帶的集群管理器。
- YARN:Hadoop YARN 管理資源(常見于生產環境)。
- Kubernetes:容器化部署(新興趨勢)。
6. 性能優化
6.1 內存管理
- 合理配置?
spark.memory.fraction
(執行內存與存儲內存比例)。 - 使用序列化(如 Kryo)減少內存占用。
6.2 數據傾斜處理
- 加鹽(Salting):對 Key 增加隨機前綴。
- 廣播大表 Join 中的小表。
6.3 其他優化
- 重用 RDD:使用?
cache()
?或?persist()
。 - 合并小文件:使用?
coalesce()
?減少分區數。
7. 生態系統
7.1 核心模塊
- Spark Core:基礎引擎。
- Spark SQL:結構化數據處理。
- Spark Streaming:流處理。
- MLlib:機器學習。
- GraphX:圖計算。
7.2 集成工具
- Zeppelin/Notebook:交互式開發。
- MLflow:機器學習生命周期管理。
- Delta Lake:數據湖事務處理。
8. 應用場景
- 批處理:ETL、報表生成。
- 實時分析:日志監控、實時推薦。
- 機器學習:預測模型訓練。
- 圖計算:社交網絡分析。