3. Hive beeline使用Kerberos 4. JDBC访问Kerberos认证Hive 5. Spark访问Kerberos认证Hive 6. Flink访问Kerberos认证Hive 技术连载系列,前面内容请参考前面连载9内容:Kerberos安全认证-连载9-访问Kerberos安全认证Hadoop_IT贫道的博客-CSDN博客 Hive底层数据存储在HDFS中,HQL执行默认会转换成MR执行在Yarn中,当HDFS配置了Kerberos安全认证时,只对HDFS进行认证是不够的,因为Hive作为数据仓库基础架构也需要访问HDFS上的数据。因此,为了确保整个大数据环境的安全性,Hive也需要配置Kerberos安全认证,这样可以控制对Hive和底层HDFS数据的访问权限,防止未经授权的访问和操作,确保数据的安全性。 目前对HDFS进行了Kerberos安全认证后,在Hive客户端虽然进行了用户主体认证,但在操作Hive时也不能正常操作Hive,需要对Hive进行kerberos安全认证。 [code]#切换zhangsan用户,查看kerberos认证主体,目前没有认证 [root@node3 ~]# su zhangsan [zhangsan@node3 root]$ cd [zhangsan@node3 ~]$ klist klist: No credentials cache found (filename: /tmp/krb5cc_1003) #进行zhangsan主体认证 [zhangsan@node3 root]$ kinit zhangsan Password for zhangsan@EXAMPLE.COM: 123456 [zhangsan@node3 ~]$ klist Ticket cache: FILE:/tmp/krb5cc_1003 Default principal: zhangsan@EXAMPLE.COM #登录并操作Hive,需要先在node1 hive服务端启动metastore服务。 [zhangsan@node3 ~]$ hive hive> create table test (id int,name string,age int ) row format delimited fields terminated by '\t'; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.io.IOException Dest Host:destPort node1:8020 , LocalHost:localPort node1/192.168.179.4:0. Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]) [/code]1.Hive 配置 KerberosHive配置Kerberos的前提是Hadoop需要配置Kerberos,这里已经在Hadoop集群中配置了Kerberos。按照如下步骤进行Hive使用Kerberos配置即可。 1) 创建hive用户并设置组 在Hadoop集群中操作不同的服务有不同的用户,这里使用hive用户操作hive。在node1~node5所有hadoop节点上创建hive用户(非hive服务端和客户端也需要创建),后续执行HQL时会转换成MR任务执行于各个NodeManager节点,所以这里在所有集群节点中创建hive用户并设置所属组为hadoop。 [code]#node1~node5所有节点执行命令创建hive用户,设置密码为123456 useradd hive -g hadoop passwd hive [/code]注意:创建hive用户以后,最好重启下HDFS集群,否则后续使用hive用户执行SQL时没有操作目录的权限。 2) 创建Hive服务的Princial主体 在kerberos 服务端执行如下命令,创建Hive服务的kerberos Princial主体,然后将服务主体写入keytab文件。 [code]#在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" [/code]以上命令执行后,可以在node1节点的/home/keytabs目录下看到生成对应的hive.server.keytab文件。 3) 分发keytab文件并修改所属用户和组 将生成的hive服务对应的keytab密钥文件发送到hive服务端和客户端,这里node1为hive服务端,只需要发送到hive客户端node3节点即可。 [code]#发送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 [/code]4) 修改hive-site.xml配置文件 在hive服务端和客户端配置hive-site.xml,向该配置中追加如下配置: [code]<!-- hiveserver2 支持kerberos认证 --> <property> <name>hive.server2.authentication</name> <value>KERBEROS</value> </property> <!-- hiveserver2 kerberos主体 --> <property> <name>hive.server2.authentication.kerberos.principal</name> <value>hive/node1@EXAMPLE.COM</value> </property> <!-- hiveserver2 keytab密钥文件路径 --> <property> <name>hive.server2.authentication.kerberos.keytab</name> <value>/home/keytabs/hive.service.keytab</value> </property> <!-- hivemetastore 开启kerberos认证 --> <property> <name>hive.metastore.sasl.enabled</name> <value>true</value> </property> <!-- metastore kerberos主体 --> <property> <name>hive.metastore.kerberos.principal</name> <value>hive/node1@EXAMPLE.COM</value> </property> <!-- metastore keytab密钥文件路径 --> <property> <name>hive.metastore.kerberos.keytab.file</name> <value>/home/keytabs/hive.service.keytab</value> </property> [/code]5) 修改Hadoop core-site.xml 修改core-site.xml中相关代理配置为hive代理用户,node1~node5节点core-site.xml中修改如下配置项: [code] <!-- 允许hive用户在任意主机节点代理任意用户和任意组 --> <property> <name>hadoop.proxyuser.hive.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hive.users</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hive.groups</name> <value>*</value> </property> [/code]以上配置分发到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,操作如下: [code]#启动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 & [/code]在Hive客户端node3节点上登录hive客户端: [code]#需要切换用户为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 [/code]3. Hive beeline使用Kerberos除了在hive客户端操作Hive外,还可以通过beeline方式操作Hive,具体步骤如下: 1) 在Hive服务端启动hiveserver2 [code]#启动hiveserver2 [hive@node1 root]$ hiveserver2 [/code]2) 在Hive客户端执行beeline登录hive [code]#在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" [/code]注意:无论使用哪种方式通过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服务: [code]#在Hive服务端node1节点执行如下命令 [root@node1 ~]# su hive [hive@node1 root]$ hiveserver2 [/code]3) 编写JDBC访问Hive代码 [code]/** * 通过JDBC方式读取Kerberos认证Hive的数据 */ public class JDBCReadAuthHive { // Kerberos主体 static final String principal = "hive/node1@EXAMPLE.COM"; // Kerberos配置文件路径 static final String krb5FilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\krb5.conf"; // Keytab文件路径 static final String keytabFilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab"; public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException { // 1.加载Kerberos配置文件 System.setProperty("java.security.krb5.conf", krb5FilePath); // 2.设置Kerberos认证 Configuration configuration = new Configuration(); configuration.set("hadoop.security.authentication", "kerberos"); UserGroupInformation.setConfiguration(configuration); UserGroupInformation.loginUserFromKeytab(principal, keytabFilePath); // 3.JDBC连接字符串 String jdbcURL = "jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM"; Class.forName("org.apache.hive.jdbc.HiveDriver"); try { // 4.创建Hive连接 Connection connection = DriverManager.getConnection(jdbcURL, "", ""); // 5.执行Hive查询 Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery("SELECT id,name,age FROM person"); // 6.处理查询结果 while (rs.next()) { System.out.println(rs.getInt(1) + "," + rs.getString(2)+ "," + rs.getInt(3)) ; } // 7.关闭连接 rs.close(); statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } [/code]以上代码需要在项目maven pom.xml文件中加入如下依赖: [code]<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.3</version> </dependency> [/code]以上代码运行结果如下: [code]1,zs,18 2,ls,19 3,ww,20 [/code]5. Spark访问Kerberos认证Hive这里是通过SparkSQL来读取Kerberos认证Hive中的数据,按照如下步骤配置即可。 1) 准备krb5.conf及keytab文件 在node1 kerberos服务端将/etc/krb5.conf文件放在window固定路径中,同时将hive主体对应的keytab密钥文件放在windows固定路径中。这里项目中已经有了,可以忽略。 2) 准备访问Hive需要的资源文件 将HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml文件及Hive客户端配置hive-site.xml上传到项目resources资源目录中。 3) 准备Maven项目依赖 在IDEA项目中将hive-jdbc依赖进行注释,该包与SparkSQL读取Hive中的数据的包有冲突,向maven依赖中导入如下依赖包: [code]<!-- Spark-core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.4.0</version> </dependency> <!-- SparkSQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.4.0</version> </dependency> <!-- SparkSQL ON Hive--> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.12</artifactId> <version>3.4.0</version> </dependency> [/code]4) 编写SparkSQL读取Hive代码 [code]/** * Spark 读取Kerberos认证Hive的数据 */ public class SparkReadAuthHive { public static void main(String[] args) throws IOException { //进行kerberos认证 System.setProperty("java.security.krb5.conf", "D:\\idea_space\\KerberosAuth\\KerberosAuthHDFS\\src\\main\\resources\\krb5.conf"); String principal = "hive/node1@EXAMPLE.COM"; String keytabPath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab"; UserGroupInformation.loginUserFromKeytab(principal, keytabPath); SparkSession spark = SparkSession.builder().appName("SparkReadAuthHive") .master("local") // .config("hive.metastore.uris", "thrift://node1:9083") .enableHiveSupport() .getOrCreate(); spark.sql("select * from person").show(); spark.stop(); } } [/code]以上代码编写完成后执行可以查询hive表中对应的数据。 6. Flink访问Kerberos认证HiveFlink读取Kerberos认证Hive也需要进行认证,这里以FlinkSQL读取Hive中数据为例来演示,步骤如下。 1) 准备krb5.conf及keytab文件 免责声明:本内容来源于网络,如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |