本文为您介绍如何使用Presto或Trino提供的JDBC Driver连接数据库。Java应用可以使用Presto或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]
连接示例如下所示。jdbc:trino://<主节点名称>:9090 # 连接数据库,使用Catalog和Schema。 jdbc:trino://<主节点名称>:9090/hive # 连接数据库,使用Catalog(hive)和Schema。 jdbc:trino://<主节点名称>:9090/hive/default # 连接数据库,使用Catalog(hive)和Schema(default)。
说明 本文示例中的<主节点名称>
,请根据您集群的实际信息修改。- 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 # 连接数据库,使用Catalog(hive)和Schema。 jdbc:presto://<主节点名称>:9090/hive/default # 连接数据库,使用Catalog(hive)和Schema(default)。
连接参数
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); ......
- EMR集群为EMR-3.38.0及以上版本或EMR-5.5.0及以上版本
- 通过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); ......
- EMR集群为EMR-3.38.0及以上版本或EMR-5.5.0及以上版本
常用参数说明如下。
参数名称 | 格式 | 参数说明 |
---|---|---|
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
}
}
}
常见问题
Q:为什么连接时报错Authentication failed: Basic authentication or X-Trino-User must be sent
?
A:JDBC版本与Trino不匹配,换用对应的JDBC包即可。