TOP

Hive多用戶操作以及權限管理
2019-01-21 01:06:32 】 瀏覽:1037
Tags:

Hive是基于Hadoop的一個數據倉庫工具,是一種邏輯上的數據庫,依賴hdfs文件系統;它把實際的數據文件映射為一張數據庫表來作為元數據來管理hdfs上的數據。Hive存在的意義并非數據存儲,而是被用來處理數據的,它計算的實質是用sql調用了底層的mapreduce。因為hive的sql的學習成本比較低,幾乎和mysql這些數據庫近似,所以使用極其廣泛。很多公司使用hive幾乎都能夠撐起整個項目。

Hive幾大組件

Driver組件:包括Complier、Optimizer和Excecutor,主要作用是將sql進行解析、編譯優化、生成執行計劃,然后調用底層的的mapreduce計算框架。

Thrift服務組件:thrift是facebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的接口。

Metastore組件:它是元數據服務組件,hive元數據集中存放地。Metastore組件包括兩個部分:metastore服務和后臺數據的存儲。后臺數據存儲的介質就是關系數據庫,例如mysql數據庫。Metastore服務是建立在后臺數據存儲介質之上,并且可以和hive服務進行交互的服務組件,默認情況下,metastore服務和hive服務是安裝在一起的优乐棋牌app下载,運行在同一個進程當中。也可以把metastore服務從hive服務里剝離出來,metastore獨立安裝在一個集群里优乐棋牌app下载,hive遠程調用metastore服務,這樣就可以把元數據這一層放到防火墻之后,客戶端訪問hive服務,就可以連接到元數據這一層,從而提供了更好的管理性和安全保障。使用遠程的metastore服務,可以讓metastore服務和hive服務運行在不同的進程里,這樣也保證了hive的穩定性,提升了hive服務的效率。

客戶端組件:包括cli命令行接口;Thrift客戶端,實際上像jdbc、odbc這些接口都是建立在thrift客戶端之上的;WEBGUI是hive客戶端提供網頁訪問服務,這個接口對應了hive的hwi(hive web interface)組件,使用前要啟動hwi服務。

Hive多用戶操作配置

Hive-server配置(hive-site.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
39
40

<configuration>
<!--配置jdbc連接,ip為安裝mysql的主機ip,database_name是給hive使用
的數據庫名稱-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.11.35/database_name
createDatabaseIfNotExist=true</value>
<description>JDBCconnectstringforaJDBCmetastore</description>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>DriverclassnameforaJDBCmetastore</description>
</property>

<!--在mysql里給hive使用的mysql用戶名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>usernametouseagainstmetastoredatabase</description>
</property>

<!--在mysql里給hive使用的mysql用戶密碼-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
<description>passwordtouseagainstmetastoredatabase</description>
</property>

<!--數據在hdfs上保存的路徑-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse/user_name</value>
<description>basehdfspath:locationofdefaultdatabaseforthe
warehouse</description>
</property>

</configuration>

Hive-client配置(hive-site.xml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<configuration>

<!--配置hive-server的uri路徑-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.11.35:9083</value>
<description>Thrifturifortheremotemetastore.Usedby
metastoreclienttoconnecttoremotemetastore.</description>
</property>

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse/zhangyi</value>
<description>locationofdefaultdatabaseforthewarehouse</description>
</property>

<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>

</configuration>

在hive-server上開啟metastone監聽:

1

$hive--servermetastore–p 9083

然后在hive-client上執行hive命令

Hive多用戶權限控制

當多個用戶共同使用hive時,需要對不同角色做不同的權限控制。權限控制主要指底層的hdfs文件操作控制和hive自身對表的授權管理。hive是通過mysql的元數據來控制hive里的權限。

Hive授權的核心是:user优乐棋牌app下载,group,role。

User:是基于linux用戶的user,哪個linux用戶使用hive客戶端,那個linux用戶就是該hive的user。

Group:同樣是linux層面上的用戶組。

Role:只有角色是在hive里面自己創建的,可以給角色添加權限屬性,再把角色賦予給user,這樣該用戶就擁有了該角色的權限。

Hive多用戶權限控制需要在客戶端的hive-site.xml加上以下屬性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

18

19

20

21

22

<!--開啟hive權限認證機制-->
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
<description>enableordisablethehiveclientauthorization</description>
</property>

<!--設置用戶對自己創建的表擁有所有權限-->
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
<description>theprivilegesautomaticallygrantedtotheownerwhenever
atablegetscreated.Anexamplelike"select,drop"willgrantselect
anddropprivilegetotheownerofthetable</description>
</property>


<!--通常出現ThecurrentbuiltinauthorizationinHiveisincomplete
anddisabled.錯誤提示時配置下面的參數-->
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.
HiveAuthorizationTaskFactoryImpl</value>
</property>

此時hive已經開啟了權限管理的功能,但是所有的用戶都擁有給自己甚至別人賦權的能力。為了安全起見(這種安全機制只是為了避免誤操作)我們只需要一個超級管理員用戶擁有給別人賦權的能力。所以接著我們寫一個類用來控制用戶的賦權權限。

Vim AuthHook.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

packagecom.hivepro.test;

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;


publicclassAuthHookextendsAbstractSemanticAnalyzerHook{
privatestaticStringadmin="hadoop";

@Override
publicASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext,
ASTNodeast)throwsSemanticException{
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'tuseADMINoptions,except"+admin+".");
}
break;
default:
break;
}
returnast;
}
}

接著將該java文件編譯、打包后放入hive的lib目錄下并在hive-client的hive-site.xml添加屬性

1
2
3
4
5

<!--配置超級管理員,需要自定義控制類繼承這個AbstractSemanticAnalyzerHook-->
<property>
<name>hive.semantic.analyzer.hook</name>
<value> com.hivepro.test.AuthHook</value>
</property>

權限管理命令

創建角色:

1

createrolerole_name

顯示所有的角色

1

Show roles

刪除角色:

1

droprolerole_name

賦權給角色

1
2
3
4

<!--賦予role_name擁有在database_name創建的權限-->
grantcreateondatabasedatabase_nametorolerole_name
<!--賦予role_name擁有table_name查詢的權限-->
grantselecton[table]table_nametorolerole_name

回收某個角色的某個權限

1
2

revokecreateondatabasedatabase_namefromrolerole_name
revokeselecton[table]table_namefromrolerole_name

查看某個角色在某張表或某個數據庫的權限

1
2

showgrantrolerole_nameondatabasedatabase_name
showgrantrolerole_nameon[table]table_name

將角色賦予給用戶

1

grantrolerole_nametouseruser_name

查看某用戶的所有角色

1

showrolegrantuseruser_name

權限屬性:

ALL

所有權限

ALTER

允許修改元數據(modify metadatadata of object)---表信息數據

UPDATE

允許修改物理數據(modify physicaldata of object)---實際數據

CREATE

允許進行Create操作

DROP

允許進行DROP操作

LOCK

當出現并發的使用允許用戶進行LOCK和UNLOCK操作

SELECT

允許用戶進行SELECT操作

SHOW_DATABASE

允許用戶查看可用的數據庫


請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇實戰Hive本地文件系統導入數據 下一篇Hive:客戶端