1. 程式人生 > >CDH安裝SENTRY

CDH安裝SENTRY

1.  背景
雖然在叢集上部署了kerberos認證,但是kerberos只是對使用者層面進行認證,凡是認證通過的使用者都有全量的訪問許可權,這很不安全,需要進一步對使用者的許可權進行控制,Sentry 的作用就是這個。

2.  新增Sentry服務
2.1.進入CM首頁-->選擇叢集-->新增服務

2.2.選擇Sentry,點選繼續

2.3.給Sentry分配主機,繼續


2.4.給Sentry指定資料庫
此處填寫最初搭建CDH的時候,給Sentry預留的資料庫名稱和使用者名稱密碼,點選繼續

3.  啟動Sentry服務
3.1.準備工作
使用預設的Hive倉庫目錄,如果啟用了Kerberos,需要切換到hdfs使用者
將倉庫的許可權設定為771,所屬設定為hive:hive
hdfs dfs -chmod -R 771 /user/hive/warehouse

hdfs dfs -chown -R hive:hive /user/hive/warehouse

在CM中禁用HiveServer2的模擬
Hive-->配置 -->HiveServer2--> 主要 -->取消勾選“HiveServer2 啟用模擬”

若配置了MR/YARN,要給Hive向MR/YARN提交任務的許可權
MR/YARN-->配置-->範圍:TaskTracker/NodeManager-->類別:安全-->最小使用者ID為0/允許的系統使用者:有hive-->重啟YARN

關閉Hive CLI使用者接觸Hive元資料的渠道
Hive-->配置-->搜proxyuser-->新增三個使用者 hive、hue、sentry

 

3.2.給Hive啟用Sentry服務
Hive-->配置-->範圍:Hive-->類別:主要-->選擇Sentry服務-->搜尋到啟用資料庫中的儲存通知,開啟 -->重啟

 

3.3.把Hive新增的Sentry的管理員組裡
Sentry-->配置-->範圍:Sentry-->類別:主要-->管理組-->儲存

 
--------------------- 

在CDH中新增完Sentry服務後,需要更改一下hive配置才能通過beeline訪問。 
第一,修改Hive下的HiveServer2配置,如下所示: 

將HiveServer2 Load Balancer中的admin去掉和HiveServer2 啟用模擬的√去掉。 
這裡的admin是預設的,跟前面配置有關,之前沒有去掉直接導致beeline連線不上。更改後如下: 

第二,將Hive服務的Sentry勾上,預設是none 

在YARN的NodeManger在檢視“允許的系統使用者”項,看到下圖所示就不用更改了(預設) 

重啟Hive過時服務

緊接著,開啟HDFS角色的acl(這裡主要控制使用者訪問的HDFS目錄,因為在生產環境中會指定一些目錄是該使用者可以訪問的,而其他一些目錄該使用者訪問不了) 

重啟過期HDFS配置: 

然後到Sentry服務下的“管理員組”檢視有沒有hive/impala/hbase/hue,沒有新增上(預設是已經存在) 


緊接著,生成hive.keytab檔案 
這裡,叢集有wlint01、wlnamenode01、wldatanode001~wldatanode018一個20個節點,需要生成的hive的keytab檔案最後彙集到hive.keytab一個檔案中。 
首先在Kerberos資料庫中建立principal:

[wlbd@wlint01 ~]$ sudo kadmin.local -q "addprinc -randkey hive/[email protected]"
[wlbd@wlint01 ~]$ sudo kadmin.local -q "addprinc -randkey hive/[email protected]"
[wlbd@wlint01 ~]$ for i in {1..9}; do sudo kadmin.local -q "addprinc -randkey hive/[email protected]"; done
[wlbd@wlint01 ~]$ for i in {0..8}; do sudo kadmin.local -q "addprinc -randkey hive/[email protected]"; done
1
2
3
4
5
這裡用sudo是因為在生產環境下只能用wlbd這個使用者,而且要用到sudo這個命令才能啟用kadmin.local這個命令。如果你是root使用者,不需要加sudo。

然後,在當前目錄下生成hive.keytab檔案。

[wlbd@wlint01 ~]$ sudo kadmin.local -q "xst -norandkey -k hive.keytab hive/[email protected]"
[wlbd@wlint01 ~]$ sudo kadmin.local -q "xst -norandkey -k hive.keytab hive/[email protected]"
[wlbd@wlint01 ~]$ for i in {1..9}; do sudo kadmin.local -q "xst -norandkey -k hive.keytab hive/[email protected]"; done
[wlbd@wlint01 ~]$ for i in {0..8}; do sudo kadmin.local -q "xst -norandkey -k hive.keytab hive/[email protected]"; done
1
2
3
4
修改hive-site.xml檔案

[root@wlint01 ~]# vi /etc/hive/conf/hive-site.xml
1
注意,這裡是root許可權 
在hive-site.xml後面加入下面幾句:

 <property>
    <name>hive.server2.authentication</name>
    <value>kerberos</value>
  </property>
  <property>
    <name>hive.metastore.kerberos.principal</name>
    <value>hive/[email protected]</value>
  </property>
  <property>
    <name>hive.server2.authentication.kerberos.principal</name>
    <value>hive/[email protected]</value>
  </property>
  <property>
  <name>hive.metastore.kerberos.keytab.file</name>
  <value>/etc/hive/conf/hive.keytab</value>
  </property>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
最後一句就是你接下來放置hive.keytab的路徑。這裡需要注意的是當重啟hive時,hive的配置檔案可能會更改為之前預設情況下,而且/etc/hive/conf/下的hive.keytab也會被刪除,需要重啟拷貝和重新修改hive-site.xml。所以這裡我們選擇先修改配置檔案再拷貝hive.keytab檔案。 
將修改後的hive-site.xml檔案scp到各個節點

[root@wlint01 wlbd]# for i in {10..28}; do  scp /etc/hive/conf/hive-site.xml 192.168.32.$i:/etc/hive/conf; done
1
這裡的ip地址對應上面的hostname

同樣將hive.keytab檔案拷貝到每一臺主機的/etc/hive/conf目錄下。

[root@wlint01 wlbd]# for i in {9..28}; do  scp  hive.keytab 192.168.32.$i:/etc/hive/conf; done
1
修改每個節點keytab許可權:

[root@wlint01 wlbd]#for i in {9..28}; do ssh 192.168.32.$i "cd /etc/hive/conf; chmod 400 hive.keytab; chown hive:hadoop hive.keytab"; done
1
2. 許可權測試

建立兩個系統使用者user1和user2

[root@wlint01 wlbd]# useradd user1
[root@wlint01 wlbd]# passwd user1
[root@wlint01 wlbd]# useradd user2
[root@wlint01 wlbd]# passwd user2
1
2
3
4
建立Kerberos使用者

[wlbd@wlint01 ~]$ sudo kadmin.local -q "addprinc user1"
[wlbd@wlint01 ~]$ sudo kadmin.local -q "addprinc user2"
1
2
建立資料庫和表。這裡需要kinit之前生成的hive.keytab,然後進入Hive CLI建立資料庫,再通過beeline建立role。 
當前目錄下有events.csv檔案

[wlbd@wlint01 ~]$ cat events.csv 
10.1.2.3,US,android,createNote
10.200.88.99,FR,windows,updateNote
10.1.2.3,US,android,updateNote
10.200.88.77,FR,ios,createNote
10.1.4.5,US,windows,updateTag
1
2
3
4
5
6
7
[wlbd@wlint01 ~]$ kinit -kt hive.keytab hive/wlint01
1

建立兩個資料庫

create database db1;
create database db2;
1
2


在資料庫中建立表 
在db1中建立table1,在db2中建立table1和table2

create table db1.table1 (
ip STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table db2.table1 (
ip STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table db2.table2 (
ip STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';


load data local inpath '/home/wlbd/events.csv' overwrite into table db1.table1;
load data local inpath '/home/wlbd/events.csv' overwrite into table db2.table1;
load data local inpath '/home/wlbd/events.csv' overwrite into table db2.table2;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
賦予使用者許可權

這裡是通過beeline連線進行操作的 
給user1賦予db1的所有許可權

 beeline -u "jdbc:hive2://wlint01:10000/;principal=hive/[email protected]"
1
create role user1_role;
GRANT ALL ON DATABASE db1 TO ROLE user1_role;
GRANT ROLE user1_role TO GROUP user1;
1
2
3

給user2賦予db2的所有許可權

create role user2_role;
GRANT ALL ON DATABASE db2 TO ROLE user2_role;
GRANT ROLE user2_role TO GROUP user2;
1
2
3
測試使用者許可權 
user1使用者只具有db1和default的許可權

[wlbd@wlint01 ~]$ kinit user1
Password for [email protected]
[wlbd@wlint01 ~]$ beeline -u "jdbc:hive2://wlint01:10000/;principal=hive/[email protected]"
scan complete in 2ms
Connecting to jdbc:hive2://wlint01:10000/;principal=hive/[email protected]
Connected to: Apache Hive (version 1.1.0-cdh5.14.2)
Driver: Hive JDBC (version 1.1.0-cdh5.14.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.1.0-cdh5.14.2 by Apache Hive
0: jdbc:hive2://wlint01:10000/> show databases;
INFO  : Compiling command(queryId=hive_20180618150404_d26fd5a2-8c54-44d5-9df8-38f362535491): show databases
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20180618150404_d26fd5a2-8c54-44d5-9df8-38f362535491); Time taken: 0.38 seconds
INFO  : Executing command(queryId=hive_20180618150404_d26fd5a2-8c54-44d5-9df8-38f362535491): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20180618150404_d26fd5a2-8c54-44d5-9df8-38f362535491); Time taken: 0.281 seconds
INFO  : OK
+----------------+--+
| database_name  |
+----------------+--+
| db1            |
| default        |
+----------------+--+
2 rows selected (0.884 seconds)
0: jdbc:hive2://wlint01:10000/> 
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
user2使用者只具有db2和default的許可權

[wlbd@wlint01 ~]$ kinit user2
Password for [email protected]
[wlbd@wlint01 ~]$ beeline -u "jdbc:hive2://wlint01:10000/;principal=hive/[email protected]"
scan complete in 2ms
Connecting to jdbc:hive2://wlint01:10000/;principal=hive/[email protected]
Connected to: Apache Hive (version 1.1.0-cdh5.14.2)
Driver: Hive JDBC (version 1.1.0-cdh5.14.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.1.0-cdh5.14.2 by Apache Hive
0: jdbc:hive2://wlint01:10000/> show databases;
INFO  : Compiling command(queryId=hive_20180618151010_397e7de5-2bd7-4bd7-90d7-bbfabcab48e8): show databases
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20180618151010_397e7de5-2bd7-4bd7-90d7-bbfabcab48e8); Time taken: 0.104 seconds
INFO  : Executing command(queryId=hive_20180618151010_397e7de5-2bd7-4bd7-90d7-bbfabcab48e8): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20180618151010_397e7de5-2bd7-4bd7-90d7-bbfabcab48e8); Time taken: 0.176 seconds
INFO  : OK
+----------------+--+
| database_name  |
+----------------+--+
| db2            |
| default        |
+----------------+--+
2 rows selected (0.418 seconds)
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
禁用HIve CLI 

表示hive、hue、hdfs和sentry都能訪問CLI,別的使用者或組成員訪問不了CLI。這樣建立一個使用者user1,由於user1不在這個列表裡面,user1自然訪問不了Hive CLI。 


HDFS測試 
配置HDFS ACL與Sentry同步後,HDFS許可權與Sentry監控的目錄(/user/hive/warehouse)的許可權同步

[root@hxmaster ~]# kinit -kt hive.keytab hive/hxmaster
[root@hxmaster ~]# hadoop fs -getfacl -R /user/hive/warehouse/
# file: /user/hive/warehouse
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db1.db
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user1:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db1.db/table1
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user1:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db1.db/table1/events.csv
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user1:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db2.db
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user2:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db2.db/table1
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user2:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db2.db/table1/events.csv
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user2:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db2.db/table2
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user2:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/db2.db/table2/events.csv
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:user2:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/test_table
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/test_table/events.csv
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:hive:rwx
mask::rwx
other::--x
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
切換到user1使用者,檢視HDFS檔案

[root@hxmaster ~]# kinit user1
Password for [email protected]
You have mail in /var/spool/mail/root
[root@hxmaster ~]# hadoop fs -ls /user/hive/warehouse/db1.db
Found 1 items
drwxrwx--x+  - hive hive          0 2018-06-10 20:08 /user/hive/warehouse/db1.db/table1
[root@hxmaster ~]# hadoop fs -cat /user/hive/warehouse/db1.db/table1/events.csv
10.1.2.3,US,android,createNote
10.200.88.99,FR,windows,updateNote
10.1.2.3,US,android,updateNote
10.200.88.77,FR,ios,createNote
10.1.4.5,US,windows,updateTag
You have mail in /var/spool/mail/root
[root@hxmaster ~]# hadoop fs -ls /user/hive/warehouse/db2.db
ls: Permission denied: user=user1, access=READ_EXECUTE, inode="/user/hive/warehouse/db2.db":hive:hive:drwxrwx--x
[root@hxmaster ~]# hadoop fs -cat /user/hive/warehouse/db2.db/table1/events.csv
cat: Permission denied: user=user1, access=READ, inode="/user/hive/warehouse/db2.db/table1/events.csv":hive:hive:-rwxrwx--x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
切換到user2使用者,檢視HDFS檔案

[root@hxmaster ~]# kinit user2
Password for [email protected]
[root@hxmaster ~]# hadoop fs -ls /user/hive/warehouse/db1.db
ls: Permission denied: user=user2, access=READ_EXECUTE, inode="/user/hive/warehouse/db1.db":hive:hive:drwxrwx--x
[root@hxmaster ~]# hadoop fs -cat /user/hive/warehouse/db1.db/table1/events.csv
cat: Permission denied: user=user2, access=READ, inode="/user/hive/warehouse/db1.db/table1/events.csv":hive:hive:-rwxrwx--x
[root@hxmaster ~]# hadoop fs -ls /user/hive/warehouse/db2.db
Found 2 items
drwxrwx--x+  - hive hive          0 2018-06-10 20:08 /user/hive/warehouse/db2.db/table1
drwxrwx--x+  - hive hive          0 2018-06-10 20:08 /user/hive/warehouse/db2.db/table2
[root@hxmaster ~]# hadoop fs -cat /user/hive/warehouse/db2.db/table1/events.csv
10.1.2.3,US,android,createNote
10.200.88.99,FR,windows,updateNote
10.1.2.3,US,android,updateNote
10.200.88.77,FR,ios,createNote
10.1.4.5,US,windows,updateTag
[root@hxmaster ~]# hadoop fs -cat /user/hive/warehouse/db2.db/table2/events.csv
10.1.2.3,US,android,createNote
10.200.88.99,FR,windows,updateNote
10.1.2.3,US,android,updateNote
10.200.88.77,FR,ios,createNote
10.1.4.5,US,windows,updateTag
--------------------- 

1.hue整合sentry服務
首先登陸如下介面我的是http://master:7180/cmf/home

然後點選hue元件進入下面的介面,點選配置搜尋Sentry將Sentry服務的Sentry勾選上

2. hive和impala啟用Sentry和上面的步驟一樣這裡就不做介紹了
3.對hive和hue做許可權控制
首先登陸到hue的介面上來我個人的登陸地址為master:8888
登陸之後預設的賬號和密碼都是admin
進入如下介面點選圖中所示

之後點選增加使用者新增一個使用者將hue使用者加入其中密碼自己設定,然後將hue使用者放入hue組之中之後以hue使用者的身份登入
登陸之後再次以hue的身份建立幾個使用者並且分配組如下圖所示先點選1在點選2,之後再在3的位置分配許可權。

                       

 

注意:其中有幾點要注意hue組是Sentry的管理組所以建立hue組之後放入其中的hue使用者是管理使用者所以擁有許可權去建立其他使用者,而且不僅要保證hue使用者存在即如果在之前cdh集成了kerberos的話需要在kerberos中加入hue使用者並且還要保證linux使用者組中包含hue,以上都可以通用到其他使用者身上即假如建立一個使用者叫做user那麼需要保證linux使用者組中包含user,如果cdh集成了kerberos的話還要保證kerberos域中包含此user使用者,並且你將user使用者放入哪個使用者組中就會擁有哪個使用者組的許可權。

通過以上操作你可以實現hue所建立的使用者擁有什麼許可權的控制比如你可以實現此使用者登陸hue之後能看到什麼資料,能執行什麼從操作從而實現對hive的控制,比如此使用者只能實現對錶table1實現select的處查詢你甚至可以控制他只能查詢此資料庫中table1表的name欄位即實現列級控制。

4.Hbase整合Sentry
首先登陸master:7180
然後點選hbase元件在配置裡面搜尋auth將以下內容勾選上
                   

在輸入dfs將以下內容勾選上
                 

輸入superuser加入一個超級使用者之後去hbase shell裡面建立一個表然後建立一個使用者加入kerberos中之後執行kinit username(你自己的使用者名稱)登陸然後進入hbase shell對此使用者賦予許可權
                    

賦權的程式碼如下

 grant "username(使用者名稱)" ,"R(許可權)","student(表名)","sex(列族名)","xingmian(列名)"
此外hbase還可以開啟行級控制在配置中輸入row將行級控制勾選上如果此時報錯的話需要在hbase配置的高階中的hbase-site.xml 的 HBase 服務高階配置程式碼段(安全閥)中加入以下內容:

                  

5.HDFS 控制檔案許可權配置
hdfs-配置--啟用 Sentry 同步--HDFS(服務範圍)

啟用訪問控制列表---dfs.namenode.acls.enabled

啟用 檢查 HDFS 許可權----dfs.permissions--HDFS(服務範圍)

啟用 HTTP Web 控制檯的 Kerberos 身份驗證--HDFS(服務範圍),啟動之後就不能訪問hdfs 的namenode web ui頁面了。其他服務也可進行類似的控制。

Sentry 同步路徑字首--sentry.hdfs.integration.path.prefixes---HDFS(服務範圍) 

sentry.hdfs.integration.path.prefixes :/user/hive/warehouse

測試:

user2只 擁有 test.student 表的查詢許可權,同步檔案許可權之後user2只擁有/user/hive/warehouse/test.db/student 該檔案的查詢許可權。hdfs下/user/hive/warehouse和他下面的其他路徑 都不能訪問。

kinit user2

[root@slave01 mySparkTest]# hdfs dfs -ls /user/hive/
Found 2 items
drwxr-xr-x   - hive hive          0 2018-07-30 17:00 /user/hive/.sparkStaging
drwxrwx--x+  - hive hive          0 2018-07-20 09:31 /user/hive/warehouse

[root@slave01 mySparkTest]# hdfs dfs -ls /user/hive/warehouse
ls: Permission denied: user=user2, access=READ_EXECUTE, inode="/user/hive/warehouse":hive:hive:drwxrwx--x
[root@slave01 mySparkTest]# hdfs dfs -ls /user/hive/warehouse/test.db/
ls: Permission denied: user=user2, access=READ_EXECUTE, inode="/user/hive/warehouse/test.db":hive:hive:drwxrwx--x
[root@slave01 mySparkTest]# hdfs dfs -ls /user/hive/warehouse/test.db/student
Found 1 items
-rwxrwx--x+  3 hive hive        113 2018-07-20 10:47 /user/hive/warehouse/test.db/student/student.txt

 
--------------------- 

Sentry在CDH平臺中定位為統一的授權框架,即所有的元件都要受Sentry的管理,當然也是為了方便使用者的操作,一個入口為所有資料相關進行授權。Fayson在前面的文章中介紹了大量Sentry與Hive/Impala的整合文章,其實Sentry除了可以給Hive/Impala表授權外,還可以管理HDFS ACL,Kafka,Solr,Kudu等。前兩天Fayson也介紹過如何使用Sentry給Solr的collection進行賦權,參考《如何使用Sentry為Solr賦權》。本文Fayson主要介紹如何使用Sentry給Kafka的topic相關進行授權。

  • 內容概述:

1.Kafka與Sentry的整合賦權介紹

2.啟用Kafka的Sentry賦權

3.Kafka的賦權測試

4.總結

  • 測試環境:

1.CM5.14.3/CDH5.14.2

2.CDK2.2.0(Apache Kafka0.10.2)

3.作業系統版本為Redhat7.3

4.採用root使用者進行操作

5.叢集已啟用Kerberos

2.Kafka與Sentry的整合賦權介紹


從CDK2.1.x(Apache Kafka0.10.0) on CDH5.9.x開始,CDH開始支援通過Sentry給Kafka授權。我們知道Kafka可以單獨作為叢集部署,但是因為Sentry的安裝需要HDFS,所以在部署Sentry與Kafka整合時,你必須安裝HDFS服務,當Sentry安裝完畢後,你可以停止HDFS服務。

2.1.可授權的資源


在Kafka叢集中,可以賦權的東東我們稱作資源(resources)或者實體(entities ),一旦啟用Kafka的Sentry後,對這些資源或者實體進行操作,都需要對使用者組進行賦權。Kafka中包含4種可以授權的資源:

1.叢集(Cluster),它控制誰可以執行叢集級別的操作,比如建立或者刪除topic。它只有一個值,kafka-cluster,因為一個Kafka叢集不能擁有多個叢集資源。

2.Topic,它控制誰可以執行Topic級別的操作,比如生產和消費Topic。注意你在賦權的時候,它的值必須與Kafka的Topic的名稱完全一致。從CDK3.1.0+CDH5.14.2開始,萬用字元(*)代表任何Topic許可權。

3.消費者組(Consumergroup),它控制誰可以執行消費者組級別的操作,比如加入或者描述消費者組。它的值必須與消費者組的group.id完全匹配。從CDK3.1.0+CDH5.14.2開始,萬用字元(*)代表任何消費者組許可權。當和Spark Streaming一起使用時,這一點比較重要,因為group.id可能是靠你的程式生成的。

4.主機(Host),它控制你可以從哪些主機執行操作。這個可以實現Kafka服務的IP過濾,萬用字元(*)代表允許所有主機。

2.2.可授權的操作


每個資源都可以被授權多種操作,以下是Kafka支援的授權操作,不是所有資源都支援以下所有操作。

1.ALL,代表資源的所有操作

2.read

3.write

4.create

5.delete

6.alter

7.describe

8.clusteraction

3.啟用Kafka的Sentry賦權


在介紹本章之前,你需要一些預備知識才能繼續往下閱讀。首先CDH的Parcel預設不包含Kafka,你需要單獨下載和安裝,請參考Fayson之前的文章

如何在CDH中安裝Kudu&Spark2&Kafka

啟用Kafka的Sentry授權,叢集必須安裝Kerberos,Kerberos的安裝請參考Fayson之前的文章

如何在CDH叢集啟用Kerberos

如何在Redhat7.3的CDH5.14中啟用Kerberos

如何在CDH6.0.0-beta1中啟用Kerberos

Kafka在啟用Kerberos,以及使用過程中跟其他元件有些不一樣,主要是需要引入jaas檔案,請參考Fayson之前的文章

如何通過Cloudera Manager為Kafka啟用Kerberos及使用

以下開始啟用Kafka的Sentry授權整合

1.從Cloudera Manager修改Kafka的配置

以上三項,如果你正確啟用了Kafka的Kerberos,預設已經啟用

2.啟用Kafka的Sentry,通過Cloudera Manager修改Kafka服務的配置

Sentry許可權的cache勾選後可以提高效能。

3.如果是測試系統,建議將Sentry的cache間隔調整短一點,預設30s,可以改為1ms。

否則每次調整Kafka的相關授權以後,預設需要等待30s才能生效。

4.儲存以上修改,然後重啟叢集服務,重啟過程這裡略。

4.建立測試需要使用的使用者和principle


1.在所有節點建立fayson使用者,並在Kerberos中建立fayson的principle。

[root@cdh01 shell]# sh ssh_do_all.sh node.list  "useradd fayson"

(可左右滑動)

[root@cdh01 shell]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  addprinc fayson
WARNING: no policy specified for [email protected]; defaulting to no policy
Enter password for principal "[email protected]": 
Re-enter password for principal "[email protected]": 
Principal "[email protected]" created.
kadmin.local:

(可左右滑動)

2.為了後面操作方便,我們這裡還建立一個kafka的principle,當然你也可以到/var/run/cloudera-scm-agent/process目錄下去拿kafka使用者的principle。

[root@cdh01 shell]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  addprinc kafka/admin
WARNING: no policy specified for kafka/[email protected]; defaulting to no policy
Enter password for principal "kafka/[email protected]": 
Re-enter password for principal "kafka/[email protected]": 
Principal "kafka/[email protected]" created.
kadmin.local:

(可左右滑動)

5.Kafka的賦權測試


1.建立測試需要用到的client.properties和jaas.conf檔案

[root@cdh01 kafka]# cat jaas.conf 
KafkaClient {
   com.sun.security.auth.module.Krb5LoginModule required
   useTicketCache=true;
};
[root@cdh01 kafka]# cat client.properties 
security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka
group.id=testgroup

(可左右滑動)

這裡Fayson的jaas檔案沒有引入keytab,到時執行命令的時候需要先kinit,為什麼Kafka的Kerberos需要這2個檔案,可以參考Fayson之前的文章《如何通過Cloudera Manager為Kafka啟用Kerberos及使用

2.首先我們使用fayson使用者建立一個testTopic。

[root@cdh01 kafka]# kinit fayson
Password for [email protected]: 
[root@cdh01 kafka]# kafka-topics --create --zookeeper cdh01.fayson.com:2181 --replication-factor 3 --partitions 3 --topic testTopic
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Created topic "testTopic".

(可左右滑動)

注意:這裡Fayson並沒有使用管理員使用者kafka給fayson賦權“叢集”資源的許可權,但是fayson使用者依舊可以建立topic,包括刪除,這是CDH的中Kafka和Sentry許可權整合的bug,需要在後續版本才修復,目標版本是C6。

3.使用fayson使用者啟用producer指令碼命令。

[root@cdh01 kafka]# export KAFKA_OPTS="-Djava.security.auth.login.config=/data/disk1/_fayson/kafka/jaas.conf"
[root@cdh01 kafka]# kafka-console-producer --broker-list cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --topic testTopic --producer.config client.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 00:39:20 WARN producer.ProducerConfig: The configuration 'group.id' was supplied but isn't a known config.
2
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 2 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 6 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 8 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 9 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 10 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 11 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
18/06/13 00:39:22 WARN clients.NetworkClient: Error while fetching metadata with correlation id 12 : {testTopic=UNKNOWN_TOPIC_OR_PARTITION}
^C18/06/13 00:39:22 WARN kerberos.KerberosLogin: [Principal=null]: TGT renewal thread has been interrupted and will exit.

(可左右滑動)

報錯,無法produce到topic

4.我們給fayson使用者組賦權可以寫入資料到testTopic,注意需要使用管理員kafka使用者登入Kerberos才能進行操作

[root@cdh01 kafka]# kinit kafka/admin
Password for kafka/[email protected]: 
[root@cdh01 kafka]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: kafka/[email protected]
Valid starting       Expires              Service principal
06/13/2018 00:41:45  06/14/2018 00:41:45  krbtgt/[email protected]
        renew until 06/20/2018 00:41:45

(可左右滑動)

建立角色kafka_role

[root@cdh01 kafka]# kafka-sentry -cr -r kafka_role
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 00:43:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

(可左右滑動)

列出Sentry中的角色

[root@cdh01 kafka]# kafka-sentry -lr
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 00:44:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
fayson
hive_admin
admin
kafka_role
kafka_role1

(可左右滑動)

給kafka_role角色賦權可以給testTopic寫入許可權

[root@cdh01 kafka]# kafka-sentry -gpr -r kafka_role -p "Topic=testTopic->action=write"
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 00:45:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

(可左右滑動)

給kafka_role角色賦權可以給testTopic的describe許可權

[root@cdh01 kafka]# kafka-sentry -gpr -r kafka_role -p "Topic=testTopic->action=describe"
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 01:34:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

(可左右滑動)

把kafka_role加入到使用者組fayson中

[root@cdh01 kafka]# kafka-sentry -arg -r kafka_role -g fayson
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/libs/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/06/13 00:47:08 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

(可左右滑動)

再次使用fayson使用者登入Kerberos,啟用producer程式

[root@cdh01 kafka]# export KAFKA_OPTS="-Djava.security.auth.login.config=/data/disk1/_fayson/kafka/jaas.conf"
[root@cdh01 kafka]# kafka-console-producer --broker-list cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --topic testTopic --producer.config client.properties

(可左右滑動)

執行成功,說明賦權testTopic的寫入許可權成功。

5.使用fayson使用者啟動consumer程式

export KAFKA_OPTS="-Djava.security.auth.login.config=/data/disk1/_fayson/kafka/jaas.conf"
kafka-console-consumer --topic testTopic --from-beginning --bootstrap-server cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --consumer.config client.properties

(可左右滑動)

報錯沒有許可權

6.給kafka_role角色賦權consumer相關的許可權

kafka-sentry -gpr -r kafka_role -p "CONSUMERGROUP=testgroup->action=read"
kafka-sentry -gpr -r kafka_role -p "CONSUMERGROUP=testgroup->action=describe"
kafka-sentry -gpr -r kafka_role -p "Topic=testTopic->action=read"

(可左右滑動)

7.再次使用fayson使用者登入Kerberos後啟動producer和consumer

export KAFKA_OPTS="-Djava.security.auth.login.config=/data/disk1/_fayson/kafka/jaas.conf"
kafka-console-producer --broker-list cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --topic testTopic --producer.config client.properties

(可左右滑動)

export KAFKA_OPTS="-Djava.security.auth.login.config=/data/disk1/_fayson/kafka/jaas.conf"
kafka-console-consumer --topic testTopic --from-beginning --bootstrap-server cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --consumer.config client.properties

(可左右滑動)

消費成功,表明賦權消費者相關許可權以後,消費成功。

6.總結


1.通過Sentry可以對Kafka的topic進行許可權管理,主要是往topic寫入資料以及讀取topic的資料。

2.啟用Kafka的Sentry賦權,CDH叢集必須啟用Kerberos,另外對於Kafka服務也需要啟用Kerberos。

3.目前Kafka的授權,對於create和delete topic還不完善,需要等待後續版本。

4.如果只是測試系統,建議將Sentry許可權的cache重新整理間隔調低,Fayson這次測試由預設的30s改為了1ms,如果使用預設,將需要等待30s才能讓新的許可權生效。

5.在給Topic賦權read或者write許可權時,務必同時帶上describe許可權,否則許可權不生效。當然你也可以將許可權設定為ALL。

6.在給Topic的賦權read,即消費Topic的時候,client.properties必須帶上引數group.id,然後這個group.id的值必須也同樣賦權,如:

kafka-sentry -gpr -r kafka_role -p "CONSUMERGROUP=testgroup->action=ALL"

否則依舊無法消費Topic

7.一旦對Kafka啟用Sentry授權以後,kafka使用者就是管理員,一切管理員操作都需要使用kafka使用者來操作,這個與我們在Hive/Impala中使用Sentry時,hive使用者是管理員原理是一樣的,Fayson之前介紹Solr的Sentry賦權時,solr使用者就是預設管理員,也是一樣。

8.Fayson會在後續的文章繼續介紹Kafka的Host資源授權相關。

參考:

https://www.cloudera.com/documentation/kafka/latest/topics/kafka_security.html#using_kafka_with_sentry

叢集說明: 
叢集有wlint01、wlnamenode01、wldatanode001~wldatanode018一共20個節點, 
對應ip地址 192.168.32.9~192.168.32.28

1.生成keytab檔案 
生成http.keytab檔案

[wlbd@wlint01 keytabFile]$ sudo kadmin.local -q "xst -norandkey -k http.keytab HTTP/[email protected]"
[wlbd@wlint01 keytabFile]$ sudo kadmin.local -q "xst -norandkey -k http.keytab HTTP/[email protected]"
[wlbd@wlint01 keytabFile]$ for i in {1..9}; do sudo kadmin.local -q "xst -norandkey -k http.keytab HTTP/[email protected]"; done
[wlbd@wlint01 keytabFile]$ for i in {0..8}; do sudo kadmin.local -q "xst -norandkey -k http.keytab HTTP/[email protected]"; done
1
2
3
4
生成impala-unmerge.keytab檔案

[wlbd@wlint01 keytabFile]$ sudo kadmin.local -q "xst -norandkey -k impala-unmerge.keytab impala/[email protected]"
[wlbd@wlint01 keytabFile]$ sudo kadmin.local -q "xst -norandkey -k impala-unmerge.keytab impala/[email protected]"
[wlbd@wlint01 keytabFile]$ for i in {1..9}; do sudo kadmin.local -q "xst -norandkey -k impala-unmerge.keytab impala/[email protected]"; done
[wlbd@wlint01 keytabFile]$ for i in {0..8}; do sudo kadmin.local -q "xst -norandkey -k impala-unmerge.keytab impala/[email protected]"; done
1
2
3
4
將impala-unmerge.keytab和http.keytab合併成impala.keytab

[wlbd@wlint01 keytabFile]$ ktutil 
ktutil:  rkt http.keytab 
ktutil:  rkt impala-unmerge.keytab 
ktutil:  wkt impala.keytab 
ktutil:  quit
1
2
3
4
5
測試合併的impala.keytab檔案中的憑據是否有效

[wlbd@wlint01 keytabFile]$ klist -kte impala.keytab
1
將impala.keytab拷貝到每個節點的/etc/impala/conf下,並更改許可權

cp impala.keytab /etc/impala/conf/
cd /etc/impala/conf/
chmod 400 impala.keytab 
chown impala:impala impala.keytab
1
2
3
4
拷貝到每個節點可以用批處理進行

for i in {10..28}; do  scp impala.keytab 192.168.32.$i:/etc/impala/conf/; ssh 192.168.32.$i; "cd /etc/impala/conf/;  chmod 400 impala.keytab; chown impala:impala impala.keytab; exit"; done
1
接著,去到Cloudera Manager管理介面去修改Impala配置:Impala -> 配置 –> (類別)高階–>Impala Daemon 命令列引數高階配置程式碼段(安全閥) 
新增下面內容:

IMPALA_CATALOG_ARGS="-kerberos_reinit_interval=60"
IMPALA_SERVER_ARGS="-server_name=server1 -principal=impala/[email protected]"
IMPALA_STATE_STORE_ARGS ="-keytab_file=/etc/impala/conf/impala.keytab"
1
2
3

重啟過期配置

測試 
在Kerberos資料庫中建立一個使用者,並生成該使用者的keytab檔案

[wlbd@wlint01 ~]$ sudo kadmin.local -q "addprinc -randkey [email protected]"
[wlbd@wlint01 ~]$ sudo kadmin.local -q "xst -norandkey -k user1.keytab [email protected]"
[wlbd@wlint01 ~]$ kinit -kt user1.keytab [email protected]
1
2
3
重啟Impala之後,在Impala元件頁面點選”狀態”,會顯示進入impala-shell的命令:

impala-shell -i wldatanode004 -d default -k
1

其中引數表示為: 
-i 指定連線執行 impalad 守護程序的主機。預設埠是 21000。你可以連線到叢集中執行 impalad 的任意主機。假如你連線到 impalad 例項通過 –fe_port 標誌使用了其他埠,則應當同時提供埠號,格式為 hostname:port

-d 指定啟動後使用的資料庫,與建立連線後使用 USE 語句選擇資料庫作用相同,如果沒有指定,那麼使用 default 資料庫。

-k 當連線到 impalad 時使用 Kerberos 認證。如果要連線的 impalad 例項不支援 Kerberos,將顯示一個錯誤。 


2.Sentry服務下使用Impala 
在CDH中新增Sentry服務後,可以在Hive和Impala通過GRANT和REVOKE語句來設定許可權,然後兩個元件可以自動使用那些相同的許可權。 
在HIve CLI中建立兩個資料庫和相應的表

[wlbd@wlint01 keytabFile]$ kinit -kt hive.keytab hive/wlint01
[wlbd@wlint01 keytabFile]$ hive

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/jars/hive-common-1.1.0-cdh5.14.2.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> create database db1;
OK
Time taken: 1.942 seconds
1
2
3
4
5
6
7
8
在db1中建立table1

create table db1.table1 (
ip STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

load data local inpath '/app/wlbd/keytabFile/events.csv' overwrite into table db1.table1;
1
2
3
4
5
通過beeline賦予使用者許可權

beeline -u "jdbc:hive2://wlint01:10000/;principal=hive/[email protected]"
1
給user1賦予db1的所有許可權

create role user1_role;
GRANT ALL ON DATABASE db1 TO ROLE user1_role;
GRANT ROLE user1_role TO GROUP user1;
1
2
3
然後通過user1.keytab進入到impala-shell,進入後必須執行 invalidate metadata 才能看到剛剛建立的資料庫和表。

[wlbd@wlint01 keytabFile]$ kinit -kt user1.keytab user1
[wlbd@wlint01 keytabFile]$ impala-shell -i wldatanode004 -d default -k
Starting Impala Shell using Kerberos authentication
Using service name 'impala'
Connected to wldatanode004:21000
Server version: impalad version 2.11.0-cdh5.14.2 RELEASE (build ed85dce709da9557aeb28be89e8044947708876c)
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v2.11.0-cdh5.14.2 (ed85dce) built on Tue Mar 27 13:39:48 PDT 2018)

You can run a single query from the command line using the '-q' option.
***********************************************************************************
Query: use `default`
[wldatanode004:21000] > show databases;
Query: show databases
+------------------+----------------------------------------------+
| name             | comment                                      |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| default          | Default Hive database                        |
+------------------+----------------------------------------------+
Fetched 2 row(s) in 0.03s
[wldatanode004:21000] > invalidate metadata;
Query: invalidate metadata
Query submitted at: 2018-06-21 17:07:17 (Coordinator: http://wldatanode004:25000)
Query progress can be monitored at: http://wldatanode004:25000/query_plan?query_id=14491ddb95368a04:fcb124b000000000
Fetched 0 row(s) in 4.19s
[wldatanode004:21000] > show databases;
Query: show databases
+------------------+----------------------------------------------+
| name             | comment                                      |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| db1              |                                              |
| default          | Default Hive database                        |
+------------------+----------------------------------------------+
Fetched 3 row(s) in 0.03s
[wldatanode004:21000] > show tables in db1;
Query: show tables in db1
+--------+
| name   |
+--------+
| table1 |
+--------+
Fetched 1 row(s) in 0.03s
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
41
42
43
44
45
如果在db1新建立了table2這張表,可以通過 invalidate metadata db1.table2 進行更新;

[wldatanode004:21000] > invalidate metadata db1.table2;
Query: invalidate metadata db1.table2
Query submitted at: 2018-06-21 17:13:32 (Coordinator: http://wldatanode004:25000)
Query progress can be monitored at: http://wldatanode004:25000/query_plan?query_id=4e46f16a19e4b096:5fd05f8c00000000
Fetched 0 row(s) in 0.04s
[wldatanode004:21000] > show tables in db1;
Query: show tables in db1
+--------+
| name   |
+--------+
| table1 |
| table2 |
+--------+
Fetched 2 row(s) in 0.03s