HiverServer2支持遠程多客戶端的併發和認證,支持經過JDBC、Beeline等鏈接操做。hive默認的Derby數據庫,因爲是內嵌的文件數據庫,只支持一個用戶的操做訪問,支持多用戶需用mysql保存元數據。如今關心的是HiveServer如何基於mysql元數據庫管理用戶權限,其安全控制體系與Linux及Hadoop的用戶是否存在聯繫。java
1)remote方式部署Hivenode
Hive中metastore(元數據存儲)的三種方式:內嵌Derby方式、基於mysql的Local方式、基於mysql的Remote方式。顯然多用戶併發模式是採用remote方式部署,Hiveserver元數據放置在mysql數據庫並在mysql創建用戶,HiveClient遠程鏈接。回顧下remote方式部署Hive:mysql
第一步:元數據庫mysql建立用戶名和數據庫;linux
第二步:HiveServer在 hive-site.xml 文件中配置jdbc URL、驅動、用戶名、密碼等屬性;sql
<property>數據庫
<name>javax.jdo.option.ConnectionURL</name>apache
<value>jdbc:mysql://mysql server IP/hive_meta?createDatabaseIfNotExist=true</value>安全
<description>JDBC connect string for aJDBC metastore</description>session
</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(負責client和server的通訊)和存儲路徑;
<!--thrift://<host_name>:<port> 默認端口是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表的默認存儲路徑 -->
<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監聽
執行命令:hive--service metastore -p <port_num> //默認端口是9083
第五步:HiveClient執行hive命令。
上述5步,下圖是很清晰的展示。
2)msyql元數據字典表
從remote方式部署的Hive看,還未體現出多用戶管理及其權限控制,需進一步深刻研究下圖四個模塊的關係。
Hive早期版本是經過Linux的用戶和用戶組來控制用戶權限,沒法對Hive表的CREATE、SELECT、DROP等操做進行控制。現Hive基於元數據庫來管理多用戶並控制權限。數據分爲元數據和數據文件兩部分,元數據存儲在mysql,而數據文件則是HDFS,控制元數據即控制可訪問的數據文件。
Hive在mysql上的元數據表主要分爲:Database相關、Table相關、數據存儲相關SDS、COLUMN相關、SERDE相關(序列化)、Partition相關(分區)、SKEW相關(數據傾斜)、BUCKET相關(分桶)、PRIVS相關(權限管理),對數據庫-數據表、用戶有相應關係體現。其中TBL_PRIVS存儲了表/視圖的受權信息,見以下數據字典:
元數據表字段 |
說明 |
示例數據 |
TBL_GRANT_ID |
受權ID |
1 |
CREATE_TIME |
受權時間 |
1436320455 |
GRANT_OPTION |
? |
0 |
GRANTOR |
受權執行用戶 |
liuxiaowen |
GRANTOR_TYPE |
受權者類型 |
USER |
PRINCIPAL_NAME |
被受權用戶 |
username |
PRINCIPAL_TYPE |
被受權用戶類型 |
USER |
TBL_PRIV |
權限 |
Select、Alter |
TBL_ID |
表ID |
22,對應TBLS表中的TBL_ID |
再看mysql中存儲Hive中全部數據庫基本信息的表DBS數據字典:
元數據表字段 |
說明 |
示例數據 |
DB_ID |
數據庫ID |
2 |
DESC |
數據庫描述 |
測試庫 |
DB_LOCATION_URI |
數據庫HDFS路徑 |
hdfs://namenode/user/hive/warehouse/sample.db |
NAME |
數據庫名 |
lxw1234 |
OWNER_NAME |
數據庫全部者用戶名 |
lxw1234 |
OWNER_TYPE |
全部者角色 |
USER |
從mysql存儲的Hive元數據表數據字典看,Hive是基於元數據mysql管理多用戶權限,用戶權限信息都存儲在元數據表中。要重點理解是,mysql只是保存Hive的元數據,mysql自己的用戶和Hive沒有關係,Hive只是把本身的用戶信息保存在mysql元數據表中。數據字典中關於權限元數據總結以下:
Db_privs:記錄了User/Role在DB上的權限
Tbl_privs:記錄了User/Role在table上的權限
Tbl_col_privs:記錄了User/Role在table column上的權限
Roles:記錄了全部建立的role
Role_map:記錄了User與Role的對應關係
3)Hive用戶權限管理
從remote部署hive和mysql元數據表字典看,已經明確hive是經過存儲在元數據中的信息來管理用戶權限。如今重點是Hive怎麼管理用戶權限。首先要回答的是用戶是怎麼來的,發現hive有建立角色的命令,但沒有建立用戶的命令,顯然Hive的用戶不是在mysql中建立的。在回答這個問題以前,先初步瞭解下Hive的權限管理機制。
第一:在hive-site.xml文件中配置參數開啓權限認證
<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參數是開啓權限驗證,默認爲false。
hive.security.authorization.createtable.owner.grants參數是指表的建立者對錶擁有全部權限。
第二:Hive的權限管理是經過用戶(User)、組(Group)、角色(Role)來定義,角色定義了權限,賦予給組或用戶,用戶歸屬於組。
角色相關命令:create role rolename、drop rolename、grant rolename to user username;
第三:Hive權限控制:
操做 |
解釋 |
ALL |
全部權限 |
ALTER |
容許修改元數據(modify metadata data of object)---表信息數據 |
UPDATE |
容許修改物理數據(modify physical data of object)---實際數據 |
CREATE |
容許進行Create操做 |
DROP |
容許進行DROP操做 |
INDEX |
容許建索引(目前尚未實現) |
LOCK |
當出現併發的使用容許用戶進行LOCK和UNLOCK操做 |
SELECT |
容許用戶進行SELECT操做 |
SHOW_DATABASE |
容許用戶查看可用的數據庫 |
例子:把select權限受權給username用戶,命令以下:
hive>grant select on database databasename to user username;
第四:爲限制任何用戶均可以進行Grant/Revoke操做,提升安全控制,需事先Hive的超級管理員。在hive-site.xml中添加hive.semantic.analyzer.hook配置,並實現本身的權限控制類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用戶這一超級管理員能夠進行Grant/Revoke操做。
到此基本理解了Hive的用戶權限管理框架,但核心問題仍是Hive的用戶組和用戶來自於哪裏?既不是mysql中的用戶,Hive自己也不提供建立用戶組和用戶的命令。折騰一番後,忽然理解Hive用戶組和用戶即Linux用戶組和用戶,和hadoop同樣,自己不提供用戶組和用戶管理,只作權限控制。
到此能夠梳理下Hive用戶權限管理的簡單流程:
第一步:建立超級管理員;
第二步:新建linux用戶組和用戶,也能夠在既定用戶組下建用戶,賦予用戶hive目錄權限;
第三步:超級管理員進入hive,受權新建用戶組和用戶的操做權限;
第四步:客戶端能夠經過新建用戶名和密碼鏈接到hive執行受權內的動做;
4)Beeline工具
HiveServer2提供了一個新的命令行工具Beeline,它是基於SQLLine CLI的JDBC客戶端。Beeline工做模式有兩種,即本地嵌入模式和遠程模式。嵌入模式狀況下,它返回一個嵌入式的Hive(相似於Hive CLI);而遠程模式則是經過Thrift協議與某個單獨的HiveServer2進程進行鏈接通訊。
%bin/beeline
beeline>!connect
jdbc:hive2://<host>:<port>/<db>;
auth=noSaslhiveuser password org.apache.hive.jdbc.HiveDriver
命令中db就是在hiveserver中配置好的數據庫並受權hiveuser使用。
5)總結
首先hive用戶來自linux,和hadoop同樣,並具備組、用戶、角色的管理體系,其權限信息保存在元數據庫中。
固然hive安全認證還有不少須要進一步瞭解,以進一步管理hadoop集羣平臺。