打包spark代码在集群中运行

0 阅读2分钟

. 代码打包

(1)使用 Maven 打包(适用于 Java/Scala 项目)

  • 确保项目中有一个 pom.xml 文件,定义项目的依赖关系和构建配置。

  • pom.xml 文件中添加 Spark 相关依赖,例如:

    xml

    复制

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.12</artifactId>
      <version>3.3.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.12</artifactId>
      <version>3.3.0</version>
    </dependency>
    

    其中版本号需根据集群中 Spark 的版本选择,2.12 是 Scala 的版本号。

  • 在项目根目录下运行 mvn package 命令,Maven 会根据 pom.xml 文件中的配置,下载依赖并打包项目。打包后的 JAR 文件会出现在 target 文件夹中。

(2)使用 SBT 打包(也适用于 Scala 项目)

  • 项目中有一个 build.sbt 文件,用于定义项目构建配置。

  • build.sbt 文件中添加 Spark 依赖,例如:

    scala

    复制

    libraryDependencies += "org.apache.spark" %% "spark-core" % "3.3.0"
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.3.0"
    
  • 在项目根目录下运行 sbt package 命令,sbt 会进行项目打包,打包后的 JAR 文件同样在 target 文件夹中。

(3)对于 Python 项目(使用 PySpark)

  • 如果是简单的脚本,可以将代码文件直接上传到集群。

  • 如果项目依赖较多,可以使用 zipfile 模块将代码文件和依赖打包成一个 zip 文件。例如:

    Python

    复制

    import zipfile
    with zipfile.ZipFile('my_spark_project.zip', 'w') as zipf:
        zipf.write('main.py')  # 主程序文件
        zipf.write('module1.py')  # 自定义模块文件
        zipf.write('module2.py')
    

    然后将这个 zip 文件上传到集群。

2. 提交到 Spark 集群运行

(1)使用 spark-submit 命令(适用于所有语言的 Spark 作业)

  • 基本语法:

    bash

    复制

    spark-submit \
      --class <main-class> \
      --master <master-url> \
      --deploy-mode <deploy-mode> \
      --conf <key>=<value> \
      --py-files <python-files> \
      <application-jar> \
      [application-arguments]
    
  • 举例:

    • 对于 Java/Scala 项目,假设打包后的 JAR 文件是 my-spark-app.jar,主类是 com.example.MySparkApp,集群的 master 地址是 spark://master:7077,运行在集群模式(cluster),并且需要设置一些配置参数,如:

      bash

      复制

      spark-submit \
        --class com.example.MySparkApp \
        --master spark://master:7077 \
        --deploy-mode cluster \
        --conf spark.executor.memory=4g \
        my-spark-app.jar \
        arg1 arg2
      

      其中 arg1arg2 是传递给主类的参数。

    • 对于 Python 项目,假设主脚本文件是 main.py,集群是 YARN 资源管理器,运行在客户端模式(client),可以这样提交:

      bash

      复制

      spark-submit \
        --master yarn \
        --deploy-mode client \
        --py-files my_spark_project.zip \
        main.py \
        arg1 arg2
      

      这里 --py-files 参数用于指定附加的 Python 文件,main.py 是主脚本文件,arg1arg2 是传递给脚本的参数。

(2)通过集群管理工具提交(如 YARN、Kubernetes)

  • 如果集群使用的是 YARN 作为资源管理器,spark-submit 命令会与 YARN 集成。可以在 spark-submit 命令中添加一些 YARN 相关的配置参数,例如:

    bash

    复制

    spark-submit \
      --master yarn \
      --deploy-mode cluster \
      --num-executors 10 \
      --executor-memory 4g \
      --executor-cores 4 \
      my-spark-app.jar
    

    这里 --num-executors 指定要分配的执行器数量,--executor-memory 指定每个执行器的内存大小,--executor-cores 指定每个执行器的 CPU 核心数。

  • 如果集群使用 Kubernetes,需要在 spark-submit 命令中指定 Kubernetes