Spark 大数据入门——从零搭建分布式计算环境

Spark 是当前最流行的大数据计算引擎,相比 Hadoop MapReduce 性能提升 10~100 倍。本文从零搭建 Spark 开发环境,用 Python 编写第一个 Spark 程序。

一、Spark 是什么

Spark 是一个分布式计算框架,可以在成百上千台服务器上并行处理数据。

对比 Hadoop MapReduce Spark
计算速度 慢(磁盘读写) 快 10~100 倍(内存计算)
易用性 Java 编写,代码量大 Python/Java/Scala 均可
适用场景 离线批处理 批处理 + SQL + 流处理 + 机器学习

二、环境搭建

1. 安装 Spark(Windows/Linux)

bash 复制代码
# 1. 下载 Spark(需预装 Java 8+)
wget https://dlcdn.apache.org/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz

# 2. 解压
tar -xzf spark-3.5.0-bin-hadoop3.tgz
mv spark-3.5.0-bin-hadoop3 /opt/spark

# 3. 配置环境变量
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin

2. 安装 PySpark

bash 复制代码
pip install pyspark

3. 验证安装

bash 复制代码
# 进入 Spark Shell(交互式环境)
pyspark

# 看到这个界面说明安装成功
# Welcome to Spark version 3.5.0

三、核心概念

概念 说明
RDD 弹性分布式数据集,Spark 的核心抽象
DataFrame 带列名的分布式数据集(类似 Pandas)
SparkSession Spark 应用的入口
Task 任务,被发送到 executor 执行
Partition 数据分区,每个分区对应一个 task

四、第一个 Spark 程序

1. 读取数据

python 复制代码
from pyspark.sql import SparkSession

# 创建 SparkSession
spark = SparkSession.builder \
    .appName("FirstSparkApp") \
    .getOrCreate()

# 读取 CSV 文件
df = spark.read.csv("students.csv", header=True, inferSchema=True)

# 查看数据
df.show(5)
df.printSchema()

2. 数据转换

python 复制代码
from pyspark.sql.functions import col, avg, count

# 筛选成绩大于 60 分的学生
df.filter(col("score") > 60).show()

# 按班级分组统计平均分
df.groupBy("class_name") \
  .agg(avg("score").alias("avg_score"),
       count("*").alias("student_count")) \
  .orderBy("avg_score", ascending=False) \
  .show()

五、实战:学生成绩统计分析

python 复制代码
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, max, min, count, when

# 创建会话
spark = SparkSession.builder.appName("ScoreAnalysis").getOrCreate()

# 读取数据
df = spark.read.csv("scores.csv", header=True, inferSchema=True)

# 1. 数据概览
print(f"总记录数: {df.count()}")
df.describe().show()

# 2. 各班级平均分
df.groupBy("class") \
  .agg(avg("score").alias("平均分"),
       max("score").alias("最高分"),
       min("score").alias("最低分")) \
  .orderBy("平均分", ascending=False) \
  .show()

# 3. 成绩分布
df.withColumn("等级",
    when(col("score") >= 90, "优秀")
    .when(col("score") >= 80, "良好")
    .when(col("score") >= 70, "中等")
    .when(col("score") >= 60, "及格")
    .otherwise("不及格")
).groupBy("等级").agg(count("*").alias("人数")) \
 .orderBy("等级").show()

spark.stop()

六、Spark SQL

Spark 支持用 SQL 语句查询数据,适合熟悉 SQL 的开发者:

python 复制代码
# 将 DataFrame 注册为临时表
df.createOrReplaceTempView("students")

# 用 SQL 查询
result = spark.sql("""
    SELECT class_name,
           ROUND(AVG(score), 2) as avg_score,
           COUNT(*) as count
    FROM students
    WHERE score >= 60
    GROUP BY class_name
    ORDER BY avg_score DESC
""")
result.show()

七、性能优化建议

1. 合理设置分区数

python 复制代码
# 默认分区数偏小,大数据量时调整
spark.conf.set("spark.sql.shuffle.partitions", "200")

2. 使用缓存

python 复制代码
# 频繁使用的数据缓存到内存
df.cache()
# 或
df.persist()

3. 避免使用 UDF

python 复制代码
# ❌ 慢:使用 Python UDF
from pyspark.sql.functions import udf

# ✅ 快:使用内置函数
from pyspark.sql.functions import when, col

总结

Spark 是大数据领域的核心技术,掌握它之后处理海量数据不再是难题。记住三步:

  1. 创建 SparkSession ------ 入口
  2. 读取数据 ------ spark.read.csv/json/parquet
  3. 数据转换 ------ filtergroupByagg 等操作

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 大数据 实战干货,不让你白来。