搭建Windows开发环境

本文为您介绍如何在Windows操作系统下搭建Spark on MaxCompute开发环境。

如果您安装了Linux操作系统,请前往搭建Linux开发环境

前提条件

搭建Spark开发环境前,请确保您已经在Windows操作系统中安装如下软件:

说明

本文采用的软件版本号及软件安装路径仅供参考,请根据您的操作系统下载合适的软件版本进行安装。

  • JDK

    本文采用JDK 1.8.0_361,JDK官网下载地址请参见JDK官网

  • Python

    本文采用Python 3.7,Python官网下载地址请参见Python官网

    说明

    本文采用Spark-2.4.5,如采用其他版本Spark请下载安装对应版本Python,详情请参见https://pypi.org/project/pyspark/

  • Maven

    本文采用Apache Maven 3.8.7,Maven官网下载地址请参见Maven官网

  • Git

    本文采用git version 2.39.1.windows.1,Git官网下载地址请参见Git官网

  • Scala

    本文采用Scala 2.13.10,Scala官网下载地址请参见Scala官网

下载Spark on MaxCompute客户端包

Spark on MaxCompute发布包集成了MaxCompute认证功能。作为客户端工具,它通过Spark-Submit方式提交作业到MaxCompute项目中运行。MaxCompute提供了面向Spark1.x、Spark2.x和Spark3.x发布包,下载路径如下(本文采用Spark-2.4.5):

设置环境变量

您需要在Windows操作系统中单击此电脑 > 属性 > 高级系统设置 > 环境变量配置如下环境变量信息,配置方法及信息如下。

  • 配置Java环境变量。

    • 获取Java安装路径。

    • 编辑Java环境变量信息。

      1. 在系统变量中新增JAVA_HOME的变量,变量值输入Java安装路径。Java环境变量

      2. 系统变量Path中增加%JAVA_HOME%\bin

    • 确认Java已配置成功。

      • 验证方式

        通过键盘快捷键Win+R打开运行对话框,输入cmd,单击确定。在命令运行界面输入java -version,若返回的结果符合预期,则Java配置成功。

      • 预期结果示例

        java version "1.8.0_361"
        Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
        Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)
  • 配置Spark环境变量。

    • 获取Spark客户端包解压后的路径。

    • 编辑Spark环境变量信息。

      1. 新增SPARK_HOME系统变量,变量值中输入Spark客户端包解压后的路径。Spark环境变量

      2. 系统变量Path中增加%SPARK_HOME%\bin

  • 配置Scala环境变量。

    确认Scala已配置成功。

    • 验证方式

      通过键盘快捷键Win+R打开运行对话框,输入cmd,单击确定。在命令运行界面输入scala,若返回的结果符合预期,则Scala配置成功。

    • 预期结果示例

      Welcome to Scala 2.13.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_361).
      Type in expressions for evaluation. Or try :help.
      
      scala>
  • 配置Python环境变量。

    • 获取Python安装路径。

    • 编辑Python环境变量信息。

      在系统变量Path中增加Python和子目录Scripts的安装路径。Python环境变量

    • 确认Python已配置成功。

      • 验证方式

        通过键盘快捷键Win+R打开运行对话框,输入cmd,单击确定。在命令运行界面输入python --version,若返回的结果符合预期,则Python配置成功。

      • 预期结果示例

        Python 3.10.6
  • 配置Maven环境变量。

    • 获取Maven包解压后的路径。

    • 编辑Maven环境变量信息。

      1. 新增MAVEN_HOME系统变量,变量值中输入Maven包解压后的路径。Maven环境变量

      2. 系统变量Path中增加%MAVEN_HOME%\bin

    • 确认Maven已配置成功。

      • 验证方式

        通过键盘快捷键Win+R打开运行对话框,输入cmd,单击确定。在命令运行界面输入mvn --version,若返回的结果符合预期,则Maven配置成功。

      • 预期结果示例

        # ***表示Maven包解压后的部分路径。
        Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
        Maven home: D:\***\apache-maven-3.8.7-bin\apache-maven-3.8.7
        Java version: 1.8.0_361, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_361\jre
        Default locale: zh_CN, platform encoding: GBK
        OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
  • 配置Git环境变量。

    确认Git已配置成功。

    • 验证方式

      通过键盘快捷键Win+R打开运行对话框,输入cmd,单击确定。在命令运行界面输入git --version,若返回的结果符合预期,则Git配置成功。

    • 预期结果示例

      git version 2.39.1.windows.1
  • 配置spark_defaults.conf

    第一次使用Spark on MaxCompute客户端时,请在Spark客户端包的解压路径下,将conf文件夹下的spark-defaults.conf.template文件重命名为spark-defaults.conf后再进行相关配置。如果spark-defaults.conf.template和spark-defaults.conf文件都存在,则不需要重命名操作,只需要配置spark-defaults.conf文件即可。代码示例如下。

    # 直接进入到Spark客户端包的解压路径,并进入conf文件夹。请以实际路径为准。
    
    # 打开spark-defaults.conf文件配置信息
    
    # 在配置文件末尾添加如下配置信息。
    spark.hadoop.odps.project.name = <MaxCompute_project_name>
    spark.hadoop.odps.access.id = <AccessKey_id>
    spark.hadoop.odps.access.key = <AccessKey_secret>
    spark.hadoop.odps.end.point = <Endpoint>   # Spark客户端连接访问MaxCompute项目的Endpoint,您可以根据自己情况进行修改。
    # spark 2.3.0请将spark.sql.catalogImplementation设置为odps,spark 2.4.5请将spark.sql.catalogImplementation设置为hive。
    spark.sql.catalogImplementation={odps|hive}
    
    # 如下参数配置保持不变
    spark.hadoop.odps.task.major.version = cupid_v2
    spark.hadoop.odps.cupid.container.image.enable = true
    spark.hadoop.odps.cupid.container.vm.engine.type = hyper
    spark.hadoop.odps.moye.trackurl.host = http://jobview.odps.aliyun.com
    • MaxCompute_project_name:待访问MaxCompute项目的名称。

      此处为MaxCompute项目名称,非工作空间名称。您可以登录MaxCompute控制台,左上角切换地域后,在左侧导航栏选择工作区 > 项目管理,查看具体的MaxCompute项目名称。

    • AccessKey_id:具备目标MaxCompute项目访问权限的AccessKey ID。

      您可以进入AccessKey管理页面获取AccessKey ID。

    • AccessKey_secret:AccessKey ID对应的AccessKey Secret。

      您可以进入AccessKey管理页面获取AccessKey Secret。

    • Endpoint:MaxCompute项目所属区域的外网Endpoint。

      各地域的外网Endpoint信息,请参见各地域Endpoint对照表(外网连接方式)

    • VPC_endpoint:MaxCompute项目所属区域的VPC网络的Endpoint。

      各地域的VPC网络Endpoint信息,请参见各地域Endpoint对照表(阿里云VPC网络连接方式)

准备项目工程

Spark on MaxCompute提供了项目工程模板,建议您下载模板复制后直接在模板里开发。

重要

模板工程里的关于spark依赖的scope为provided,请不要更改,否则提交的作业无法正常运行。

准备项目工程示例如下:

  • 下载Spark-1.x模板并编译

    #打开已经下载好的git客户端(Git Bash),进入到需要下载项目工程的目录,执行
    git clone https://github.com/aliyun/MaxCompute-Spark.git
    
    #进入到工程文件夹中
    cd MaxCompute-Spark/spark-1.x
    
    #编译该工程包
    mvn clean package
  • 下载Spark-2.x 模板并编译

    #打开已经下载好的git客户端(Git Bash),进入到需要下载项目工程的目录,执行
    git clone https://github.com/aliyun/MaxCompute-Spark.git
    
    #进入到工程文件夹中
    cd MaxCompute-Spark/spark-2.x
    
    #编译该工程包
    mvn clean package
  • 下载Spark-3.x 模板并编译

    #打开已经下载好的git客户端(Git Bash),进入到需要下载项目工程的目录,执行
    git clone https://github.com/aliyun/MaxCompute-Spark.git
    
    #进入到工程文件夹中
    cd MaxCompute-Spark/spark-3.x
    
    #编译该工程包
    mvn clean package

上述命令执行完毕后,如果显示创建失败,说明环境配置有误,请按照上述配置指导仔细检查并修正环境配置信息。

配置依赖说明

在准备的Spark on MaxCompute项目下,配置依赖信息。命令示例如下(您可在Git客户端继续执行,也可直接打开该文件进行修改)。

  • 配置访问MaxCompute表所需的依赖。

    • 使用Spark-1.x模板场景

      # 进入spark-1.x文件夹。
      cd MaxCompute-Spark/spark-1.x
      
      # 编辑Pom文件,添加odps-spark-datasource依赖。
      <dependency>
        <groupId>com.aliyun.odps</groupId>
        <artifactId>odps-spark-datasource_2.10</artifactId>
        <version>3.3.8-public</version>
      </dependency>                           
    • 使用Spark-2.x模板场景

      # 进入spark-2.x文件夹。
      cd MaxCompute-Spark/spark-2.x
      
      # 编辑Pom文件,添加odps-spark-datasource依赖。
      <dependency>
          <groupId>com.aliyun.odps</groupId>
          <artifactId>odps-spark-datasource_2.11</artifactId>
          <version>3.3.8-public</version>
      </dependency>
  • 配置访问OSS所需的依赖。

    如果作业需要访问OSS,直接添加以下依赖即可。

    <dependency>
        <groupId>com.aliyun.odps</groupId>
        <artifactId>hadoop-fs-oss</artifactId>
        <version>3.3.8-public</version>
    </dependency>

更多Spark-1.x、Spark-2.x以及Spark-3.x的依赖配置信息,请参见Spark-1.x pom文件Spark-2.x pom文件Spark-3.x pom文件

冒烟测试

完成以上的工作之后,执行冒烟测试,验证Spark on MaxCompute是否可以端到端连通。

SparkPi冒烟测试

以Spark-2.x为例,您可以提交一个SparkPi验证功能是否正常,提交命令如下。

# 通过键盘快捷键Win+R打开运行对话框,输入cmd。
# 进入到需要执行作业的D:\PC\spark\spark-2.4.5-odps0.33.2\bin目录下。
cd D:\PC\spark\spark-2.4.5-odps0.33.2\bin

#输入如下命令。
spark-submit \
--class com.aliyun.odps.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
/path/to/your/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar

# 当看到以下日志表明冒烟作业成功。
19/06/11 11:57:30 INFO Client:
         client token: N/A
         diagnostics: N/A
         ApplicationMaster host: 11.222.166.90
         ApplicationMaster RPC port: 38965
         queue: queue
         start time: 1560225401092
         final status: SUCCEEDED

IDEA本地冒烟测试

  1. 在IDEA中打开已下载的项目工程代码,并手动将Spark on MaxCompute客户端下的Jars目录添加至IDEA项目工程中,详情请参见IDEA本地执行注意事项

  2. 在本地IDEA中添加如下代码,进行调试。

    val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .config("spark.master", "local[4]") // 需要设置spark.master为local[N]才能直接运行,N为并发数。
          .getOrCreate()
  3. Local不能直接引用spark-defaults.conf里的配置,需要手动指定相关配置,即在main下创建resource>odps.conf目录,并在odps.conf中指定相关配置。配置示例如下:

    说明

    Spark 2.4.5及以上版本需要在odps.conf中指定配置项。

    dops.access.id=""
    odps.access.key=""
    odps.end.point=""
    odps.project.name=""

Spark 2.4.5使用注意事项

  • 使用Spark 2.4.5提交作业

    直接使用Yarn-cluster模式在本地提交任务。详情请参见Cluster模式

  • Spark 2.4.5使用变化

    • 如果使用Yarn-cluster模式在本地提交任务,需要新增环境变量HADOOP_CONF_DIR=$SPARK_HOME/conf

    • 如果使用Local模式进行调试,需要在$SPARK_HOME/conf目录下新建odps.conf文件,并添加如下配置。

      odps.project.name = 
      odps.access.id = 
      odps.access.key =
      odps.end.point =
  • Spark 2.4.5参数配置变化

    • spark.sql.catalogImplementation配置为hive

    • spark.sql.sources.default配置为hive

    • spark.sql.odps.columnarReaderBatchSize,向量化读每个batch包含的行数,默认值为4096。

    • spark.sql.odps.enableVectorizedReader,开启向量化读,默认值为True。

    • spark.sql.odps.enableVectorizedWriter,开启向量化写,默认值为True。

    • spark.sql.odps.split.size,该配置可以用来调节读MaxCompute表的并发度,默认每个分区为256 MB。

Spark 3.1.1使用注意事项

  • 使用Spark 3.1.1提交作业

    直接使用Yarn-cluster模式在本地提交任务。详情请参见Cluster模式

  • Spark 3.1.1使用变化

    • 如果使用Yarn-cluster模式在本地提交任务,需要新增环境变量HADOOP_CONF_DIR=$SPARK_HOME/conf

    • 如果使用Yarn-cluster模式提交PySpark作业,需要在spark-defaults.conf配置文件添加以下参数使用Python3。

      spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz
      spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
    • 如果使用Local模式进行调试:

      • 需要在$SPARK_HOME/conf目录下新建odps.conf文件,并添加如下配置。

        odps.project.name = 
        odps.access.id = 
        odps.access.key =
        odps.end.point =
      • 需要在代码中添加spark.hadoop.fs.defaultFS = file:///,示例如下。

        val spark = SparkSession
          .builder()
          .config("spark.hadoop.fs.defaultFS", "file:///")
          .enableHiveSupport()
          .getOrCreate()
  • Spark 3.1.1参数配置变化

    • spark.sql.defaultCatalog配置为odps

    • spark.sql.catalog.odps配置为org.apache.spark.sql.execution.datasources.v2.odps.OdpsTableCatalog

    • spark.sql.sources.partitionOverwriteMode配置为dynamic

    • spark.sql.extensions配置为org.apache.spark.sql.execution.datasources.v2.odps.extension.OdpsExtensions

    • spark.sql.odps.enableVectorizedReader,开启向量化读,默认值为True。

    • spark.sql.odps.enableVectorizedWriter,开启向量化写,默认值为True。

    • spark.sql.catalog.odps.splitSizeInMB,该配置可以用来调节读MaxCompute表的并发度,默认每个分区为256 MB。