# 大數據中Spark實戰技巧是什么
## 一、Spark核心優化技巧
### 1. 內存管理優化
```python
# 配置示例:調整內存分配比例
spark = SparkSession.builder \
.config("spark.memory.fraction", "0.8") \
.config("spark.memory.storageFraction", "0.3") \
.getOrCreate()
spark.memory.offHeap.enabled
啟用堆外內存// 三種設置方式對比
sc.textFile("hdfs://path").repartition(200) // 方式1
spark.conf.set("spark.default.parallelism", 200) // 方式2
df.coalesce(100) // 方式3(只減少分區)
分區數 = executor數量 * 每個executor核心數 * 2-3
join/aggregate
等操作后自動調整分區# 低效做法 vs 高效做法
df.filter(col("age") > 30).select("name") # 低效
df.select("name", "age").filter(col("age") > 30) # 高效
expr()
替代Join類型 | 優化方案 | 適用場景 |
---|---|---|
Broadcast Join | spark.sql.autoBroadcastJoinThreshold=10MB |
小表<10MB |
Sort-Merge Join | 確保分區列相同 | 大表關聯 |
Bucket Join | 預先分桶df.write.bucketBy(100, "id") |
頻繁關聯場景 |
# 通過REST API獲取指標
curl http://driver:4040/api/v1/applications/<app-id>/stages
-- 傾斜鍵處理示例
SELECT /*+ SKEW('table_name','column_name',(skew_value)) */
FROM table_name
df.stat.freqItems()
找高頻值salting
技術# spark-submit配置示例
spark-submit \
--executor-memory 16G \
--executor-cores 4 \
--num-executors 20 \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true
executor-memory = (container內存 - 1GB) * 0.9
spark.dynamicAllocation.minExecutors=10
spark.dynamicAllocation.maxExecutors=100
spark.shuffle.service.port=7337
-- 啟用配置
SET spark.sql.adaptive.enabled=true;
SET spark.sql.adaptive.coalescePartitions.enabled=true;
# 創建Delta表
df.write.format("delta") \
.mode("overwrite") \
.save("/delta/events")
df = spark.read.format("delta").option("versionAsOf", 0)
OOM錯誤:
spark.sql.shuffle.partitions
設置spark.kryoserializer.buffer.max
值小文件問題:
df.repartition(10).write.parquet("output")
序列化錯誤:
@transient lazy val
修飾不可序列化對象掌握Spark實戰技巧需要:
1. 深入理解執行計劃(df.explain(true)
)
2. 建立性能基準測試體系
3. 持續監控關鍵指標
4. 保持版本更新(Spark 3.x性能提升顯著)
最佳實踐:生產環境建議使用Spark 3.3+版本,配合Kubernetes調度可獲得最佳資源利用率 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。