
# 创建Spark作业
DLI Spark作业为用户提供全托管式的Spark计算服务。
在总览页面，单击Spark作业右上角的"创建作业"，或在Spark作业管理页面，单击右上角的"创建作业"，均可进入Spark作业编辑页面。
进入Spark作业编辑页面，页面会提示系统将创建DLI临时数据桶。该桶用于存储使用DLI服务产生的临时数据，例如：作业日志、作业结果等。如果不创建该桶，将无法查看作业日志。可以通过[配置生命周期规则](https://support.huaweicloud.com/usermanual-obs/obs_03_0335.html)实现定时删除OBS桶中的对象或者定时转换对象的存储类别。桶名称为系统默认。
如果不需要创建DLI临时数据桶，并且希望不再收到该提示，可以勾选"下次不再提示"并单击"取消"。
#### 前提条件
- 请先将所要依赖的程序包通过"数据管理\>程序包管理"页面上传至对应的OBS桶中。
- 创建Spark作业，访问其他外部数据源时，如访问OpenTSDB、HBase、Kafka、DWS、RDS、CSS、CloudTable、DCS Redis、DDS等，需要先创建跨源连接，打通作业运行队列到外部数据源之间的网络。
  - 当前Spark作业支持访问的外部数据源详情请参考[DLI常用跨源分析开发方式](https://support.huaweicloud.com/usermanual-dli/dli_01_0410.html)。
  
  - 创建跨源连接操作请参见[配置DLI与数据源网络连通（增强型跨源连接）](https://support.huaweicloud.com/usermanual-dli/dli_01_0426.html)。
    创建完跨源连接后，可以通过"资源管理 \> 队列管理"页面，单击"操作"列"更多"中的"测试地址连通性"，验证队列到外部数据源之间的网络连通是否正常。详细操作可以参考[测试队列与数据源网络连通性](https://support.huaweicloud.com/usermanual-dli/dli_01_0489.html)。
    
   
 
#### 操作步骤
1. 在DLI管理控制台的左侧导航栏中，单击"作业管理 \> Spark作业"，进入Spark作业页面。 单击右上角的"创建作业"，在Spark作业编辑窗口，可以选择使用"表单模式"或者"API模式"进行参数设置。
   以下以"表单模式"页面进行说明，"API模式"即采用API接口模式设置参数及参数值，具体请参考《[数据湖探索API参考](https://support.huaweicloud.com/api-dli/dli_02_0124.html)》。
   

2. 选择运行队列。
   1. 队列：在下拉列表中选择要使用的队列。
   
   2. 选择Spark版本。在下拉列表中选择支持的Spark版本，推荐使用最新版本。
      ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
      不建议长期混用不同版本的Spark引擎。
      - 长期混用不同版本的Spark引擎会导致代码在新旧版本之间不兼容，影响作业的执行效率。
      
      - 当作业依赖于特定版本的库或组件，长期混用不同版本的Spark引擎可能会导致作业因依赖冲突而执行失败。
        
    
3. 应用程序配置。
   表1应用程序配置参数说明 
   | 参数名称        | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|
   | 应用程序        | 选择需要执行的程序包。包括".jar"和".py"两种类型。 Jar包的管理方式： - 上传OBS管理程序包：提前将对应的jar包上传至OBS桶中。并在此处选择对应的OBS路径。  - 上传DLI管理程序包：提前将对应的jar包上传至OBS桶中，并在DLI管理控制台的"数据管理\>程序包管理"中创建程序包，具体操作请参考[创建DLI程序包](https://support.huaweicloud.com/usermanual-dli/dli_01_0367.html)。   Spark3.3.x及以上版本只能选择OBS路径下的程序包。 |
   | 委托          | 使用Spark 3.3.1（Spark通用队列场景）及以上版本的引擎执行作业时，需要您先在IAM页面创建相关委托，并在此处添加新建的委托信息。具体操作请参考[自定义DLI委托权限](https://support.huaweicloud.com/usermanual-dli/dli_01_0616.html)。 常见新建委托场景：允许DLI读写OBS将日志转储、允许DLI在访问DEW获取数据访问凭证、允许访问Catalog获取元数据等场景。 了解更多[DLI委托权限设置](https://support.huaweicloud.com/usermanual-dli/dli_01_0619.html)。                                                                                                                          |
   | 主类（--class） | 输入主类名称。当应用程序类型为".jar"时，主类名称不能为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 应用程序参数      | 用户自定义参数，多个参数请以Enter键分隔。 应用程序参数支持全局变量替换。例如，在"全局配置"\>"全局变量"中新增全局变量key为batch_num，可以使用{{batch_num}}，在提交作业之后进行变量替换。                                                                                                                                                                                                                                                                                                                                                        |
      
   
4. 作业配置。
   表2作业配置参数说明 
   | 参数名称            | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   |:---|:---|
   | 作业名称（--name）    | 设置作业名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | Spark参数（--conf） | 以"key=value"的形式设置提交Spark作业的属性，多个参数以Enter键分隔。 Spark参数value支持全局变量替换。例如，在"全局配置"\>"全局变量"中新增全局变量key为custom_class，可以使用"spark.sql.catalog"={{custom_class}}，在提交作业之后进行变量替换。 说明： - Spark作业不支持自定义设置jvm垃圾回收算法。  - 如果选择Spark版本为3.1.1时，需在Spark参数（--conf)配置跨源作业的依赖模块。配置样例请参考[表3]。   如果选择Spark版本为3.3.1时，支持在Spark参数（--conf)配置计算资源规格参数， 且conf的配置优先级高于高级配置指定的值。 参数对应关系请参考[表4]。 说明： 在Spark参数（--conf)配置计算资源规格参数时，可以配置单位 M/G/K，不配置时候默认单位为byte。 |
   | 访问元数据           | 选择是否开启Spark作业访问元数据。如果需要配置作业访问的元数据类型时启用该选项。默认访问DLI元数据。 开启后还需要选择元数据来源。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 是否重试            | 作业失败后是否进行重试。 选择"是"需要配置以下参数： "最大重试次数"：设置作业失败重试次数，最大值为"100"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
      
    表3Spark参数（--conf)配置跨源作业的依赖模块说明 
   | 数据源类型    | 样例                                                                                                                                                                                                         |
   |:---|:---|
   | CSS      | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/css/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/css/\*           |
   | DWS      | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/dws/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/dws/\*           |
   | HBase    | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/hbase/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/hbase/\*     |
   | OpenTSDB | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/opentsdb/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/opentsdb/\* |
   | RDS      | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/rds/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/rds/\*          |
   | Redis    | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/redis/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/redis/\*     |
   | Mongo    | spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/mongo/\* spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/mongo/\*       |
      
    表4控制台计算资源规格参数与Spark参数（--conf)配置计算资源规格参数的对应关系 
   | 控制台参数名称                                                                                                                                    | Spark参数（--conf)配置项参数名称                | 说明                                                                                                                                                                                                                 | 约束与限制                                                                                                                       |
   |:---|:---|:---|:---|
   | Executor内存 完整的Executor内存=spark.executor.memory + spark.executor.memoryOverhead                              | spark.executor.memory                 | executor内存，可配置。                                                                                                                                                                                                    | -                                                                                                                           |
   | Executor内存 完整的Executor内存=spark.executor.memory + spark.executor.memoryOverhead                              | spark.executor.memoryOverhead         | Spark应用程序中每个执行器（executor）的堆外内存量。该参数不可配置： spark.executor.memoryOverhead=spark.executor.memory \* spark.executor.memoryOverheadFactor                                                   | 最小值为384M， 即当spark.executor.memory \* spark.executor.memoryOverheadFactor的值小于384M时系统自动配置为384M。 |
   | Executor内存 完整的Executor内存=spark.executor.memory + spark.executor.memoryOverhead                              | spark.executor.memoryOverheadFactor   | 该参数定义了堆外内存分配量与堆内内存分配量之比，spark jar时默认0.1，spark python 默认0.4 可配置                                                                                                                                                     | spark.executor.memoryOverheadFactor优先级高于spark.kubernetes.memoryOverheadFactor                                               |
   | Executor CPU核数                                                                                                                             | spark.executor.cores                  | 对应executor核数 可配置                                                                                                                                                                                                   | -                                                                                                                           |
   | Executor个数                                                                                                                                 | spark.executor.instances              | 对应executor个数 可配置                                                                                                                                                                                                   | -                                                                                                                           |
   | driver CPU核数                                                                                                                               | spark.driver.cores                    | 对应driver核数 可配置                                                                                                                                                                                                     | -                                                                                                                           |
   | driver内存 完整的driver内存=spark.driver.memory + spark.edriver.memoryOverhead  | spark.driver.memory                   | 对应driver内存 可配置                                                                                                                                                                                                     | -                                                                                                                           |
   | driver内存 完整的driver内存=spark.driver.memory + spark.edriver.memoryOverhead  | spark.driver.memoryOverhead           | Spark应用程序中每个driver的堆外内存量。 该参数不可配置： spark.driver.memoryOverhead= spark.driver.memory \* spark.driver.memoryOverheadFactor | 最小值为384M，即当spark.driver.memory \* spark.driver.memoryOverheadFactor 的值小于384M时系统自动配置为384M。                                   |
   | driver内存 完整的driver内存=spark.driver.memory + spark.edriver.memoryOverhead  | spark.driver.memoryOverheadFactor     | 该参数定义了堆外内存分配量与堆内内存分配量之比，spark jar时默认0.1，spark python 默认0.4 可配置                                                                                                                                                     | spark.driver.memoryOverheadFactor优先级高于spark.kubernetes.memoryOverheadFactor                                                 |
   | -                                                                                                                                          | spark.kubernetes.memoryOverheadFactor | 用于设置在分配给Spark Executor的内存之外分配的内存量。spark jar时默认0.1，spark python 默认0.4 可配置                                                                                                                                           | spark.executor.memoryOverheadFactor和spark.driver.memoryOverheadFactor优先级高于spark.kubernetes.memoryOverheadFactor。            |
      
   
5. 依赖配置（可选）
   表5依赖配置参数说明 
   | 参数名称                   | 参数描述                                                                                                                                                                                             |
   |:---|:---|
   | 依赖jar包（--jars）         | 运行spark作业依赖的jars。可以输入jar包名称，也可以输入对应jar包文件的OBS路径，格式为：obs://桶名/文件夹路径名/包名。                                                                                                                          |
   | 依赖python文件（--py-files） | 运行spark作业依赖的py-files。可以输入Python文件名称，也可以输入Python文件对应的OBS路径，格式为：obs://桶名/文件夹路径名/文件名。                                                                                                               |
   | 其他依赖文件（--files）        | 运行spark作业依赖的其他files。可以输入依赖文件名称，也可以输入对应的OBS路径，格式为：obs://桶名/文件夹路径名/文件名。                                                                                                                            |
   | 依赖分组                   | 在创建程序包时，如果选择了分组，在此处选择对应的分组，则可以同时选中该分组中的所有程序包和文件。创建程序包操作请参考[创建DLI程序包](https://support.huaweicloud.com/usermanual-dli/dli_01_0367.html)。 Spark 3.3.x及以上版本不支持配置分组信息。 |
      
   
6. 高级包括以下两项参数：
   - 选择依赖资源：具体参数请参考[表6]。
   
   - 计算资源规格：具体参数请参考[表7]。
     ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
     Spark资源并行度由Executor数量和Executor CPU核数共同决定。
     **任务可并行执行的最大Task数量=Executor个数 \* Executor CPU核数。**
     您可以根据购买的队列资源合理规划计算资源规格。
     需要注意的是，Spark任务执行需要driver、executor等多个角色共同调度完成，因此"Executor个数\*Executor CPU核数"要小于队列的计算资源CU数，避免其他Spark任务角色无法启动。更多Spark任务角色的相关信息请参考[Spark官方](https://spark.apache.org/)。
     **Spark作业参数计算公式：**
     - CU数量=实际CU数量=max{（driver CPU核数+Executor个数\*Executor CPU核数），\[（driver CPU内存数+Executor个数\*Executor内存）/4\]}
     
     - 内存数=driver内存+(Executor个数\*Executor内存）
       
   
   
    表6选择依赖资源参数说明 
   | 参数名称    | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   |:---|:---|
   | modules | 如果选择Spark版本为3.1.1时，无需选择Module模块， 需在Spark参数（--conf)配置跨源作业的依赖模块。 DLI系统提供的用于执行跨源作业的依赖模块访问各个不同的服务，选择不同的模块： - CloudTable/MRS HBase: sys.datasource.hbase  - DDS：sys.datasource.mongo  - CloudTable/MRS OpenTSDB: sys.datasource.opentsdb  - DWS: sys.datasource.dws  - RDS MySQL: sys.datasource.rds  - RDS PostGre: sys.datasource.rds  - DCS: sys.datasource.redis  - CSS: sys.datasource.css   DLI内部相关模块： - sys.res.dli-v2  - sys.res.dli  - sys.datasource.dli-inner-table   |
   | 资源包     | 运行spark作业依赖的jar包。 Spark 3.3.x及以上版本不支持配置resources参数，请在jars、pyFiles、files中配置资源包信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
      
    表7计算资源规格参数说明 
   | 参数名称           | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   |:---|:---|
   | 资源规格           | 下拉选择所需的资源规格。系统提供3种资源规格供您选择。 资源规格包含以下参数： - Executor内存  - Executor CPU核数  - Executor个数  - driver CPU核数  - driver内存   最终配置结果以修改后数据为准。 |
   | Executor内存     | 在所选资源规格基础上自定义Executor内存规格。 代表每个Executor的内存。通常建议Executor CPU核数：Executor内存=1：4。                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | Executor CPU核数 | 用于设置Spark作业申请的每个Executor的CPU核数，决定每个Executor并行执行Task的能力。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | Executor个数     | 用于设置Spark作业申请的Executor的数量。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | driver CPU核数   | 用于设置driver CPU核数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | driver内存       | 用于设置driver内存大小，通常建议即driver CPU核数：driver内存=1：4。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
      
   - 如果选择Spark版本为3.3.1时，支持在Spark参数（--conf)配置计算资源规格参数， 且conf的配置优先级高于高级配置指定的值。
     参数对应关系请参考[表4]。
     ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
     在Spark参数（--conf)配置计算资源规格参数时，可以配置单位 M/G/K，不配置时候默认单位为byte。
     
   
   - Spark3.3.1及以上版本增加了对作业的计算资源规格的约束限制。详细信息请参考[表8]。
     ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/caution_3.0-zh-cn.png)
     若计算资源规格配置值设置的过高，超出了集群或项目的资源分配能力，作业可能会因资源申请失败导致运行错误。
      表8计算资源规格取值范围 
     | 参数说明           | 标准版弹性资源池修改后限制 | 基础版弹性资源池   |
     |:---|:---|:---|
     | Executor内存     | 450MB-64GB    | 450MB-16GB |
     | Executor CPU核数 | 0-16          | 0-4        |
     | Executor个数     | 无限制           | 无限制        |
     | driver CPU核数   | 0-16          | 0-4        |
     | driver内存       | 450MB-64GB    | 450MB-16GB |
     | 作业CU配额         | 无限制           | 无限制        |
        
     
    
7. 完成作业的参数配置后，单击Spark作业编辑页面右上方"执行"，提交作业。 当页面显示"批处理作业提交成功"，可在"Spark作业"管理页面查看提交作业的状态及日志等。
   ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
   在Spark作业提交过程中，若长时间未能成功获取资源，作业状态将在持续等待3小时左右转变为"已失败"即session已退出。Spark作业状态请参考[查看Spark作业的基本信息](https://support.huaweicloud.com/usermanual-dli/dli_01_0385.html#dli_01_0385__section12526165519235)。
   
 
