Java应用可以使用Presto提供的JDBC Driver连接数据库。

在Maven中引入

您可以在pom.xml中,添加如下配置引入Presto JDBC Driver。
<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>0.187</version>
</dependency>

Driver类名

Presto JDBC Driver类为com.facebook.presto.jdbc.PrestoDriver

连接字串

您可以使用如下格式连接字串。
jdbc:presto://<COORDINATOR>:<PORT>/[CATALOG]/[SCHEMA]
示例如下。
jdbc:presto://emr-header-1:9090               # 连接数据库,使用Catalog和Schema。
jdbc:presto://emr-header-1:9090/hive          # 连接数据库,使用Catalog(hive)和Schema。
jdbc:presto://emr-header-1:9090/hive/default  # 连接数据库,使用Catalog(hive)和Schema(default)。

连接参数

Presto JDBC Driver支持很多参数,参数传入方式示例如下:
  • 通过Properties对象传入。
    String url = "jdbc:presto://emr-header-1:9090/hive/default";
    Properties properties = new Properties();
    properties.setProperty("user", "hadoop");
    Connection connection = DriverManager.getConnection(url, properties);
    ......
  • 通过URL传入。
    String url = "jdbc:presto://emr-header-1:9090/hive/default?user=hadoop";
    Connection connection = DriverManager.getConnection(url);
    ......
各参数说明如下。
参数名称 格式 参数说明
user STRING 用户名。
password STRING 密码。
socksProxy \:\ SOCKS代理服务器地。例如localhost:1080
httpProxy \:\ HTTP代理服务器地址。例如localhost:8888
SSL true\ 是否使用HTTPS连接。默认为false。
SSLTrustStorePath STRING Java TrustStore文件路径。
SSLTrustStorePassword STRING Java TrustStore密码。
KerberosRemoteServiceName STRING Kerberos服务名称。
KerberosPrincipal STRING Kerberos Principal。
KerberosUseCanonicalHostname true\ 是否使用规范化主机名。默认为false。
KerberosConfigPath STRING Kerberos配置文件路径。
KerberosKeytabPath STRING Kerberos KeyTab文件路径。
KerberosCredentialCachePath STRING Kerberos Credential缓存路径。

Java示例

Java使用Presto JDBC Driver的示例如下。
.....
// 加载JDBC Driver类。
try {
    Class.forName("com.facebook.presto.jdbc.PrestoDriver");
} catch(ClassNotFoundException e) {
    LOG.ERROR("Failed to load presto jdbc driver.", e);
    System.exit(-1);
}
Connection connection = null;
Statement statement = null;
try {
    String url = "jdbc:presto://emr-header-1: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
    }
  }
}

使用反向代理

您可以使用HAProxy反向代理Coodinator,来访问Presto服务。

非安全集群配置集群代理步骤如下:
  1. 在代理节点安装HAProxy。
  2. 修改HAProxy配置(/etc/haproxy/haproxy.cfg),添加如下内容。
    ......
    
    listen prestojdbc :9090
        mode tcp
        option tcplog
        balance source
        server presto-coodinator-1 emr-header-1:9090
  3. 重启HAProxy服务。