在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