
# SparkSQL用户权限介绍
#### SparkSQL权限
类似于Hive，SparkSQL也是建立在Hadoop上的数据仓库框架，提供类似SQL的结构化数据。
MRS提供用户、用户组和角色，集群中的各类权限需要先授予角色，然后将用户或者用户组与角色绑定。用户只有绑定角色或者加入绑定角色的用户组，才能获得权限。
- 如果当前组件使用了Ranger进行权限控制，须基于Ranger配置相关策略进行权限管理，具体操作可参考[添加Spark的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1860.html)。
- Spark开启或关闭Ranger鉴权后，需要重启Spark服务，并重新下载客户端，或刷新客户端配置文件spark/conf/spark-defaults.conf： 开启Ranger鉴权：修改"spark.ranger.plugin.authorization.enable"参数值为"true"。
  关闭Ranger鉴权：修改"spark.ranger.plugin.authorization.enable"参数值"false"。
  
 
#### 权限管理介绍
SparkSQL的权限管理是指SparkSQL中管理用户操作数据库的权限系统，以保证不同用户之间操作数据库的独立性和安全性。如果一个用户想操作另一个用户的表、数据库等，需要获取相应的权限才能进行操作，否则会被拒绝。
SparkSQL权限管理部分集成了Hive权限管理的功能。使用SparkSQL权限管理功能需要使用Hive的MetaStore服务和页面上的赋权功能。
[图1]展示了SparkSQL权限管理的基本架构。主要包含了两部分：页面赋权和服务获权并判断。
- 页面赋权：SparkSQL仅支持页面赋权的方式。在FusionInsight Manager的"系统 \> 权限"中，可以进行用户、用户组和角色的添加/删除操作，可以对某个角色进行赋权/撤权。
- 服务获权并判断：当接收到客户端的DDL、DML的SQL命令时，SparkSQL服务会向MetaStore服务获取客户端用户对数据库信息的已有权限，并检查是否包含了所需的所有权限，如果是则继续执行，否则拒绝该用户的操作。当通过了MetaStore的权限检查后，还需进行HDFS的ACLs权限检查。
图1SparkSQL权限管理架构图   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724867785.png "点击放大")
SparkSQL还提供了列权限和视图权限，以满足用户不同场景的需求。
- 列权限介绍 SparkSQL权限控制由元数据权限控制和HDFS ACL权限控制两部分组成。Hive MetaStore会将表权限自动同步到HDFS ACL中时，不会同步列级别的权限。也就是说，当用户对表具有部分列权限或全部列权限时，不能通过HDFS Client访问HDFS文件。
  - 在spark-sql模式下，用户仅具有列级别权限（即列权限用户）将不能访问HDFS文件，因此无法访问相应表的列。
  
  - Beeline/JDBCServer模式下，用户间赋权，例如将A用户创建的表赋权给B用户时。
    - "hive.server2.enable.doAs"=true（在Spark服务端的自定义配置文件"hive-site.xml"中添加该参数）。 此时用户B不可查询。需在HDFS上手动为文件赋读权限。
      
    
    - "hive.server2.enable.doAs"=false
      - 用户A和B均通过Beeline连接，用户B可查询。
      
      - A用户通过SQL方式建表，B用户可在Beeline进行查询。
      
      
      而其他情况，如A用户使用Beeline建表，B用户通过SQL查询，或者A用户通过SQL方式建表，B用户使用SQL方式查询的情况均不支持。需在HDFS上手动为文件赋读权限。
      
     
  
  
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  由于"spark"用户在HDFS ACL的权限控制上为Spark管理员用户权限，Beeline客户端用户的权限控制仅取决于Spark侧的元数据权限。
  
- 视图权限介绍 视图权限是指仅对表的视图具有查询、修改等操作的权限，不再依赖于视图所在的表的相应权限。即用户拥有视图的查询权限时，不管是否有表权限都可以进行查询。视图的权限是针对整个表而言的，不支持对其中的部分列创建视图权限。
  视图权限在SparkSQL权限上的限制与列权限相似，详细如下：
  - 在spark-sql模式下，只有视图权限而没有表权限，且没有HDFS的读取权限时，用户不能访问HDFS上存储的表的数据，即该情况下不支持对该表的视图进行查询。
  
  - Beeline/JDBCServer模式下，用户间赋权，例如将A用户创建的视图赋权给B用户时。
    - "hive.server2.enable.doAs"=true（在Spark服务端的"hive-site.xml"文件中配置） 此时用户B不可查询。需在HDFS上手动为文件赋读权限。
      
    
    - "hive.server2.enable.doAs"=false
      - 用户A和B均通过Beeline连接，用户B可查询。
      
      - A用户通过SQL方式创建视图，B用户可在Beeline进行查询。
      
      
      而其他情况，如A用户使用Beeline创建视图，B用户通过SQL查询，或者A用户通过SQL方式创建视图，B用户使用SQL方式查询的情况均不支持。需在HDFS上手动为文件赋读权限。
      
     
  
  
  对表的视图进行相应操作，分别需要具有以下权限。
  - 创建视图时，需要数据库的CREATE权限、表的SELECT、SELECT_of_GRANT权限。
  
  - 查询、描述视图时，只需要视图的SELECT权限，不需要视图所依赖的表或依赖的视图的SELECT权限。如果同时查询视图和其他表，则仍然需要其他表的SELECT权限，例如：select \* from v1 join t1时，需要有视图v1和表t1的SELECT权限，即使v1是基于t1的视图，也需要表t1的SELECT权限。 在Beeline/JDBCServer模式下，查询视图只需表的SELECT权限；而在spark-sql模式下，查询视图需要视图的SELECT权限和表的SELECT权限。
    
  
  - 删除、修改视图时，必须要有视图的owner权限。
   
 
#### SparkSQL权限模型
用户使用SparkSQL服务进行SQL操作，必须对SparkSQL数据库和表（含外表和视图）拥有相应的权限。完整的SparkSQL权限模型由元数据权限与HDFS文件权限组成。使用数据库或表时所需要的各种权限都是SparkSQL权限模型中的一种。
- 元数据权限 元数据权限即在元数据层上进行权限控制，与传统关系型数据库类似，SparkSQL数据库包含"创建"和"查询"权限，表和列包含"查询"、"插入"、"UPDATE"和"删除"权限。SparkSQL中还包含拥有者权限"OWNERSHIP"和Spark管理员权限"管理"。
  
- 数据文件权限，即HDFS文件权限 SparkSQL的数据库、表对应的文件保存在HDFS中。默认创建的数据库或表保存在HDFS目录"/user/hive/warehouse"。系统自动以数据库名称和数据库中表的名称创建子目录。访问数据库或者表，需要在HDFS中拥有对应文件的权限，包含"读"、"写"和"执行"权限。
  
用户对SparkSQL数据库或表执行不同操作时，需要关联不同的元数据权限与HDFS文件权限。例如，对SparkSQL数据表执行查询操作，需要关联元数据权限"查询"，以及HDFS文件权限"读"和"执行"。
使用Manager界面图形化的角色管理功能来管理SparkSQL数据库和表的权限，只需要设置元数据权限，系统会自动关联HDFS文件权限，减少界面操作，提高效率。
#### SparkSQL使用场景及对应权限
用户通过SparkSQL服务创建数据库需要加入Hive组，不需要角色授权。用户在Hive和HDFS中对自己创建的数据库或表拥有完整权限，可直接创建表、查询数据、删除数据、插入数据、更新数据以及授权他人访问表与对应HDFS目录与文件。
如果用户访问别人创建的表或数据库，需要授予权限。所以根据SparkSQL使用场景的不同，用户需要的权限可能也不相同。
表1SparkSQL使用场景 
| **主要场景**          | **用户需要的权限**                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|
| 使用SparkSQL表、列或数据库 | 使用其他用户创建的表、列或数据库，不同的场景需要不同的权限，例如： - 创建表，需要"创建"。  - 查询数据，需要"查询"。  - 插入数据，需要"插入"。   |
| 关联使用其他组件          | 部分场景除了SparkSQL权限，还可能需要组件的权限，例如： 使用Spark on HBase，在SparkSQL中查询HBase表数据，需要设置HBase权限。                                                                                                                                                                                                                                                                                                                                                       |
   
在一些特殊SparkSQL使用场景下，需要单独设置其他权限。
表2SparkSQL授权注意事项 
| **场景**                                                                               | **用户需要的权限**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|
| 创建SparkSQL数据库、表、外表，或者为已经创建的表或外表添加分区，且Hive用户指定数据文件保存在"/user/hive/warehouse"以外的HDFS目录。 | - 需要此目录已经存在，客户端用户是目录的属主，且用户对目录拥有"读"、"写"和"执行"权限。同时用户对此目录上层的每一级目录都拥有"读"和"执行"权限。  - 在Spark中，在创建HBase的外表时，需要拥有Hive端database的"创建"权限。而在Spark 1.5中，在创建HBase的外表时，需要拥有Hive端database的"创建"权限，也需要拥有HBase端Namespace的"创建"权限。                                                                                                         |
| 用户使用load将指定目录下所有文件或者指定文件，导入数据到表中。                                                    | - 数据源为Linux本地磁盘，指定目录时需要此目录已经存在，系统用户"omm"对此目录以及此目录上层的每一级目录拥有"r"和"x"的权限。指定文件时需要此文件已经存在，"omm"对此文件拥有"r"的权限，同时对此文件上层的每一级目录拥有"r"和"x"的权限。  - 数据源为HDFS，指定目录时需要此目录已经存在，SparkSQL用户是目录属主，且用户对此目录及其子目录拥有"读"、"写"和"执行"权限，并且其上层的每一级目录拥有"读"和"执行"权限。指定文件时需要此文件已经存在，SparkSQL用户是文件属主，且用户对文件拥有"读"、"写"和"执行"权限，同时对此文件上层的每一级目录拥有"读"和"执行"权限。   |
| 创建函数、删除函数或者修改任意数据库。                                                                  | 需要授予"管理"权限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| 操作Hive中所有的数据库和表。                                                                     | 需加入到supergroup用户组，并且授予"管理"权限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| 对部分datasource表赋予insert权限后，执行insert\|analyze操作前需要单独对hdfs上的表目录赋予写权限。                   | 当前对spark datasource表赋予Insert权限时，如果表格式为：text\|csv\|json\|parquet\|orc，则不会修改表目录的权限。因此，对以上几种类型的datasource表赋予Insert权限后，还需要单独对hdfs上的表目录赋予写权限，用户才能成功对表执行insert\|analyze操作。                                                                                                                                                                                                                                                                                                                                                                                                        |
   
