
# 使用Livy提交Spark Jar作业
#### DLI Livy简介
DLI Livy是基于开源的Apache Livy用于提交Spark作业到DLI的客户端工具。
#### 准备工作
- 创建弹性资源池并添加队列。添加队列时选择"通用队列"，即用于执行Spark作业的计算资源。具体请参考[创建队列](https://support.huaweicloud.com/usermanual-dli/dli_01_0505.html)。
- 准备一个linux弹性云服务器ECS，用于安装DLI Livy。
  - ECS需要放通30000至32767端口、8998端口。具体操作请参考[添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
  
  - ECS需安装Java JDK，JDK版本建议为1.8。配置Java环境变量JAVA_HOME。
  
  - 查询弹性云服务器ECS详细信息，获取ECS的"私有IP地址"。
   
- 使用增强型跨源连接打通DLI队列和Livy实例所在的VPC网络。具体操作可以参考[增强型跨源连接](https://support.huaweicloud.com/usermanual-dli/dli_01_0003.html)。
 
#### 约束与限制
若需指定作业运行Spark 3.3.1引擎，需在spark-defaults.conf文件追加两行配置，否则作业运行异常。
```
# 指定DLI Spark引擎版本为Spark 3.3.1 
spark.dli.user.sparkVersion=3.3.1 
# 指定IAM自定义委托名称，Spark 3.3.1版本必填，替换agencyname为IAM提前创建好的DLI自定义委托名称；Spark3.3.1无该委托配置会调度失败。 
spark.dli.job.agency.name=agencyname
```
如果配置委托请提前在IAM控制台创建委托，并授予DLI运行所需的权限。了解[创建DLI自定义委托](https://support.huaweicloud.com/usermanual-dli/dli_01_0616.html)。
#### 步骤1：下载并安装DLI Livy工具
![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
本次操作下载的DLI Livy版本为**apache-livy-0.7.2.0107-bin.tar.gz**，后续版本变化请根据实际情况修改。
1. 单击[下载链接](https://uquery-sdk.obs.cn-north-1.myhuaweicloud.com/dli-livy/apache-livy-0.7.2.0107-bin.tar.gz)，获取DLI Livy工具压缩包。
2. 使用WinSCP工具，将获取的工具压缩包上传到准备好的ECS服务器目录下。
3. 使用root用户登录ECS服务器，执行以下命令安装DLI Livy工具。 
   1. 执行以下命令创建工具安装路径。
      **mkdir** *livy安装路径*
      例如新建路径/opt/livy：**mkdir /opt/livy** 。后续操作步骤均默认以**/opt/livy**安装路径演示，请根据实际情况修改。
      
   
   2. 解压工具压缩包到安装路径。 **tar --extract --file apache-livy-0.7.2.0107-bin.tar.gz --directory /opt/livy --strip-components 1 --no-same-owner**
      
   
   3. 执行以下命令修改配置文件名称。 **cd** **/opt/livy/** **conf**
      **mv livy-client.conf.template livy-client.conf**
      **mv livy.conf.template livy.conf**
      **mv livy-env.sh.template livy-env.sh**
      **mv log4j.properties.template log4j.properties**
      **mv spark-blacklist.conf.template spark-blacklist.conf**
      **touch spark-defaults.conf**
      
   
   
   
   
 
#### 步骤2：修改DLI Livy工具配置文件
1. 上传指定的DLI Livy工具jar资源包到OBS桶路径下。 
   1. 登录OBS控制台，在指定的OBS桶下创建一个存放Livy工具jar包的资源目录。例如："obs://bucket/livy/jars/"。
   
   2. 进入[3.a]中DLI Livy工具所在ECS服务器的安装目录，获取以下jar包，将获取的jar包上传到[1.a]创建的OBS桶资源目录下。
      例如，当前Livy工具安装路径为"/opt/livy"，则当前需要上传的jar包名称如下：
      ```
      /opt/livy/rsc-jars/livy-api-0.7.2.0107.jar
      /opt/livy/rsc-jars/livy-rsc-0.7.2.0107.jar
      /opt/livy/repl_2.11-jars/livy-core_2.11-0.7.2.0107.jar
      /opt/livy/repl_2.11-jars/livy-repl_2.11-0.7.2.0107.jar
      ```
      
   
   
   
   
2. 修改DLI Livy工具配置文件。 
   1. 编辑修改配置文件" /opt/livy/conf/livy-client.conf"。 **vi /opt/livy/conf/livy-client.conf**
      添加如下内容，并根据注释修改配置项。
      ```
      #当前ECS的私有IP地址，也可以使用ifconfig命令查询。
      livy.rsc.launcher.address = X.X.X.X
      #当前ECS服务器放通的端口号
      livy.rsc.launcher.port.range = 30000~32767
      ```
      
   
   2. 编辑修改配置文件" /opt/livy/conf/livy.conf"。 **vi /opt/livy/conf/livy.conf**
      添加如下内容。根据注释说明修改具体的配置项。
      ```
      livy.server.port = 8998
      livy.spark.master = yarn
       
      livy.server.contextLauncher.custom.class=org.apache.livy.rsc.DliContextLauncher
      livy.server.batch.custom.class=org.apache.livy.server.batch.DliBatchSession
      livy.server.interactive.custom.class=org.apache.livy.server.interactive.DliInteractiveSession
      livy.server.sparkApp.custom.class=org.apache.livy.utils.SparkDliApp
       
      livy.server.recovery.mode = recovery
      livy.server.recovery.state-store = filesystem
      #以下文件路径请根据情况修改
      livy.server.recovery.state-store.url = file:///opt/livy/store/
       
      livy.server.session.timeout-check = true
      livy.server.session.timeout = 1800s
      livy.server.session.state-retain.sec = 1800s
       
      livy.dli.spark.version = 2.3.2
      livy.dli.spark.scala-version = 2.11
       
      # 填入存储livy jar包资源的OBS桶路径。
      livy.repl.jars = obs://bucket/livy/jars/livy-core_2.11-0.7.2.0107.jar, obs://bucket/livy/jars/livy-repl_2.11-0.7.2.0107.jar
      livy.rsc.jars = obs://bucket/livy/jars/livy-api-0.7.2.0107.jar, obs://bucket/livy/jars/livy-rsc-0.7.2.0107.jar
      ```
      
   
   3. 编辑修改配置文件"/opt/livy/conf/spark-defaults.conf"。 **vi /opt/livy/conf/spark-defaults.conf**
      添加如下必选参数内容。配置项参数填写说明，详见[表1]。
      ```
      # 以下参数均支持在提交作业时覆盖。
      spark.yarn.isPython=true
      spark.pyspark.python=python3
       
      # 当前参数值为生产环境web地址
      spark.dli.user.uiBaseAddress=https://console.huaweicloud.com/dli/web
      # 队列所在的region。
      spark.dli.user.regionName=XXXX
       
      # dli endpoint 地址。
      spark.dli.user.dliEndPoint=XXXX
       
      # 用于指定队列，填写已创建DLI的队列名。
      spark.dli.user.queueName=XXXX
      # 提交作业使用的projectId。
      spark.dli.user.projectId=XXXX
      ```
       表1spark-defaults.conf必选参数说明 
      | 参数名                        | 参数填写说明                                                                                                                                                                                                                                             |
      |:---|:---|
      | spark.dli.user.regionName  | DLI队列所在的区域名。 从[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint?dli)获取，对应"区域"列就是regionName。                                                                              |
      | spark.dli.user.dliEndPoint | DLI队列所在的终端节点。 从[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint?dli)获取，对应的"终端节点（Endpoint）"就是该参数取值。                                                                      |
      | spark.dli.user.queueName   | DLI队列名称。                                                                                                                                                                                                                                           |
      | spark.dli.user.access.key  | 对应用户的访问密钥。该用户需要有Spark作业相关权限，权限说明详见[权限管理](https://support.huaweicloud.com/usermanual-dli/dli_01_0440.html)。 密钥获取方式请参考[获取AK/SK](https://support.huaweicloud.com/dli_faq/dli_03_0033.html)。 |
      | spark.dli.user.secret.key  | 对应用户的访问密钥。该用户需要有Spark作业相关权限，权限说明详见[权限管理](https://support.huaweicloud.com/usermanual-dli/dli_01_0440.html)。 密钥获取方式请参考[获取AK/SK](https://support.huaweicloud.com/dli_faq/dli_03_0033.html)。 |
      | spark.dli.user.projectId   | 参考[获取项目ID](https://support.huaweicloud.com/api-dli/dli_02_0183.html)获取项目ID。                                                                                                                                                                        |
         
      以下参数为可选参数，请根据参数说明和实际情况配置。详细参数说明请参考[Spark Configuration](https://spark.apache.org/docs/latest/configuration.html)。
      表2spark-defaults.conf可选参数说明 
      | Spark作业参数                    | 对应Spark批处理参数    | 备注                             |
      |:---|:---|:---|
      | spark.dli.user.file          | file            | 如果是对接notebook工具场景时不需要设置。       |
      | spark.dli.user.className     | class_name      | 如果是对接notebook工具场景时不需要设置。       |
      | spark.dli.user.scType        | sc_type         | 推荐使用livy原生配置。                  |
      | spark.dli.user.args          | args            | 推荐使用livy原生配置。                  |
      | spark.submit.pyFiles         | python_files    | 推荐使用livy原生配置。                  |
      | spark.files                  | files           | 推荐使用livy原生配置。                  |
      | spark.dli.user.modules       | modules         | -                              |
      | spark.dli.user.image         | image           | 提交作业使用的自定义镜像，仅容器集群支持该参数，默认不设置。 |
      | spark.dli.user.autoRecovery  | auto_recovery   | -                              |
      | spark.dli.user.maxRetryTimes | max_retry_times | -                              |
      | spark.dli.user.catalogName   | catalog_name    | 访问元数据时，需要将该参数配置为dli。           |
         
      
   
   
   
   
 
#### 步骤3：启动DLI Livy工具
1. 进入到工具安装目录。 
   例如：**cd /opt/livy**
   
   
2. 执行以下命令启动DLI Livy。 
   **./bin/livy-server start**
   
   
 
#### 步骤4：通过DLI Livy工具提交Spark作业到DLI
本示例演示通过curl命令使用DLI Livy工具将Spark作业提交到DLI。
1. 将开发好的Spark作业程序jar包上传到OBS路径下。 
   例如，本示例上传"spark-examples_2.11-XXXX.jar"到"obs://bucket/path"路径下。
   ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
   Spark Jar作业的输出数据写入到OBS时，需要配置AKSK访问OBS，为了确保AKSK数据安全，您可以通过密码安全中心（Data Encryption Workshop，DEW）、云凭据管理服务（Cloud Secret Management Service，CSMS），对AKSK统一管理，有效避免程序硬编码或明文配置等问题导致的敏感信息泄露以及权限失控带来的业务风险。
   具体操作请参考[获取Spark作业委托临时凭证用于访问其他云服务](https://support.huaweicloud.com/devg-dli/dli_09_0216.html)。
   
   
2. 以root用户登录到安装DLI Livy工具的ECS服务器。
3. 执行curl命令通过DLI Livy工具提交Spark作业请求到DLI。 
   ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
   **ECS_IP**为当前安装DLI Livy工具所在的弹性云服务器的私有IP地址。
   ```
   curl --location --request POST 'http://ECS_IP:8998/batches' \
   --header 'Content-Type: application/json' \
   --data '{
       "driverMemory": "3G",
       "driverCores": 1,
       "executorMemory": "2G",
       "executorCores": 1,
       "numExecutors": 1,
       "args": [
           "1000"
       ],
       "file": "obs://bucket/path/spark-examples_2.11-XXXX.jar",
       "className": "org.apache.spark.examples.SparkPi",
       "conf": {
           "spark.dynamicAllocation.minExecutors": 1,
           "spark.executor.instances": 1,
           "spark.dynamicAllocation.initialExecutors": 1,
           "spark.dynamicAllocation.maxExecutors": 2
       }
   }'
   ```
   
   
 
