祗疼妳一个 发表于 2024-11-1 22:16:03

Kerberos安全认证-连载10-Hive Kerberos 安全设置及访问_idea毗连 kerberos

​​​​​​​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安全认证。
#切换zhangsan用户,查看kerberos认证主体,目前没有认证
# su zhangsan
$ cd
$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1003)

#进行zhangsan主体认证
$ kinit zhangsan
Password for zhangsan@EXAMPLE.COM: 123456
$ klist
Ticket cache: FILE:/tmp/krb5cc_1003
Default principal: zhangsan@EXAMPLE.COM

#登录并操作Hive,需要先在node1 hive服务端启动metastore服务。
$ 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:)
1.Hive 设置 Kerberos

Hive设置Kerberos的条件是Hadoop需要设置Kerberos,这里已经在Hadoop集群中设置了Kerberos。按照如下步调进行Hive利用Kerberos设置即可。
1) 创建hive用户并设置组
在Hadoop集群中操作不同的服务有不同的用户,这里利用hive用户操作hive。在node1~node5全部hadoop节点上创建hive用户(非hive服务端和客户端也需要创建),后续执行HQL时会转换成MR使命执行于各个NodeManager节点,以是这里在全部集群节点中创建hive用户并设置所属组为hadoop。
#node1~node5所有节点执行命令创建hive用户,设置密码为123456
useradd hive -g hadoop
passwd hive
留意:创建hive用户以后,最好重启下HDFS集群,否则后续利用hive用户执行SQL时没有操作目录的权限。
2) 创建Hive服务的Princial主体
在kerberos 服务端执行如下下令,创建Hive服务的kerberos Princial主体,然后将服务主体写入keytab文件。
#在kerberos 服务端node1节点执行如下命令
# kadmin.local -q "addprinc -pw 123456 hive/node1"

#将hive服务主体写入keytab文件
# 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节点
# 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,向该设置中追加如下设置:
<!-- 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>
​​​​​​​5) 修改Hadoop core-site.xml
修改core-site.xml中相干代理设置为hive代理用户,node1~node5节点core-site.xml中修改如下设置项:
    <!-- 允许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>
以上设置分发到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
# zkServer.sh start
# zkServer.sh start
# zkServer.sh start
# start-all.sh

#在Hive服务端node1节点启动Hive Metastore,这里可以切换成Hive用户,也可以不切换
# su hive
$ hive --service metastore &
在Hive客户端node3节点上登录hive客户端:
#需要切换用户为hive,其他用户没有操作hql底层转换成mr操作的目录权限
# su hive
$ cd

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

#登录hive,建表、插入数据及查询
$ 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节点准备如下文件及数据
$ 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
$ hiveserver2
​​​​​​​​​​​​​​2) 在Hive客户端执行beeline登录hive
#在hive 客户端通过beeline登录hive
$ 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
$ 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节点执行如下命令
# su hive
$ hiveserver2
​​​​​​​​​​​​​​3) 编写JDBC访问Hive代码
/**
* 通过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();
      }

    }
}
以上代码需要在项目maven pom.xml文件中加入如下依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.3</version>
</dependency>
以上代码运行结果如下:
1,zs,18
2,ls,19
3,ww,20
​​​​​​​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依赖中导入如下依赖包:
<!-- 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>
<!-- SparkSQLONHive-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.4.0</version>
</dependency>
​​​​​​​​​​​​​​4) 编写SparkSQL读取Hive代码
/**
* 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();
      
    }
}
以上代码编写完成后执行可以查询hive表中对应的数据。
​​​​​​​​​​​​​​6. Flink访问Kerberos认证Hive

Flink读取Kerberos认证Hive也需要进行认证,这里以FlinkSQL读取Hive中数据为例来演示,步调如下。
1) 准备krb5.conf及keytab文件

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Kerberos安全认证-连载10-Hive Kerberos 安全设置及访问_idea毗连 kerberos