
# 配置Spark通过Guardian访问OBS
参考[配置Guardian服务不启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300579.html)或[配置Guardian服务启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300419.html)完成Guardian对接OBS后，即可在Spark客户端创建Location为OBS路径的表。
#### 前提条件
如果参考[配置Guardian服务启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300419.html)完成Guardian对接OBS，还需参考[Ranger权限配置]在Ranger中为组件操作用户赋予OBS路径的"Read"和"Write"权限。
#### Spark对接OBS
MRS集群支持Spark服务在创建表时指定Location为OBS文件系统路径，也支持基于Hive Metastore方式对接OBS。
- 建表时指定Location为OBS路径：
  1. 以客户端安装用户登录安装客户端的节点，并进入**spark-sql** 客户端：
     切换至客户端安装目录：
     ```
     cd 客户端安装目录
     ```
     加载环境变量：
     ```
     source bigdata_env
     ```
     认证用户，未开启Kerberos认证的集群请跳过此操作：
     ```
     kinit 组件操作用户
     ```
     登录**spark-sql**客户端：
     ```
     spark-sql --master yarn
     ```
     
  
  2. 在创建表时指定Location为OBS文件系统路径。 例如，创建一个表"test"，该表的Location为"obs://obs-test/test/数据库名/表名"：
     ```
     create external table testspark(name string) location "obs://obs-test/test/数据库名/表名";
     ```
     
   
- 配置Spark基于Hive MetaStore方式对接OBS：
  1. 已完成[配置Hive基于MetaStore方式对接OBS](https://support.huaweicloud.com/usermanual-mrs/mrs_01_248989.html#mrs_01_248989__zh-cn_topic_0000001656985526_section18127143141811)相关配置操作。
  
  2. 登录MRS集群Manager。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
     
  
  3. 选择"集群 \> 服务 \> Spark \> 配置 \> 全部配置 "。
  
  4. 在左侧的导航列表中选择"SparkResource \> 自定义"。在自定义配置项中，给参数"custom"添加配置项"spark.sql.warehouse.location.first"，设置值为"true"。
     图1spark.sql.warehouse.location.first配置   
     ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001879421052.png "点击放大") 
  
  5. 在左侧的导航列表中选择"JDBCServer \> 自定义"。在自定义配置项中，在参数"custom"添加配置项"spark.sql.warehouse.location.first"，设置值为"true"。
     图2spark.sql.warehouse.location.first配置   
     ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001925499889.png "点击放大") 
  
  6. 单击"保存"，保存配置，然后单击"概览"，选择"更多 \> 重启服务"，输入密码，单击"确定"后再次单击"确定"，重启Spark服务。
  
  7. Spark重启成功后，选择"更多 \> 下载客户端"，重新下载并安装Spark客户端，详细操作请参考[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)章节，并执行[8]。
     如果不重新下载并安装客户端，则直接执行以下步骤更新Spark客户端配置文件（例如：客户端目录为"/opt/client"，具体以实际为准）：
     1. 以**root** 用户登录Spark客户端所在的节点，切换到客户端安装目录。
        ```
        cd /opt/client
        ```
        
     
     2. 执行以下命令修改Spark客户端配置文件目录下的"hive-site.xml"。
        ```
        vi Spark/spark/conf/hive-site.xml
        ```
        将"hive.metastore.warehouse.dir"的值修改为对应的OBS路径，例如"obs://hivetest/user/hive/warehouse/"。
        ```
        <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>obs://hivetest/user/hive/warehouse/<value>
        </property>
        ```
        
     
     3. 执行以下命令修改Spark客户端配置文件目录下的"spark-defaults.conf"，添加"spark.sql.warehouse.location.first = true"配置。
        ```
        vi Spark/spark/conf/spark-defaults.conf
        ```
        
       
  
  8. 开启Kerberos认证的集群需参考[Ranger权限配置]完成组件操作用户的OBS目录权限配置。
  
  9. 进入SparkSQL CLI命令行和spark-beeline，创建表并查看表的Location是否为OBS路径。 加载环境变量：
     ```
     source bigdata_env
     ```
     认证用户，未开启Kerberos认证的集群请跳过此操作：
     ```
     kinit 业务用户
     ```
     - 进入SparkSQL CLI命令行：
       ```
       spark-sql
       ```
       创建表：
       ```
       create table d(a int);
       ```
       查看表Location信息：
       ```
       desc formatted d;
       ```
       如下图则表示表"d"的Location已经在指定的OBS路径下。
       图3查看表**d** 的Location   
       ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001879580892.png "点击放大") 
     
     - 进入spark-beeline：
       ```
       spark-beeline
       ```
       创建表：
       ```
       create table e(a int);
       ```
       查看表Location信息：
       ```
       desc formatted e;
       ```
       如下图则表示表"e"的Location已经在指定的OBS路径下。
       图4查看表**e** 的Location   
       ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001879580908.png "点击放大") 
      
   
 
 #### Ranger权限配置
1. 登录MRS集群Manager界面，选择"系统 \> 权限 \> 用户组 \> 添加用户组"。 
   登录集群Manager界面请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 创建一个空角色的用户组，例如，名称为"obs_spark"，并将该用户组绑定给对应用户。
3. 使用**rangeradmin**用户登录Ranger管理页面。
4. 在首页中单击"EXTERNAL AUTHORIZATION"区域的组件插件名称"OBS"。
5. 单击"Add New Policy"，为[步骤 2]新建的用户组添加相应OBS路径的"Read"和"Write"权限，OBS目录若不存在则需要提前创建，且不允许带通配符**\*** 。
   
   图5为Spark用户组赋予OBS路径的读和写权限   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001879580900.png "点击放大")
   
   
![](https://support.huaweicloud.com/usermanual-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 视图表授权需要授予视图表权限和视图表对应的物理表路径权限。
- 仅支持对数据库/表进行级联授权操作，不支持对分区做级联权限，如果分区路径不在表路径下，则需要用户手动授权分区路径。
- 不支持对Hive Ranger策略中的"Deny Conditions"进行级联授权，即"Deny Conditions"的权限仅限制表权限，不能生成HDFS/OBS存储源端的权限。
- 级联授权生成的HDFS/OBS存储源端的权限弱于HDFS Ranger策略的权限，即如果已经对表的HDFS存储源设置了HDFS Ranger权限，则级联权限将不会生效。
- 不支持对存储源为OBS的表级联授权后直接进行**alter** 操作，需要给对应用户组额外授予OBS表路径的父目录的"Read"和"Write"权限才能使用**alter**功能。
- 对接OBS后，如需通过Ranger配置组件关于OBS相关路径的权限策略，需确保OBS服务已开启AccessLabel功能，若未开启，需手动开启，详细操作请联系OBS服务运维人员。
 
#### CDL业务用户权限配置
集群已启用Kerberos认证（安全模式）若需在对接OBS成功后，使用CDL实现实时数据入湖选择存储到OBS时，则需参考以下操作为对应用户赋予相应OBS路径的"Read"和"Write"权限。
1. 登录MRS集群Manager界面，选择"系统 \> 权限 \> 用户组 \> 添加用户组"。 
   登录集群Manager界面请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 创建一个空角色的用户组，例如"obs_cdl"，并将该用户组绑定给对应CDL业务用户，例如"cdluser"。
3. 使用**rangeradmin**用户登录Ranger管理页面。
4. 在首页中单击"EXTERNAL AUTHORIZATION"区域的组件插件名称"OBS"。
5. 单击"Add New Policy"，为新建的用户组添加相应OBS路径的"Read"和"Write"权限，OBS目录若不存在则需要提前创建，且不允许带通配符**\*** 。
   
   例如，为用户组"obs_cdl"添加"obs://OBS并行文件系统名称/cdldata"的"Read"和"Write"权限：
   图6为CDL用户组赋予OBS路径的读和写权限   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001925620257.png "点击放大")
   
   
 
