創建了包含Trino服務的集群后,如果您需要進行復雜的數據查詢、分析和處理操作,或者需要將查詢結果集成到Java應用程序中,則可以使用Trino提供的JDBC Driver連接數據庫。
在Maven中引入JDBC Driver
您需要根據您的E-MapReduce集群版本,在pom.xml文件中添加相應的依賴來引入Presto或Trino JDBC Driver。
EMR版本 | 組件版本 | JDBC Driver | Driver類名 |
| 3XX |
| io.trino.jdbc.TrinoDriver |
| 3XX |
| io.prestosql.jdbc.PrestoDriver |
其他EMR版本 | 0.2XX |
| com.facebook.presto.jdbc.PrestoDriver |
連接數據庫
當EMR集群為EMR-3.38.0及以上版本或EMR-5.5.0及以上版本時,您可以通過如下JDBC URL,使用JDBC Driver連接數據庫。
jdbc:trino://<COORDINATOR>:<PORT>/[CATALOG]/[SCHEMA]
其中,各參數含義如下:
<COORDINATOR>
:指定Trino集群中主節點的名稱或IP地址。<PORT>
:指定Trino服務的端口號。[CATALOG]
:可選項,指定要連接的Trino數據庫的Catalog名稱。[SCHEMA]
:可選項,指定要連接的Trino數據庫的Schema名稱。
連接示例如下所示。
jdbc:trino://<主節點名稱>:9090 # 連接數據庫,使用默認的Catalog和Schema。 jdbc:trino://<主節點名稱>:9090/hive # 連接數據庫,使用名為hive的Catalog和默認的Schema。 jdbc:trino://<主節點名稱>:9090/hive/default # 連接數據庫,使用名為hive的Catalog和名為default的Schema。
說明本文示例中的
<主節點名稱>
,請根據您集群的實際信息修改。DataLake集群:主節點名稱為master-1-1。
Hadoop集群:主節點名稱為emr-header-1。
其余版本時,您可以通過如下JDBC URL,使用JDBC Driver連接數據庫。
jdbc:presto://<COORDINATOR>:<PORT>/[CATALOG]/[SCHEMA]
連接示例如下所示。
jdbc:presto://<主節點名稱>:9090 # 連接數據庫,使用默認的Catalog和Schema。 jdbc:presto://<主節點名稱>:9090/hive # 連接數據庫,使用名為hive的Catalog和默認的Schema。 jdbc:presto://<主節點名稱>:9090/hive/default # 連接數據庫,使用名為hive的Catalog和名為default的Schema。
連接參數
JDBC Driver支持多種配置參數,這些參數可以通過以下兩種方式傳入:
使用Properties對象。
EMR集群為EMR-3.38.0及以上版本或EMR-5.5.0及以上版本
String url = "jdbc:trino://<主節點名稱>:9090/hive/default"; Properties properties = new Properties(); properties.setProperty("user", "hadoop"); Connection connection = DriverManager.getConnection(url, properties); //......進行數據庫操作
其余版本
String url = "jdbc:presto://<主節點名稱>:9090/hive/default"; Properties properties = new Properties(); properties.setProperty("user", "hadoop"); Connection connection = DriverManager.getConnection(url, properties); //......進行數據庫操作
直接在URL中指定。
EMR集群為EMR-3.38.0及以上版本或EMR-5.5.0及以上版本
String url = "jdbc:trino://<主節點名稱>:9090/hive/default?user=hadoop"; Connection connection = DriverManager.getConnection(url); //......進行數據庫操作
其余版本
String url = "jdbc:presto://<主節點名稱>:9090/hive/default?user=hadoop"; Connection connection = DriverManager.getConnection(url); //......進行數據庫操作
常用參數說明如下。
參數名稱 | 格式 | 參數說明 |
user | STRING | 用于身份驗證和授權的用戶名。 |
password | STRING | 用于LDAP身份驗證的密碼。 |
socksProxy | STRING:NUMBER | SOCKS代理服務器地址。例如localhost:1080。 |
httpProxy | STRING:NUMBER | HTTP代理服務器地址。例如localhost:8888。 |
SSL | BOOLEAN | 是否使用HTTPS連接。默認值為false。 |
SSLTrustStorePath | STRING | Java TrustStore文件的路徑。 |
SSLTrustStorePassword | STRING | Java TrustStore的訪問密碼。 |
KerberosRemoteServiceName | STRING | Kerberos服務的名稱。 |
KerberosPrincipal | STRING | Kerberos Principal名稱。 |
KerberosUseCanonicalHostname | BOOLEAN | 是否使用規范化的主機名。默認值為false。 |
KerberosConfigPath | STRING | Kerberos配置文件的路徑。 |
KerberosKeytabPath | STRING | Kerberos KeyTab文件的路徑。 |
KerberosCredentialCachePath | STRING | Kerberos Credential緩存文件的路徑。 |
示例
下面是Java使用JDBC Driver連接數據庫的示例代碼。
.....
Connection connection = null;
Statement statement = null;
try {
// 根據組件名稱使用正確的JDBC URL。
String url = "jdbc:<trino/presto>://<主節點名稱>:9090/hive/default";
Properties properties = new Properties();
properties.setProperty("user", "hadoop");
// 創建連接對象。
connection = DriverManager.getConnection(url, properties);
// 創建Statement對象。
statement = connection.createStatement();
// 執行查詢。
ResultSet rs = statement.executeQuery("select * from t1");
// 獲取結果。
int columnNum = rs.getMetaData().getColumnCount();
int rowIndex = 0;
while (rs.next()) {
rowIndex++;
for(int i = 1; i <= columnNum; i++) {
System.out.println("Row " + rowIndex + ", Column " + i + ": " + rs.getInt(i));
}
}
} catch(SQLException e) {
LOG.ERROR("Exception thrown.", e);
} finally {
// 銷毀Statement對象。
if (statement != null) {
try {
statement.close();
} catch(Throwable t) {
// No-ops
}
}
// 關閉連接。
if (connection != null) {
try {
connection.close();
} catch(Throwable t) {
// No-ops
}
}
}
常見問題
通常,此錯誤是由于JDBC版本與Trino不匹配引起的。為了避免此問題,請確保使用與您正在連接的Trino版本兼容的JDBC驅動程序。
相關文檔
如果您只是進行簡單的數據查詢操作,建議使用命令行的方式連接Trino,詳情請參見通過命令行方式連接Trino。