Python大数据与SQL优化笔 QQ群:771686295
一. Hive 配置里的几个概念
Authorization: 授权,也就是用户权限
Authentication:验证,也就是用户身份认证
Metastore Server, HiveServer2, 这是Hive里两个独立的组件
(1) Metastore通过Thrift API 对外提供访问,生态里的工具如:pig, MR, impala, presto, SparkSQL, NIFI 都可以通过Thrift接口访问Metastore, Metastore接口格式为:thrift://xxxxxxx:9083
(2) HiveServer2对外提供JDBC/ODBC接口,供前端工具(DBeavor, SQL Squirrel, SQL Developer, DBVis)使用, 编程语言如:Python, Scala, Java也可以通过JDBC连接访问HiveServer2, HiveServer2的JDBC接口格式为:jdbc:hive2://xxxxxx:10000
二. 权限控制
Hive支持的Authorization方式有
1. Storage Based Authorization in the Metastore Server
2. SQL Standards Based Authorization in HiveServer2
3. Authorization using Apache Ranger & Sentry
4. Old default Hive Authorization (Legacy Mode)
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization
可以看出,不同的Authorization方式是针对不同Hive组件提供的,所以是可以并存的。
Ambari显示的Authorization方式有
NONE (Storage Based)
SQLStd (SQL Standards Based)
Ranger (Ranger)
1. Storage Based
通过Hive Metastore 的thrift接口访问Hive的时候,会使用这个权限,这种方式可以和SQL Standards Based或者Ranger的方式并存。
Storage Based的权限控制,也就是基于HDFS权限访问,和Linux权限管理类似,用到了以下几个概念:
普通权限,也就是ls -l 命令所以看到的user + group + other 权限;
umask权限,设置新建文件/文件夹的默认权限;
ACL 掩码, 设置指定user/group对于文件/目录权限;
Hive的warehouse dir在HDFS上的权限,在创建过程中已经自动生成,为了对现有目录的任何权限不作修改,通过ACL方式给CDP_MERKLE_DEVELOPER组赋予warehouse dir的权限, 如下:
[root@nj-hdp-nb-node2 ~]# su - hdfs
[hdfs@nj-hdp-nb-node2 ~]$ hdfs dfs -setfacl -R -m group:xxxxx:r-x /warehouse
[hdfs@nj-hdp-nb-node2 ~]$ hdfs dfs -setfacl -R -m default:group:xxxxxx:r-x /warehouse
注意HDFS中对于user和group的关系刷新有延迟,从而影响权限生效速度,可手动刷新:
[hdfs@nj-hdp-nb-node2 ~]$ hdfs dfsadmin -refreshUserToGroupsMappings
另外,Spark Shell下访问Hive的database/table,需要注意2个Spark配置项:
(1) hive.metastore.uris
配置为: thrift://xxxxxx:9083
(2) metastore.catalog.default
配置为:Hive
这个选项默认为Spark, 即读取SparkSQL自己的metastore_db,修改完后,Spark Shell会去读取Hive的metastore,这样就可以实现以Spark Shell方式访问Hive SQL方式创建的databases/tables.
2. SQL Standards Based
通过HiveServer2的JDBC/ODBC接口访问Hive的时候,会使用这个权限,这种方式支持通过SQL语句的grant/revoke方式来分配database, table级别的权限。
从Storage Based的方式切换到SQL Std Based方式,只要从Ambari UI中点击选择即可,但要注意Ambari自动生成的配置文件项:hive.security.metastore.authorization.manager
org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider,org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly
应改为:
org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider
另外,需要为这种授权方式指定一个admin账号,因为从HiveServer2的JDBC/ODBC接口访问时,是不直接接触HDFS的,所以需要一个"sql" admin账号来负责grant/revoke access,修改配置文件项:hive.users.in.admin.role 来指定"sql" admin
注意:"sql "admin账号登入HiveServer2时,每次需要运行set role admin, 才可以将自己切换为admin权限;
3. Ranger
集中式权限控制,可以通过web界面管理 HDFS和HIVE的权限
三. 身份认证
HiveServer2有几种Authentication (身份验证)模式,不同的验证模式,需要的身份信息不一样:
NONE, Linux本地用户,只需要用户名
LDAP, 用户名 + 密码
KERBEROS, Kerberos principal
PAM, Linux的身份验证文件
CUSTOM,
NOSASL, 不需要用户名密码
Ambari显示的Authentication方式有:
NONE
LDAP
Kerberos
PAM
CUSTOM
目前选用的Authentication方式为NONE,即Linux本地验证,在LDAP将user/group信息同步到本地的情况下,区别只在于是否需要验证密码。