在kerberos 服务端执行如下命令,创建Hive服务的kerberos Princial主体,然后将服务主体写入keytab文件。

#在kerberos 服务端node1节点执行如下命令
[root@node1 ~]# kadmin.local -q “addprinc -pw 123456 hive/node1”

#将hive服务主体写入keytab文件
[root@node1 ~]# kadmin.local -q “ktadd -norandkey -kt /home/keytabs/hive.service.keytab hive/node1@EXAMPLE.COM”

以上命令执行后,可以在node1节点的/home/keytabs目录下看到生成对应的hive.server.keytab文件。

3) 分发keytab文件并修改所属用户和组

将生成的hive服务对应的keytab密钥文件发送到hive服务端和客户端,这里node1为hive服务端,只需要发送到hive客户端node3节点即可。

#发送keytab 到node3节点
[root@node1 ~]# scp /home/keytabs/hive.service.keytab node3:/home/keytabs/

#在node1、node3两个节点修改keytab所属用户和组
chown root:hadoop /home/keytabs/hive.service.keytab
chmod 770 /home/keytabs/hive.service.keytab

4) 修改hive-site.xml配置文件

在hive服务端和客户端配置hive-site.xml,向该配置中追加如下配置:


hive.server2.authentication KERBEROS hive.server2.authentication.kerberos.principal hive/node1@EXAMPLE.COM hive.server2.authentication.kerberos.keytab /home/keytabs/hive.service.keytab hive.metastore.sasl.enabled true hive.metastore.kerberos.principal hive/node1@EXAMPLE.COM hive.metastore.kerberos.keytab.file /home/keytabs/hive.service.keytab

5) 修改Hadoop core-site.xml

修改core-site.xml中相关代理配置为hive代理用户,node1~node5节点core-site.xml中修改如下配置项:


hadoop.proxyuser.hive.hosts * hadoop.proxyuser.hive.users * hadoop.proxyuser.hive.groups *

以上配置分发到Hadoop各个集群节点后,需要重新启动HDFS。

6) hive conf中准备hdfs-site.xml和core-site.xml

将hdfs配置文件hdfs-site.xml,core-site.xml 发送到客户端和服务端HIVE_HOME/conf/目录中。

2. Hive Cli使用Kerberos

使用Hive Client操作Kerberos需要首先启动HDFS,然后在Hive服务端启动Hive Metastore,操作如下:

#启动zookeeper及HDFS
[root@node3 ~]# zkServer.sh start
[root@node4 ~]# zkServer.sh start
[root@node5 ~]# zkServer.sh start
[root@node1 ~]# start-all.sh

#在Hive服务端node1节点启动Hive Metastore,这里可以切换成Hive用户,也可以不切换
[root@node1 ~]# su hive
[hive@node1 ~]$ hive --service metastore &

在Hive客户端node3节点上登录hive客户端:

#需要切换用户为hive,其他用户没有操作hql底层转换成mr操作的目录权限
[root@node3 ~]# su hive
[hive@node3 root]$ cd

#进行节点认证kerberos
[hive@node3 ~]$ kinit hive/node1
Password for hive/node1@EXAMPLE.COM:123456

#登录hive,建表、插入数据及查询
[hive@node3 ~]$ hive
hive> create table person (id int,name string,age int ) row format delimited fields terminated by ‘\t’;
OK
Time taken: 0.236 seconds
hive> insert into person values (1,‘zs’,18);

hive> select * from person;
OK
1 zs 18

#在node3节点准备如下文件及数据
[hive@node3 ~]$ cat /home/hive/person.txt
2 ls 19
3 ww 20

#在hive客户端将以上文件数据加载到hive person表中,操作如下
hive> load data local inpath ‘/home/hive/person.txt’ into table person;
hive> select * from person;
OK
1 zs 18
2 ls 19
3 ww 20

3. Hive beeline使用Kerberos

除了在hive客户端操作Hive外,还可以通过beeline方式操作Hive,具体步骤如下:

1) 在Hive服务端启动hiveserver2

#启动hiveserver2
[hive@node1 root]$ hiveserver2

2) 在Hive客户端执行beeline登录hive

#在hive 客户端通过beeline登录hive
[hive@node3 ~]$ beeline
beeline> !connect jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM

0: jdbc:hive2://node1:10000/default> select * from person;
±-----------±-------------±------------+
| person.id | person.name | person.age |
±-----------±-------------±------------+
| 1 | zs | 18 |
| 2 | ls | 19 |
| 3 | ww | 20 |
±-----------±-------------±------------+

#也可以通过以下方式通过beeline直接操作hive
[hive@node3 ~]$ beeline -u “jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM”

注意:无论使用哪种方式通过beeline连接hive,针对kerberos认证的hive都需要指定principal参数。

4. JDBC访问Kerberos认证Hive

在IDEA中使用JDBC方式读取Kerberos认证Hive时需要指定krb5.conf文件、Principal主体、keytab密钥文件,然后在代码中进行设置即可JDBC方式访问Kerberos认证的Hive。具体操作步骤如下:

1) 准备krb5.conf及keytab文件

在node1 kerberos服务端将/etc/krb5.conf文件放在window固定路径中,同时将hive主体对应的keytab密钥文件放在windows固定路径中。

2) 启动HiveServer2

需要在Hive服务端启动HiveServer2服务:

#在Hive服务端node1节点执行如下命令
[root@node1 ~]# su hive
[hive@node1 root]$ hiveserver2