创建了包含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
}
}
}
常见问题
相关文档
如果您只是进行简单的数据查询操作,建议使用命令行的方式连接Trino,详情请参见通过命令行方式连接Trino。