參考資料:https://prestodb.io/docs/current/connector/hive.html
前言
presto支持hive connector,並支持連接多個hive connector,還支持kerberos相關
配置
普通配置
我們在etc目錄下創建catalog目錄,然後再下面創建hive.propertoes 文件,代表着我們創建了一個hive的catalog,hive.propertoes的配置如下
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
connector.name — 這個是固定的,只要是hive的connector名字就爲hive-hadoop2
然後再配置元數據服務的URL 和hadoop的core-site.xml 和 hdfs-site.xml到每一個presto節點
最後需要注意的是
由於沒有kerberos認證,我們登陸hive用的用戶名將會是啓動presto進程的用戶。如過我們想修改此,我們可以在jvm.config中添加
-DHADOOP_USER_NAME=hadoop
來將訪問hive的用戶改爲hadoop用戶
kerberos配置
kerberos相關的配置參考下面這篇文章
https://prestodb.io/docs/current/connector/hive-security.html
其實相當於多了幾個配置,對於hive的配置有了解基本上看了配置就懂得了相關的含義。
- 1、krb5.conf
如果krb5.conf在/etc目錄下面,那麼這個可以不需要配置,如果不在,那麼需要在jvm.config中顯示的配置如下所示
-Djava.security.krb5.conf=/example/path/krb5.conf
- 2、應對hive metatstore 相關的kerberos配置
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=ms/[email protected]
[email protected]
hive.metastore.client.keytab=/opt/beh/metadata/key/test001.ketab
hive.metastore.service.principal ---- 這個是在hive-site.xml中配置的hive服務端的priciple。這裏好的是,presto支持_HOST這種形式,很方便
[email protected]
hive.metastore.client.keytab=/opt/beh/metadata/key/test001.keytab
這兩個就是當前presto用戶的kerberos 相關信息了
- 3、hdfs相關的kerberos驗證
hive.hdfs.authentication.type=KERBEROS
#hive.hdfs.impersonation.enabled=true
[email protected]
hive.hdfs.presto.keytab=/opt/beh/metadata/key/test001.keytab
hive.hdfs.impersonation.enabled=true ------------------這個配置我先註釋了,具體還沒有搞懂,因爲我發現註釋了他對於我後續測試和驗證沒有影響,這個後續再說吧。
[email protected]
hive.hdfs.presto.keytab=/opt/beh/metadata/key/test001.keytab
這兩個就是當前presto用戶的kerberos 相關信息了
最後說一句,keytab文件必須在每個節點分發,在相同的位置,而且有正確的權限。
最終我在hive.properties裏面的配置如下
connector.name=hive-hadoop2
hive.metastore.uri=thrift://hadooptd3.novalocal:9083
hive.config.resources=/opt/beh/core/hadoop/etc/hadoop/hdfs-site.xml
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=ms/[email protected]
[email protected]
hive.metastore.client.keytab=/opt/beh/metadata/key/test001.ketab
hive.hdfs.authentication.type=KERBEROS
#hive.hdfs.impersonation.enabled=true
[email protected]
hive.hdfs.presto.keytab=/opt/beh/metadata/key/test001.ketab
JDBC訪問
注意
不管是普通的presto的hive connector還是kerberos的hive connector,我們使用cli 和jdbc的方式是一樣的,jdbc訪問的URL方式也是一樣的(推測應該是kerberos已經在配置文件裏面配置了,所以無需在jdbc方式使用)
JDBC方式
pom配置
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.237</version>
</dependency>
沒啥好說的 直接上樣例代碼吧
參考文檔:https://prestodb.io/docs/current/installation/jdbc.html
public class PrestoJdbc {
private static String CONNECTION_URL = "jdbc:presto://****:16001/test001/test";
public static void main(String[] args) throws SQLException{
Connection connection = DriverManager.getConnection(CONNECTION_URL, "hadoop", "");
ResultSet resultSet = connection.prepareStatement("select * from deoiuytdemo").executeQuery();
while (resultSet.next()) {
String str = resultSet.getString(1);
System.out.println(str);
}
connection.close();
}
}
多租戶方案探究
看官網說可以連接多個hive源,那麼這麼來說肯定也可以以不同的租戶連接同一個hive源了。
然後我在上述test001租戶下,又創建了dev001.properties 相當於創建了一個dev001的catalog
connector.name=hive-hadoop2
hive.metastore.uri=thrift://hadooptd3.novalocal:9083
hive.config.resources=/opt/beh/core/hadoop/etc/hadoop/hdfs-site.xml
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=ms/[email protected]
[email protected]
hive.metastore.client.keytab=/opt/beh/metadata/key/dev001.ketab
hive.hdfs.authentication.type=KERBEROS
#hive.hdfs.impersonation.enabled=true
[email protected]
hive.hdfs.presto.keytab=/opt/beh/metadata/key/dev001.ketab
然後使用jdbc測試,也是沒問題的,相當於用dev001 租戶創建和訪問表。
那麼這種情景就在後續提供了一種多租戶方案,相當於不同的租戶可以訪問不同的database下的表(一般多租戶方案就是一個租戶對應一個hive database),
相對來說就很方便了很多。