目錄
1.Hive 配置 Kerberos
2.?Hive Cli使用Kerberos
???????3.?Hive beeline使用Kerberos
??????????????4.?JDBC訪問Kerberos認(rèn)證Hive
???????5.?Spark訪問Kerberos認(rèn)證Hive
??????????????6.?Flink訪問Kerberos認(rèn)證Hive
技術(shù)連載系列,前面內(nèi)容請參考前面連載9內(nèi)容:???????Kerberos安全認(rèn)證-連載9-訪問Kerberos安全認(rèn)證Hadoop_IT貧道的博客-CSDN博客
Hive底層數(shù)據(jù)存儲在HDFS中,HQL執(zhí)行默認(rèn)會轉(zhuǎn)換成MR執(zhí)行在Yarn中,當(dāng)HDFS配置了Kerberos安全認(rèn)證時,只對HDFS進行認(rèn)證是不夠的,因為Hive作為數(shù)據(jù)倉庫基礎(chǔ)架構(gòu)也需要訪問HDFS上的數(shù)據(jù)。因此,為了確保整個大數(shù)據(jù)環(huán)境的安全性,Hive也需要配置Kerberos安全認(rèn)證,這樣可以控制對Hive和底層HDFS數(shù)據(jù)的訪問權(quán)限,防止未經(jīng)授權(quán)的訪問和操作,確保數(shù)據(jù)的安全性。
目前對HDFS進行了Kerberos安全認(rèn)證后,在Hive客戶端雖然進行了用戶主體認(rèn)證,但在操作Hive時也不能正常操作Hive,需要對Hive進行kerberos安全認(rèn)證。
#切換zhangsan用戶,查看kerberos認(rèn)證主體,目前沒有認(rèn)證
[root@node3 ~]# su zhangsan
[zhangsan@node3 root]$ cd
[zhangsan@node3 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1003)
#進行zhangsan主體認(rèn)證
[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服務(wù)端啟動metastore服務(wù)。
[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])
1.Hive 配置 Kerberos
Hive配置Kerberos的前提是Hadoop需要配置Kerberos,這里已經(jīng)在Hadoop集群中配置了Kerberos。按照如下步驟進行Hive使用Kerberos配置即可。
1) 創(chuàng)建hive用戶并設(shè)置組
在Hadoop集群中操作不同的服務(wù)有不同的用戶,這里使用hive用戶操作hive。在node1~node5所有hadoop節(jié)點上創(chuàng)建hive用戶(非hive服務(wù)端和客戶端也需要創(chuàng)建),后續(xù)執(zhí)行HQL時會轉(zhuǎn)換成MR任務(wù)執(zhí)行于各個NodeManager節(jié)點,所以這里在所有集群節(jié)點中創(chuàng)建hive用戶并設(shè)置所屬組為hadoop。
#node1~node5所有節(jié)點執(zhí)行命令創(chuàng)建hive用戶,設(shè)置密碼為123456
useradd hive -g hadoop
passwd hive
注意:創(chuàng)建hive用戶以后,最好重啟下HDFS集群,否則后續(xù)使用hive用戶執(zhí)行SQL時沒有操作目錄的權(quán)限。
2) 創(chuàng)建Hive服務(wù)的Princial主體
在kerberos 服務(wù)端執(zhí)行如下命令,創(chuàng)建Hive服務(wù)的kerberos Princial主體,然后將服務(wù)主體寫入keytab文件。
#在kerberos 服務(wù)端node1節(jié)點執(zhí)行如下命令
[root@node1 ~]# kadmin.local -q "addprinc -pw 123456 hive/node1"
#將hive服務(wù)主體寫入keytab文件
[root@node1 ~]# kadmin.local -q "ktadd -norandkey -kt /home/keytabs/hive.service.keytab hive/node1@EXAMPLE.COM"
以上命令執(zhí)行后,可以在node1節(jié)點的/home/keytabs目錄下看到生成對應(yīng)的hive.server.keytab文件。
3) 分發(fā)keytab文件并修改所屬用戶和組
將生成的hive服務(wù)對應(yīng)的keytab密鑰文件發(fā)送到hive服務(wù)端和客戶端,這里node1為hive服務(wù)端,只需要發(fā)送到hive客戶端node3節(jié)點即可。
#發(fā)送keytab 到node3節(jié)點
[root@node1 ~]# scp /home/keytabs/hive.service.keytab node3:/home/keytabs/
#在node1、node3兩個節(jié)點修改keytab所屬用戶和組
chown root:hadoop /home/keytabs/hive.service.keytab
chmod 770 /home/keytabs/hive.service.keytab
4)?修改hive-site.xml配置文件
在hive服務(wù)端和客戶端配置hive-site.xml,向該配置中追加如下配置:
<!-- hiveserver2 支持kerberos認(rèn)證 -->
<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認(rèn)證 -->
<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中相關(guān)代理配置為hive代理用戶,node1~node5節(jié)點core-site.xml中修改如下配置項:
<!-- 允許hive用戶在任意主機節(jié)點代理任意用戶和任意組 -->
<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>
以上配置分發(fā)到Hadoop各個集群節(jié)點后,需要重新啟動HDFS。
6) hive conf中準(zhǔn)備hdfs-site.xml和core-site.xml
將hdfs配置文件hdfs-site.xml,core-site.xml 發(fā)送到客戶端和服務(wù)端HIVE_HOME/conf/目錄中。
??????????????2.?Hive Cli使用Kerberos
使用Hive Client操作Kerberos需要首先啟動HDFS,然后在Hive服務(wù)端啟動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服務(wù)端node1節(jié)點啟動Hive Metastore,這里可以切換成Hive用戶,也可以不切換
[root@node1 ~]# su hive
[hive@node1 ~]$ hive --service metastore &
在Hive客戶端node3節(jié)點上登錄hive客戶端:
#需要切換用戶為hive,其他用戶沒有操作hql底層轉(zhuǎn)換成mr操作的目錄權(quán)限
[root@node3 ~]# su hive
[hive@node3 root]$ cd
#進行節(jié)點認(rèn)證kerberos
[hive@node3 ~]$ kinit hive/node1
Password for hive/node1@EXAMPLE.COM:123456
#登錄hive,建表、插入數(shù)據(jù)及查詢
[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節(jié)點準(zhǔn)備如下文件及數(shù)據(jù)
[hive@node3 ~]$ cat /home/hive/person.txt
2 ls 19
3 ww 20
#在hive客戶端將以上文件數(shù)據(jù)加載到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服務(wù)端啟動hiveserver2???????
#啟動hiveserver2
[hive@node1 root]$ hiveserver2
??????????????2)?在Hive客戶端執(zhí)行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認(rèn)證的hive都需要指定principal參數(shù)。
??????????????4.?JDBC訪問Kerberos認(rèn)證Hive
在IDEA中使用JDBC方式讀取Kerberos認(rèn)證Hive時需要指定krb5.conf文件、Principal主體、keytab密鑰文件,然后在代碼中進行設(shè)置即可JDBC方式訪問Kerberos認(rèn)證的Hive。具體操作步驟如下:
1) 準(zhǔn)備krb5.conf及keytab文件
在node1 kerberos服務(wù)端將/etc/krb5.conf文件放在window固定路徑中,同時將hive主體對應(yīng)的keytab密鑰文件放在windows固定路徑中。
2) 啟動HiveServer2
需要在Hive服務(wù)端啟動HiveServer2服務(wù):
#在Hive服務(wù)端node1節(jié)點執(zhí)行如下命令
[root@node1 ~]# su hive
[hive@node1 root]$ hiveserver2
??????????????3)?編寫JDBC訪問Hive代碼
/**
* 通過JDBC方式讀取Kerberos認(rèn)證Hive的數(shù)據(jù)
*/
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.設(shè)置Kerberos認(rèn)證
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.創(chuàng)建Hive連接
Connection connection = DriverManager.getConnection(jdbcURL, "", "");
// 5.執(zhí)行Hive查詢
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SELECT id,name,age FROM person");
// 6.處理查詢結(jié)果
while (rs.next()) {
System.out.println(rs.getInt(1) + "," +
rs.getString(2)+ "," +
rs.getInt(3)) ;
}
// 7.關(guān)閉連接
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>
以上代碼運行結(jié)果如下:
1,zs,18
2,ls,19
3,ww,20
???????5.?Spark訪問Kerberos認(rèn)證Hive
這里是通過SparkSQL來讀取Kerberos認(rèn)證Hive中的數(shù)據(jù),按照如下步驟配置即可。
1) 準(zhǔn)備krb5.conf及keytab文件
在node1 kerberos服務(wù)端將/etc/krb5.conf文件放在window固定路徑中,同時將hive主體對應(yīng)的keytab密鑰文件放在windows固定路徑中。這里項目中已經(jīng)有了,可以忽略。
2) 準(zhǔn)備訪問Hive需要的資源文件
將HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml文件及Hive客戶端配置hive-site.xml上傳到項目resources資源目錄中。
3) 準(zhǔn)備Maven項目依賴
在IDEA項目中將hive-jdbc依賴進行注釋,該包與SparkSQL讀取Hive中的數(shù)據(jù)的包有沖突,向maven依賴中導(dǎo)入如下依賴包:
<!-- 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>
??????????????4)?編寫SparkSQL讀取Hive代碼
/**
* Spark 讀取Kerberos認(rèn)證Hive的數(shù)據(jù)
*/
public class SparkReadAuthHive {
public static void main(String[] args) throws IOException {
//進行kerberos認(rèn)證
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();
}
}
以上代碼編寫完成后執(zhí)行可以查詢hive表中對應(yīng)的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-642487.html
??????????????6.?Flink訪問Kerberos認(rèn)證Hive
Flink讀取Kerberos認(rèn)證Hive也需要進行認(rèn)證,這里以FlinkSQL讀取Hive中數(shù)據(jù)為例來演示,步驟如下。
1) 準(zhǔn)備krb5.conf及keytab文件
在node1 kerberos服務(wù)端將/etc/krb5.conf文件放在window固定路徑中,同時將hive主體對應(yīng)的keytab密鑰文件放在windows固定路徑中。這里項目中已經(jīng)有了,可以忽略。
2) 準(zhǔn)備訪問Hive需要的資源文件
將HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml文件及Hive客戶端配置hive-site.xml上傳到項目resources資源目錄中。這里項目中已經(jīng)有了,可以忽略。
3) 準(zhǔn)備Maven項目依賴
在IDEA項目中引入如下Flink依賴包:
<!-- Flink 讀取Hive表數(shù)據(jù)需要依賴 -->
<!-- Flink批和流開發(fā)依賴包 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.16.0</version>
</dependency>
<!-- Flink Dependency -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-hive_2.12</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>1.16.0</version>
</dependency>
<!-- Hive Dependency -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.3</version>
</dependency>
注意:Spark操作Hive依賴與Flink操作Hive依賴也有沖突,這里由于把代碼放在一個項目中,所以執(zhí)行Spark或者Flink代碼時把對方依賴注釋掉即可。
4) 編寫FlinkSQL讀取Hive代碼
/**
* Spark 讀取Kerberos認(rèn)證Hive的數(shù)據(jù)
*/
public class SparkReadAuthHive {
public static void main(String[] args) throws IOException {
//進行kerberos認(rèn)證
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();
}
}
以上代碼編寫完成后執(zhí)行可以查詢hive表中對應(yīng)的數(shù)據(jù)。
歡迎點贊、評論、收藏,關(guān)注IT貧道,獲取IT技術(shù)知識!文章來源地址http://www.zghlxwxcb.cn/news/detail-642487.html
到了這里,關(guān)于Kerberos安全認(rèn)證-連載10-Hive Kerberos 安全配置及訪問的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!