
# 使用DLI提交Spark Jar作业
#### 操作场景
DLI允许用户提交编译为Jar包的Spark作业，Jar包中包含了Jar作业执行所需的代码和依赖信息，用于在数据查询、数据分析、机器学习等特定的数据处理任务中使用。在提交Spark Jar作业前，将程序包上传至OBS，并将程序包与数据和作业参数一起提交以运行作业。
本例介绍通过DLI控制台提交Jar作业程序包的基本流程。由于不同的业务需求，Jar包的具体编写会有所差异。建议您参考DLI提供的示例代码，并根据实际业务场景进行相应的编辑和定制。获取[DLI样例代码](https://uquery-sdk.obs-website.cn-north-1.myhuaweicloud.com/dli-example-code_1.0.0.zip)。
#### 操作流程
使用DLI提交Spark Jar作业的操作流程如[表1]所示。
开始进行如下操作前，请务必参考[准备工作]完成必要操作。
 表1使用DLI提交Spark Jar作业的操作流程 
| 操作步骤                                                                                   | 说明                                        |
|:---|:---|
| [步骤1：上传数据至OBS]             | 准备Spark Jar作业程序包并上传至OBS。                  |
| [步骤2：创建弹性资源池并添加队列]          | 创建提交Spark Jar作业所需的计算资源。                   |
| [步骤3：使用DEW管理访问凭证]            | 跨源分析场景中，使用DEW管理数据源的访问凭证，并创建允许DLI访问DEW的委托。 |
| [步骤4：创建自定义委托允许DLI访问DEW读取凭证] | 创建允许DLI访问DEW的委托。                          |
| [步骤5：提交Spark作业]            | 创建Spark Jar作业分析数据。                        |
   
 #### 准备工作
- **已注册华为账号并开通华为云，且在使用DLI前检查账号状态，账号不能处于欠费或冻结状态。**
- **配置DLI委托访问授权。**
  DLI使用过程中涉及到OBS、VPC、SMN等服务交互，首次使用DLI需要用户配置委托授权，允许访问这些依赖服务。
  1. 使用华为云账号登录DLI管理控制台，在左侧导航栏单击"全局配置 \> 服务授权"。
  
  2. 在委托设置页面，勾选基础使用、跨源场景、运维场景的委托权限后，单击"更新委托权限"。
  
  3. 查看并了解更新委托的提示信息，单击"确定"。完成DLI委托权限的更新。
     图1配置DLI委托访问授权   
     ![](https://support.huaweicloud.com/qs-dli/zh-cn_image_0000001964093394.png "点击放大") 
  
  4. 完成配置后，在IAM控制台的委托列表中，可查看到dli_management_agency的委托信息。
    
- **配置DLI作业桶** **。**
  请务必在使用DLI提交作业前配置DLI作业桶，该桶用于存储DLI作业运行过程中产生的临时数据，例如：作业日志、作业结果。
  参考[配置DLI作业桶](https://support.huaweicloud.com/usermanual-dli/dli_01_0536.html)在DLI管理控制台的"全局配置 \> 工程配置"页面配置DLI作业桶。
  
 
 #### 步骤1：上传数据至OBS
参考[Spark作业样例代码](https://uquery-sdk.obs-website.cn-north-1.myhuaweicloud.com/dli-example-code_1.0.0.zip)开发Spark Jar作业程序，编译并打包为"spark-examples.jar"。参考以下操作步骤上传该作业程序。
提交Spark作业之前，需要在OBS中上传数据文件。
1. 登录管理控制台
2. 在服务列表中，单击"存储"中的"对象存储服务OBS"，进入OBS管理控制台页面。
3. 创建桶，这里以桶名"dli-test-obs01"为例。
   1. 单击"创建桶"。
   
   2. 进入"创建桶"页面，选择"区域"，输入"桶名称"。其他参数保持默认值或根据需要选择。
      ![](https://support.huaweicloud.com/qs-dli/public_sys-resources/note_3.0-zh-cn.png)
      创建OBS桶时，需要选择与DLI管理控制台相同的区域，不可跨区域执行操作。
      
   
   3. 单击"立即创建"。
    
4. 单击所建桶"dli-test-obs01"，进入"对象"页面。
5. 选择左侧列表中的"对象"，选择"上传对象"，将需要上传的文件，例如"spark-examples.jar"上传到指定目录，单击"确定"。 本例文件上传成功后，文件路径为"obs://dli-test-obs01/spark-examples.jar"。
   关于OBS管理控制台更多操作请参考《[对象存储服务用户指南](https://support.huaweicloud.com/usermanual-obs/obs_41_0003.html)》。
   
 
 #### 步骤2：创建弹性资源池并添加队列
本例创建弹性资源池"dli_resource_pool"、队列"dli_queue_01"。
1. 登录DLI管理控制台。
2. 在左侧导航栏单击"资源管理 \> 弹性资源池"，可进入弹性资源池管理页面。
3. 在弹性资源池管理界面，单击界面右上角的"购买弹性资源池"。
4. 在"购买弹性资源池"界面，填写具体的弹性资源池参数。
   本例在华东-上海二区域购买按需计费的弹性资源池。相关参数说明如[表2]所示。
    表2参数说明 
   | 参数名称 | 参数说明                                                             | 配置样例              |
   |:---|:---|:---|
   | 计费模式 | 选择弹性资源池计费模式。                                                     | 按需计费              |
   | 区域   | 选择弹性资源池所在区域。                                                     | 华东-上海二            |
   | 项目   | 每个区域默认对应一个项目，由系统预置。                                              | 系统默认项目            |
   | 名称   | 弹性资源池名称。                                                         | dli_resource_pool |
   | 规格   | 选择弹性资源池规格。                                                       | 标准版               |
   | CU范围 | 弹性资源池最大最小CU范围。                                                   | 64-64             |
   | 网段   | 规划弹性资源池所属的网段。如需使用DLI增强型跨源，弹性资源池网段与数据源网段不能重合。**弹性资源池网段设置后不支持更改**。 | 172.16.0.0/19     |
   | 企业项目 | 选择对应的企业项目。                                                       | default           |
      
   
5. 参数填写完成后，单击"立即购买"，在界面上确认当前配置是否正确。
6. 单击"提交"完成弹性资源池的创建。
7. 在弹性资源池的列表页，选择要操作的弹性资源池，单击操作列的"添加队列"。
8. 配置队列的基础配置，具体参数信息如下。
   表3弹性资源池添加队列基础配置 
   | 参数名称 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 配置样例         |
   |:---|:---|:---|
   | 名称   | 弹性资源池添加的队列名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | dli_queue_01 |
   | 类型   | 选择创建的队列类型。 - 执行SQL作业请选择SQL队列。  - 执行Flink或Spark作业请选择通用队列。   | 通用队列         |
   | 企业项目 | 选择对应的企业项目。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | default      |
      
   
9. 单击"下一步"，配置队列的扩缩容策略。 单击"新增"，可以添加不同优先级、时间段、"最小CU"和"最大CU"扩缩容策略。
   本例配置的扩缩容策略如[图2]所示。
   图2添加队列时配置扩缩容策略   
   ![](https://support.huaweicloud.com/qs-dli/zh-cn_image_0000002370218529.png "点击放大")
   表4扩缩容策略参数说明 
   | 参数名称 | 参数说明                                                                                                                     | 配置样例  |
   |:---|:---|:---|
   | 优先级  | 当前弹性资源池中的优先级数字越大表示优先级越高。本例设置一条扩缩容策略，默认优先级为1。                                                                             | 1     |
   | 时间段  | 首条扩缩容策略是默认策略，不能删除和修改时间段配置。 即设置00-24点的扩缩容策略。 | 00-24 |
   | 最小CU | 设置扩缩容策略支持的最小CU数。                                                                                                         | 16    |
   | 最大CU | 当前扩缩容策略支持的最大CU数。                                                                                                         | 64    |
      
   
10. 单击"确定"完成添加队列配置。
 
 #### 步骤3：使用DEW管理访问凭证
Spark Jar作业的输出数据写入到OBS时，需要配置AKSK访问OBS，为了确保AKSK数据安全，您可以通过密码安全中心（Data Encryption Workshop，DEW）、云凭据管理服务（Cloud Secret Management Service，CSMS），对AKSK统一管理，有效避免程序硬编码或明文配置等问题导致的敏感信息泄露以及权限失控带来的业务风险。
本节操作介绍在DEW创建通用凭证。详细操作请参考[创建通用凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
1. 登录DEW管理控制台
2. 选择"凭据管理"，进入"凭据管理"页面。
3. 单击"创建凭据"。配置凭据基本信息。 分别配置AK和SK对应的凭据键值
   - 本例中第一行key对应的value为用户的AK（Access Key Id）
   
   - 本例中第二行key对应的value为用户的SK（Secret Access Key）
     图3在DEW中配置访问凭据   
     ![](https://support.huaweicloud.com/qs-dli/zh-cn_image_0000001992915673.png) 
    
4. 后续在DLI Spark jar作业编辑界面设置访问凭据的参数示例。
   ```
   spark.hadoop.fs.obs.bucket.USER_BUCKET_NAME.dew.access.key= USER_AK_CSMS_KEY_obstest1 
   spark.hadoop.fs.obs.bucket.USER_BUCKET_NAME.dew.secret.key= USER_SK_CSMS_KEY_obstest1
   spark.hadoop.fs.obs.security.provider=com.dli.provider.UserObsBasicCredentialProvider
   spark.hadoop.fs.dew.csms.secretName=obsAkSk
   spark.hadoop.fs.dew.endpoint=kmsendpoint
   spark.hadoop.fs.dew.csms.version=v3
   spark.dli.job.agency.name=agencyname
   ```
   更多Spark Jar 使用DEW获取访问凭证读写OBS示例请参考[Spark Jar 使用DEW获取访问凭证读写OBS](https://support.huaweicloud.com/devg-dli/dli_09_0215.html)
   
 
 #### 步骤4：创建自定义委托允许DLI访问DEW读取凭证
1. 登录管理控制台。
2. 单击右上方登录的用户名，在下拉列表中选择"统一身份认证"。
3. 在左侧导航栏中，单击"委托"。
4. 在"委托"页面，单击"创建委托"。
5. 在"创建委托"页面，设置如下参数：
   - 委托名称：按需填写，例如"dli_dew_agency_access"。
   
   - 委托类型：选择"云服务"。
   
   - 云服务：（"委托类型"选择"云服务"时出现此参数项。）在下拉列表中选择"DLI"。
   
   - 持续时间：选择"永久"。
   
   - 描述：非必选，可以填写"拥有OBS OperateAccess权限的委托"。
    
6. 配置完委托的基本信息后，单击"下一步"。
7. 授予当前委托所需的权限策略，单击"新建策略"。
8. 配置策略信息。
   1. 输入策略名称，本例：dli-dew-agency。
   
   2. 选择"JSON视图"。
   
   3. 在策略内容中粘贴自定义策略。
      ```
      {
          "Version": "1.1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "csms:secretVersion:get",
                      "csms:secretVersion:list",
                      "kms:dek:decrypt"
                  ]
              }
          ]
      }
      ```
      
   
   4. 按需输入策略描述。
    
9. 新建策略完成后，单击"下一步"，返回委托授权页面。
10. 选择步骤[8]新建的自定义策略。
11. 单击"下一步"，选择委托的授权范围。本例选择"所有资源"。 了解更多授权操作说明请参考[创建用户组并授权](https://support.huaweicloud.com/usermanual-iam/iam_03_0001.html)。
    
12. 单击"确定"，完成授权。 授权后需等待15-30分钟才可生效。
    
 
 #### 步骤5：提交Spark作业
1. 在DLI管理控制台，单击左侧导航栏中的"作业管理 \> Spark作业"，单击"创建作业"，进入创建Spark作业页面。
2. 在Spark作业编辑页面配置作业参数信息：
   - 队列：选择[步骤2：创建弹性资源池并添加队列]中创建的队列。
   
   - Spark版本：选择Spark引擎版本。本例选择3.3.1版本。
   
   - 应用程序：选择[步骤1：上传数据至OBS]创建的程序包。
   
   - 委托：请选择[步骤4：创建自定义委托允许DLI访问DEW读取凭证]创建的委托，用于访问DEW中存储的凭证。
   
   
   其他参数请参考[创建Spark作业](https://support.huaweicloud.com/usermanual-dli/dli_01_0384.html)中关于Spark作业编辑页面的说明。
   
3. 单击Spark作业编辑页面右上方"执行"，阅读并同意隐私协议，单击"确定"。提交作业，页面显示"作业提交成功"。 ![](https://support.huaweicloud.com/qs-dli/zh-cn_image_0000001992755885.png "点击放大")
   
4. （可选）可到"作业管理"\>"Spark作业"页面查看提交作业的状态及日志。
   ![](https://support.huaweicloud.com/qs-dli/public_sys-resources/note_3.0-zh-cn.png)
   在DLI管理控制台第一次单击"执行"操作时，需要阅读隐私协议，同意确定后，后续操作将不会再提示。
   
 
#### 后续指引
完成Spark Jar作业快速入门操作后，如果您想了解更多关于Spark Jar作业相关操作，建议您参考以下指引阅读。
| 分类                                                                  | 文档                                                                                 | 说明                                                      |
|:---|:---|:---|
| 界面操作                                                                | [Spark Jar作业管理](https://support.huaweicloud.com/usermanual-dli/dli_01_0384.html)   | 提供Spark Jar作业管理界面功能介绍。                                  |
| 界面操作                                                                | [Spark程序包管理](https://support.huaweicloud.com/usermanual-dli/dli_01_0407.html)      | 针对不同角色用户，您可以通过权限设置分配不同的程序包组或程序包，不同用户之间的作业效率互不影响，保障作业性能。 |
|  开发指南  | [Spark SQL语法参考](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0219.html) | 提供Spark SQL相关的数据库、表、分区、导入及导出数据、自定义函数、内置函数等语法说明和样例指导。    |
|  开发指南  | [Spark Jar 相关API](https://support.huaweicloud.com/api-dli/dli_02_0124.html)        | 提供Spark Jar相关API的使用说明。                                  |
|  开发指南  | [Spark 作业SDK参考](https://support.huaweicloud.com/sdkreference-dli/dli_04_0054.html) | 提供执行Spark批处理作业的接口样例说明。                                  |
   
