Spark 大规模数据处理最佳实践

Spark 大规模数据处理最佳实践

当数据量达到 TB 级别,单机的 Pandas 就无能为力了。Apache Spark 凭借分布式计算能力和丰富的 API,成为大数据处理的事实标准。本文分享 Spark 在生产环境中的最佳实践。

数据倾斜是 Spark 最常见的问题:

示意图
示意图
# 检测倾斜:查看各分区的数据量
df.rdd.mapPartitions(lambda x: [sum(1 for _ in x)]).collect()

# 方案1:加盐打散
from pyspark.sql.functions import col, concat, lit, rand

salted = df.withColumn("salted_key",
    concat(col("skew_key"), lit("_"), (rand() * 10).cast("int")))

# 方案2:广播小表
from pyspark.sql.functions import broadcast

result = large_df.join(broadcast(small_df), "key")

内存管理是另一个关键调优点:

# Spark 配置优化
spark.conf.set("spark.sql.shuffle.partitions", "200")
spark.conf.set("spark.sql.adaptive.enabled", "true")
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
spark.conf.set("spark.memory.fraction", "0.8")
spark.conf.set("spark.memory.storageFraction", "0.3")

AQE(自适应查询执行)是 Spark 3.0 的重要特性,它可以在运行时根据实际数据量动态调整执行计划。在我们的日志分析管道中,启用 AQE 后,由于自动合并小分区和动态切换 Join 策略,整体执行时间减少了 40%。结合 Delta Lake 的事务保证和时间旅行功能,我们的数据管道终于实现了端到端的可靠性。