[spark]本地模式和集群模式

6 阅读4分钟

1. PySpark 是什么?它不仅仅是“客户端”

您的理解“pyspark只是一个客户端,是用户连接spark集群的入口” 只描述了PySpark功能的一部分。更准确地说:

  • PySpark 首先是一个 Python 库:当您通过 pip install pyspark 安装时,您获得的是一个完整的 Spark 开发包。这个包里包含了:
    • Spark 的核心引擎(部分):它允许您在单机本地模式下运行 Spark。这意味着您不需要任何额外的集群,就可以在自己的电脑上启动 Spark 进程(一个 Driver,可能还有多个线程模拟的 Executor),并执行所有 Spark 代码。
    • PySpark API:提供 Python 语言对 Spark DataFrame、SQL、Streaming、MLlib 等功能的编程接口。
    • 连接集群所需的客户端代码:这部分符合您的理解,它包含了与远程 Spark 集群(如 Standalone、YARN、Kubernetes 集群)通信的客户端库。

简单来说:PySpark 既是“单机版Spark运行时”,也是“连接集群的客户端库”。

2. 如何执行 Spark 任务?两种主要模式

基于PySpark的双重角色,执行Spark任务有两种主要模式:

模式一:本地模式

  • 场景开发、测试、调试、学习
  • 运行方式:您写一个 Python 脚本(例如 my_app.py),在脚本中初始化 SparkSession。当您运行这个脚本时(python my_app.py),Spark 会在您当前电脑的本地进程内启动。
  • 资源:使用的就是您自己电脑的 CPU 核心和内存。您可以配置 spark.masterlocal(单线程),local[4](4个线程),local[*](使用所有逻辑核心)等。
  • 示例代码
    from pyspark.sql import SparkSession
    
    # 创建一个运行在本地(4个线程)的 SparkSession
    spark = SparkSession.builder \
        .appName("MyLocalApp") \
        .master("local[4]") \
        .getOrCreate()
    
    # 您的数据处理逻辑
    df = spark.read.csv("local_file.csv")
    df.show()
    
    spark.stop()
    
  • 结论:在这种模式下,您不需要一个外部的 Spark 集群。PySpark 库本身提供了运行环境。

模式二:集群模式

  • 场景生产环境、处理海量数据
  • 运行方式:您需要有一个正在运行的 Spark 集群(可以是公司内网的 Standalone 集群,或基于YARN/K8s的集群)。您通过 PySpark 提供的 spark-submit 工具(它也随 pip install pyspark 一起安装在您本地),将您的应用程序提交到这个集群。
  • 资源:任务会由集群的 Master 调度,在多个 Worker 节点的 Executor 中运行,使用的是集群的分布式资源。
  • 提交命令示例
    # 提交到 Standalone 集群
    $SPARK_HOME/bin/spark-submit \
        --master spark://master-node:7077 \
        --deploy-mode client \
        my_app.py
    
    # 提交到 YARN 集群
    $SPARK_HOME/bin/spark-submit \
        --master yarn \
        --deploy-mode cluster \
        my_app.py
    
  • 您的应用程序 my_app.py:在初始化 SparkSession 时,通常不需要在代码里硬指定 .master(),因为 spark-submit 的命令行参数 --master 会覆盖它。
    from pyspark.sql import SparkSession
    
    # 对于集群提交,通常这样创建即可,master由提交命令决定
    spark = SparkSession.builder \
        .appName("MyClusterApp") \
        .getOrCreate()
    
    # 您的数据处理逻辑。注意:读取的数据路径应是集群所有节点都能访问的(如HDFS,S3)
    df = spark.read.csv("hdfs://namenode:8020/path/to/file.csv")
    df.show()
    
    spark.stop()
    
  • 结论:在这种模式下,您的本地 PySpark 环境主要扮演了开发环境和提交客户端的角色。任务在远程集群中执行。

总结与关系梳理

特性本地模式集群模式
目的开发、测试、调试生产、大规模计算
运行环境您自己电脑的本地进程独立的、多节点的 Spark 集群
资源来源本地机器的CPU和内存集群中所有Worker节点的资源
如何启动直接运行Python脚本 (python app.py)使用 spark-submit 提交脚本
数据位置本地文件系统分布式存储系统 (如 HDFS, S3)
PySpark 角色运行时库 + API客户端库 + API

所以,回到您的问题:

  1. “pyspark只是一个客户端对吗?”

    不完全对。在本地开发测试时,它是完整的运行时。只有当你用它连接远程集群时,它才主要充当客户端。

  2. “我如果想执行spark任务,我还需要把任务提交到spark集群中,对吗?”

    看情况。如果您只是学习和测试,完全可以在本地模式下执行任务,无需集群。只有当您的数据量或计算需求超出单机能力,需要进入生产阶段时,才需要将任务提交到Spark集群

给您的开发建议: 标准的开发流程是:先在本地使用 PySpark 的本地模式(local[*])进行编码、单元测试和小规模数据测试。确保逻辑正确后,再通过 spark-submit 将最终版本提交到生产集群进行全量数据运算。