通过JDBC方式连接Trino

创建了包含Trino服务的集群后,如果您需要进行复杂的数据查询、分析和处理操作,或者需要将查询结果集成到Java应用程序中,则可以使用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]

    其中,各参数含义如下:

    • <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时报错Authentication failed: Basic authentication or X-Trino-User must be sent

通常,此错误是由于JDBC版本与Trino不匹配引起的。为了避免此问题,请确保使用与您正在连接的Trino版本兼容的JDBC驱动程序。

相关文档

如果您只是进行简单的数据查询操作,建议使用命令行的方式连接Trino,详情请参见通过命令行方式连接Trino