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