打包spark代码在集群中运行

159 阅读3分钟

一、代码打包

  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 文件上传到集群。

二、在集群中提交作业

  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 相关的配置,例如:

      bash

      复制

      spark-submit \
        --master k8s://https://<kubernetes-master-url> \
        --deploy-mode cluster \
        --name spark-pi \
        --class org.apache.spark.examples.SparkPi \
        --conf spark.executor.instances=2 \
        --conf spark.kubernetes.container.image=<spark-executor-image> \
        local:///path/to/examples.jar
      

      其中 <kubernetes-master-url> 是 Kubernetes 集群的 master 地址,<spark-executor-image> 是 Spark 执行器容器镜像的名称。