本文为您介绍如何使用Presto或Trino提供的JDBC Driver连接数据库。Java应用可以使用Presto或Trino提供的JDBC Driver连接数据库。

在Maven中引入JDBC Driver

您可以根据E-MapReduce集群的版本,在 pom.xml中添加如下配置引入Presto或Trino JDBC Driver。
EMR版本 组件版本 JDBC Driver Driver类名
  • EMR-3.x系列:EMR-3.38.0及以上
  • EMR-5.x系列:EMR-5.5.0及以上
3XX
<dependency>
    <groupId>io.trino</groupId>
    <artifactId>trino-jdbc</artifactId>
    <version>3XX</version>
</dependency>
io.trino.jdbc.TrinoDriver
  • EMR-3.x系列:EMR-3.25.0~EMR-3.37.x
  • EMR-4.x系列:EMR-4.3.0~EMR-4.9.0
  • EMR-5.x系列:EMR-5.2.1~EMR-5.4.3
3XX
<dependency>
    <groupId>io.prestosql</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>3XX</version>
</dependency>
io.prestosql.jdbc.PrestoDriver
其他EMR版本 0.2XX
<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>0.2XX</version>
</dependency>
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);
      ......
  • 通过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
    }
  }
}

常见问题

Q:为什么连接时报错Authentication failed: Basic authentication or X-Trino-User must be sent

A:JDBC版本与Trino不匹配,换用对应的JDBC包即可。