hive的用户和用户权限
hive的用戶和用戶權(quán)限
HiverServer2支持遠(yuǎn)程多客戶端的并發(fā)和認(rèn)證,支持通過JDBC、Beeline等連接操作。hive默認(rèn)的Derby數(shù)據(jù)庫,由于是內(nèi)嵌的文件數(shù)據(jù)庫,只支持一個用戶的操作訪問,支持多用戶需用mysql保存元數(shù)據(jù)。現(xiàn)在關(guān)心的是HiveServer如何基于mysql元數(shù)據(jù)庫管理用戶權(quán)限,其安全控制體系與Linux及Hadoop的用戶是否存在聯(lián)系。
1)remote方式部署Hive
Hive中metastore(元數(shù)據(jù)存儲)的三種方式:內(nèi)嵌Derby方式、基于mysql的Local方式、基于mysql的Remote方式。顯然多用戶并發(fā)模式是采用remote方式部署,Hiveserver元數(shù)據(jù)放置在mysql數(shù)據(jù)庫并在mysql建立用戶,HiveClient遠(yuǎn)程連接。回顧下remote方式部署Hive:
第一步:元數(shù)據(jù)庫mysql創(chuàng)建用戶名和數(shù)據(jù)庫;
第二步:HiveServer在 hive-site.xml 文件中配置jdbc URL、驅(qū)動、用戶名、密碼等屬性;
<property>
?<name>javax.jdo.option.ConnectionURL</name>
? <value>jdbc:mysql://mysql server IP/hive_meta?createDatabaseIfNotExist=true</value>
? <description>JDBC connect string for aJDBC metastore</description>
</property>
<property>
?<name>javax.jdo.option.ConnectionDriverName</name>
?<value>com.mysql.jdbc.Driver</value>
? <description>Driver class name for aJDBC metastore</description>
</property>
<property>
?<name>javax.jdo.option.ConnectionUserName</name>
? <value>hive</value>
? <description>username to use againstmetastore database</description>
</property>
<property>
? <name>javax.jdo.option.ConnectionPassword</name>
? <value>hive</value>
? <description>password to use againstmetastore database</description>
</property>
<property>
?<name>hive.metastore.warehouse.dir</name>
? <!-- base hdfs path -->
?<value>/user/hive/warehouse</value>
? <description>base hdfs path :locationof default database for the warehouse</description>
</property>
第三步:HiveClient在hive-site.xml 文件中配置thrift(負(fù)責(zé)client和server的通信)和存儲路徑;
<!--thrift://<host_name>:<port> 默認(rèn)端口是9083 -->
<property>
? <name>hive.metastore.uris</name>
? <value>thrift://Hiveserver IP:9083</value>
? <description>Thrift uri for the remotemetastore. Used by metastore client to connect to remotemetastore.</description>
</property>
<!--? hive表的默認(rèn)存儲路徑 -->
<property>
? <name>hive.metastore.warehouse.dir</name>
?<value>/user/hive/warehouse</value>
? <description>location of defaultdatabase for the warehouse</description>
</property>
<?property?>
???<?name?>hive.metastore.local</?name?>
???<?value?>false</?value>
</?property?>
第四步:HiveServer啟動metastore監(jiān)聽
執(zhí)行命令:hive--service metastore -p <port_num>?//默認(rèn)端口是9083
第五步:HiveClient執(zhí)行hive命令。
上述5步,下圖是很清晰的展現(xiàn)。
2)msyql元數(shù)據(jù)字典表
從remote方式部署的Hive看,還未體現(xiàn)出多用戶管理及其權(quán)限控制,需進(jìn)一步深入研究下圖四個模塊的關(guān)系。
Hive早期版本是通過Linux的用戶和用戶組來控制用戶權(quán)限,無法對Hive表的CREATE、SELECT、DROP等操作進(jìn)行控制。現(xiàn)Hive基于元數(shù)據(jù)庫來管理多用戶并控制權(quán)限。數(shù)據(jù)分為元數(shù)據(jù)和數(shù)據(jù)文件兩部分,元數(shù)據(jù)存儲在mysql,而數(shù)據(jù)文件則是HDFS,控制元數(shù)據(jù)即控制可訪問的數(shù)據(jù)文件。
Hive在mysql上的元數(shù)據(jù)表主要分為:Database相關(guān)、Table相關(guān)、數(shù)據(jù)存儲相關(guān)SDS、COLUMN相關(guān)、SERDE相關(guān)(序列化)、Partition相關(guān)(分區(qū))、SKEW相關(guān)(數(shù)據(jù)傾斜)、BUCKET相關(guān)(分桶)、PRIVS相關(guān)(權(quán)限管理),對數(shù)據(jù)庫-數(shù)據(jù)表、用戶有相應(yīng)關(guān)系體現(xiàn)。其中TBL_PRIVS存儲了表/視圖的授權(quán)信息,見如下數(shù)據(jù)字典:
| 元數(shù)據(jù)表字段 | 說明 | 示例數(shù)據(jù) |
| TBL_GRANT_ID | 授權(quán)ID | 1 |
| CREATE_TIME | 授權(quán)時間 | 1436320455 |
| GRANT_OPTION | ? | 0 |
| GRANTOR | 授權(quán)執(zhí)行用戶 | liuxiaowen |
| GRANTOR_TYPE | 授權(quán)者類型 | USER |
| PRINCIPAL_NAME | 被授權(quán)用戶 | username |
| PRINCIPAL_TYPE | 被授權(quán)用戶類型 | USER |
| TBL_PRIV | 權(quán)限 | Select、Alter |
| TBL_ID | 表ID | 22,對應(yīng)TBLS表中的TBL_ID |
再看mysql中存儲Hive中所有數(shù)據(jù)庫基本信息的表DBS數(shù)據(jù)字典:
| 元數(shù)據(jù)表字段 | 說明 | 示例數(shù)據(jù) |
| DB_ID | 數(shù)據(jù)庫ID | 2 |
| DESC | 數(shù)據(jù)庫描述 | 測試庫 |
| DB_LOCATION_URI | 數(shù)據(jù)庫HDFS路徑 | hdfs://namenode/user/hive/warehouse/sample.db |
| NAME | 數(shù)據(jù)庫名 | lxw1234 |
| OWNER_NAME | 數(shù)據(jù)庫所有者用戶名 | lxw1234 |
| OWNER_TYPE | 所有者角色 | USER |
從mysql存儲的Hive元數(shù)據(jù)表數(shù)據(jù)字典看,Hive是基于元數(shù)據(jù)mysql管理多用戶權(quán)限,用戶權(quán)限信息都存儲在元數(shù)據(jù)表中。要重點理解是,mysql只是保存Hive的元數(shù)據(jù),mysql本身的用戶和Hive沒有關(guān)系,Hive只是把自己的用戶信息保存在mysql元數(shù)據(jù)表中。數(shù)據(jù)字典中關(guān)于權(quán)限元數(shù)據(jù)總結(jié)如下:
Db_privs:記錄了User/Role在DB上的權(quán)限
Tbl_privs:記錄了User/Role在table上的權(quán)限
Tbl_col_privs:記錄了User/Role在table column上的權(quán)限
Roles:記錄了所有創(chuàng)建的role
Role_map:記錄了User與Role的對應(yīng)關(guān)系
3)Hive用戶權(quán)限管理
從remote部署hive和mysql元數(shù)據(jù)表字典看,已經(jīng)明確hive是通過存儲在元數(shù)據(jù)中的信息來管理用戶權(quán)限。現(xiàn)在重點是Hive怎么管理用戶權(quán)限。首先要回答的是用戶是怎么來的,發(fā)現(xiàn)hive有創(chuàng)建角色的命令,但沒有創(chuàng)建用戶的命令,顯然Hive的用戶不是在mysql中創(chuàng)建的。在回答這個問題之前,先初步了解下Hive的權(quán)限管理機(jī)制。
第一:在hive-site.xml文件中配置參數(shù)開啟權(quán)限認(rèn)證
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
<description>enableor disable the hive clientauthorization</description>
</property>
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
<description>theprivileges automatically granted to the ownerwhenever a table gets created. Anexample like "select,drop" willgrant select and drop privilege to theowner of the table</description>
</property>
hive.security.authorization.enabled參數(shù)是開啟權(quán)限驗證,默認(rèn)為false。
hive.security.authorization.createtable.owner.grants參數(shù)是指表的創(chuàng)建者對表擁有所有權(quán)限。
第二:Hive的權(quán)限管理是通過用戶(User)、組(Group)、角色(Role)來定義,角色定義了權(quán)限,賦予給組或用戶,用戶歸屬于組。
角色相關(guān)命令:create role rolename、drop rolename、grant rolename to user username;
第三:Hive權(quán)限控制:
| ? ?? ? 操作 | ? ???解釋 |
| ALL | 所有權(quán)限 |
| ALTER | 允許修改元數(shù)據(jù)(modify metadata data of??object)---表信息數(shù)據(jù) |
| UPDATE | 允許修改物理數(shù)據(jù)(modify physical data of??object)---實際數(shù)據(jù) |
| CREATE | 允許進(jìn)行Create操作 |
| DROP | 允許進(jìn)行DROP操作 |
| INDEX | 允許建索引(目前還沒有實現(xiàn)) |
| LOCK | 當(dāng)出現(xiàn)并發(fā)的使用允許用戶進(jìn)行LOCK和UNLOCK操作 |
| SELECT | 允許用戶進(jìn)行SELECT操作 |
| SHOW_DATABASE | 允許用戶查看可用的數(shù)據(jù)庫 |
例子:把select權(quán)限授權(quán)給username用戶,命令如下:
hive>grant select on database databasename to user username;
第四:為限制任何用戶都可以進(jìn)行Grant/Revoke操作,提高安全控制,需事先Hive的超級管理員。在hive-site.xml中添加hive.semantic.analyzer.hook配置,并實現(xiàn)自己的權(quán)限控制類HiveAdmin。
<property>
? ??<name>hive.semantic.analyzer.hook</name>
??? <value>com.hive.HiveAdmin</value>
</property>
com.hive.HiveAdmin類代碼如下:
package com.hive; importorg.apache.hadoop.hive.ql.parse.ASTNode; importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook; importorg.apache.hadoop.hive.ql.parse.HiveParser; importorg.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext; importorg.apache.hadoop.hive.ql.parse.SemanticException; importorg.apache.hadoop.hive.ql.session.SessionState; publicclass HiveAdmin extendsAbstractSemanticAnalyzerHook { privatestatic String admin = "admin";@Override publicASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext, ASTNodeast)throws SemanticException { switch(ast.getToken().getType()) { caseHiveParser.TOK_CREATEDATABASE: caseHiveParser.TOK_DROPDATABASE: caseHiveParser.TOK_CREATEROLE: caseHiveParser.TOK_DROPROLE: caseHiveParser.TOK_GRANT: caseHiveParser.TOK_REVOKE: caseHiveParser.TOK_GRANT_ROLE: caseHiveParser.TOK_REVOKE_ROLE:StringuserName = null; if(SessionState.get() != null &&SessionState.get().getAuthenticator()!= null){ userName=SessionState.get().getAuthenticator().getUserName();} if(!admin.equalsIgnoreCase(userName)) { thrownewSemanticException(userName+ " can't use ADMIN options,except " + admin +".");} break; default: break;} returnast;} }
這樣只有admin用戶這一超級管理員可以進(jìn)行Grant/Revoke操作。
到此基本理解了Hive的用戶權(quán)限管理框架,但核心問題還是Hive的用戶組和用戶來自于哪里?既不是mysql中的用戶,Hive本身也不提供創(chuàng)建用戶組和用戶的命令。折騰一番后,突然理解Hive用戶組和用戶即Linux用戶組和用戶,和hadoop一樣,本身不提供用戶組和用戶管理,只做權(quán)限控制。
到此可以梳理下Hive用戶權(quán)限管理的簡單流程:
第一步:創(chuàng)建超級管理員;
第二步:新建linux用戶組和用戶,也可以在既定用戶組下建用戶,賦予用戶hive目錄權(quán)限;
第三步:超級管理員進(jìn)入hive,授權(quán)新建用戶組和用戶的操作權(quán)限;
第四步:客戶端可以通過新建用戶名和密碼連接到hive執(zhí)行授權(quán)內(nèi)的動作;
4)Beeline工具
HiveServer2提供了一個新的命令行工具Beeline,它是基于SQLLine CLI的JDBC客戶端。Beeline工作模式有兩種,即本地嵌入模式和遠(yuǎn)程模式。嵌入模式情況下,它返回一個嵌入式的Hive(類似于Hive CLI);而遠(yuǎn)程模式則是通過Thrift協(xié)議與某個單獨的HiveServer2進(jìn)程進(jìn)行連接通信。
%bin/beeline
beeline>!connect
jdbc:hive2://<host>:<port>/<db>;
auth=noSaslhiveuser password org.apache.hive.jdbc.HiveDriver
命令中db就是在hiveserver中配置好的數(shù)據(jù)庫并授權(quán)hiveuser使用。
5)總結(jié)
首先hive用戶來自linux,和hadoop一樣,并具有組、用戶、角色的管理體系,其權(quán)限信息保存在元數(shù)據(jù)庫中。
當(dāng)然hive安全認(rèn)證還有很多需要進(jìn)一步了解,以進(jìn)一步管理hadoop集群平臺。
轉(zhuǎn)載于:https://www.cnblogs.com/zuizui1204/p/9117116.html
總結(jié)
以上是生活随笔為你收集整理的hive的用户和用户权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 981G
- 下一篇: 漫画算法:什么是一致性哈希?