
# 使用代理用户提交Spark作业
#### 场景说明
提交Spark任务时，用户可以使用当前实际运行用户提交任务，也可以使用代理用户提交任务。本章节介绍如何开启代理用户提交任务。
#### 约束与限制
本章节仅适用MRS 3.3.0-LTS及之后版本。
#### 前提条件
创建用户，登录Manager页面，选择"系统 \> 权限 \> 用户"，单击"添加用户"，创建用户test（实际运行用户）和test1（被代理用户）用户，用户组选择hadoop、hive和supergroup，主组选择hadoop。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
"实际运行用户"属于服务端使用的用户，"被代理用户"指的是对应的业务用户。如涉及权限管控时，"被代理用户"与正常的业务用户授权方式相同。
#### 在spark-beeline中使用代理用户提交Spark任务
1. 修改JDBCServer实例配置。 
   登录FusionInsight Manager页面，选择"集群 \> 服务 \> Spark \> 配置 \> 全部配置 \> JDBCServer（角色） \> 自定义"在参数"spark.core-site.customized.configs"中添加如下自定义参数：
   
   | 参数名称                           | 值  | 参数说明                                             |
   |:---|:---|:---|
   | hadoop.proxyuser.*test*.hosts  | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
   | hadoop.proxyuser.*test*.groups | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
      
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001734491341.png "点击放大")
   
   
2. 修改如下参数值，切换JDBCServer实例至多实例模式： 
   
   | 参数名称                             | 值                             | 参数说明                                  |
   |:---|:---|:---|
   | spark.scheduler.allocation.file  | #{conf_dir}/fairscheduler.xml | 表示公平调度文件路径，多租户和多实例共用同一个xml配置文件。       |
   | spark.thriftserver.proxy.enabled | false                         | 是否使用多租户模式。false为使用多实例模式，true为使用多租户模式。 |
      
   
   
3. 保存配置，重启Spark服务。
4. 登录Spark客户端节点，执行如下命令： 
   进入客户端目录：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   加载组件环境变量：
   ```
   source Spark/component_env
   ```
   安全模式执行安全认证，普通模式无需执行：
   ```
   kinit test
   ```
   输入密码完成认证（首次登录需要修改密码）
   
   
5. 使用Spark的beeline命令提交任务。 
   进入Spark的beeline目录：
   ```
   cd 客户端安装目录/Spark/spark/bin
   ```
   启用beeline命令：
   ```
   ./beeline
   ```
   使用代理用户提交任务：
   ```
   !connect jdbc:hive2://Zookeeper实例所在节点IP:Zookeeper Client的端口,Zookeeper实例所在节点IP:Zookeeper Client的端口,Zookeeper实例所在节点IP:Zookeeper Client的端口/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.hadoop.com@HADOOP.COM;hive.server2.proxy.user=test1
   ```
   其中：
   - Zookeeper实例所在节点IP：在FusionInsight Manager页面，选择"集群 \> 服务 \> Zookeeper \> 实例"，即可查看Zookeeper实例节点IP。
   
   - Zookeeper Client的端口：在FusionInsight Manager页面，选择"集群 \> 服务 \> Zookeeper \> 配置\> 全部配置"，搜索参数"clientPort"即可查看Zookeeper Client的端口。
   
   - hive.server2.proxy.user=test1 ：test1为代理用户。 ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001686452454.png "点击放大")
     
   
   
   
   
6. 创建Spark表。 
   ```
   create table sparktest1(a string,b int);
   ```
   查看新创建的表：
   ```
   desc formatted sparktest1;
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001686612182.png "点击放大")
   可以看到表的owner为代理用户test1，使用代理用户成功。
   
   
 
#### 在spark-sql和spark-submit中使用代理用户提交Spark任务
1. 修改HDFS实例配置，登录FusionInsight Manager页面，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置 \> HDFS（服务）\> 自定义"在参数"hdfs.core-site.customized.configs"中添加如下自定义参数，保存配置。 
   
   | 参数名称                           | 值  | 参数说明                                             |
   |:---|:---|:---|
   | hadoop.proxyuser.*test*.hosts  | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
   | hadoop.proxyuser.*test*.groups | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
      
   
   
2. 修改Yarn实例配置，登录FusionInsight Manager页面，选择"集群 \> 服务 \> Yarn \> 配置 \> 全部配置 \> Yarn（服务） \> 自定义"在参数"yarn.core-site.customized.configs"中添加如下自定义参数，保存配置。 
   
   | 参数名称                           | 值  | 参数说明                                             |
   |:---|:---|:---|
   | hadoop.proxyuser.*test*.hosts  | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
   | hadoop.proxyuser.*test*.groups | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
      
   
   
3. 修改SparkResource实例配置，登录FusionInsight Manager页面，选择"集群 \> 服务 \> Spark \> 配置 \> 全部配置 \> SparkResource（角色） \> 自定义"在参数"spark.core-site.customized.configs"中添加如下自定义参数，保存配置。 
   
   | 参数名称                           | 值  | 参数说明                                             |
   |:---|:---|:---|
   | hadoop.proxyuser.*test*.hosts  | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
   | hadoop.proxyuser.*test*.groups | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
      
   
   
4. 修改Hive实例配置，登录FusionInsight Manager页面，选择"集群 \> 服务 \> Hive \> 配置 \> 全部配置 \> Hive（服务） \> 自定义"在参数"core.site.customized.configs"中添加如下自定义参数，保存配置。 
   
   | 参数名称                           | 值  | 参数说明                                             |
   |:---|:---|:---|
   | hadoop.proxyuser.*test*.hosts  | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
   | hadoop.proxyuser.*test*.groups | \* | 参数中的test是指实际运行用户。表示test用户连接后，可以使用任意代理用户，不限制集群节点。 |
      
   
   
5. 重启HDFS、Yarn、Spark、Hive服务，并更新客户端HDFS、Yarn、Spark、Hive配置文件。
6. 登录Spark客户端节点，执行如下命令： 
   进入客户端目录：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   加载组件环境变量：
   ```
   source Spark/component_env
   ```
   安全模式执行安全认证，普通模式无需执行：
   ```
   kinit test
   ```
   输入密码完成认证（首次登录需要修改密码）
   
   
7. 提交spark-sql任务。 
   ```
   spark-sql --master yarn --proxy-user test1
   ```
   
   
8. 创建Spark表。 
   ```
   create table sparktest2(a string,b int);
   ```
   查看新创建的表：
   ```
   desc formatted sparktest2;
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001734611185.png "点击放大")
   可以看到表的owner为代理用户test1，使用代理用户成功。
   
   
9. 使用重新下发的客户端提交spark-submit任务。 
   ```
   spark-submit --master yarn --class org.apache.spark.examples.SparkPi --master yarn-client --proxy-user test1 客户端安装目录/Spark/spark/examples/jars/spark-examples_*.jar
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001734491349.png "点击放大")
   
   
10. 查看yarn中运行的application信息。 
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001686452462.png "点击放大")
    可以看到任务的运行用户为test1，使用代理用户成功。
    
    
 
