创建了包含Presto服务的集群后,如果您需要进行复杂的数据查询、分析和处理操作,或者需要将查询结果集成到Java应用程序中,则可以使用Presto提供的JDBC Driver连接数据库。
在Maven中引入JDBC Driver
您需要根据您的E-MapReduce集群版本,在pom.xml
文件中添加相应的依赖来引入Presto JDBC Driver。
组件版本 | JDBC Driver | Driver类名 |
0.2XX |
| com.facebook.presto.jdbc.PrestoDriver |
其中,Java版本需要为Java 8或更高版本,且所有使用者都需被授予system.jdbc
表的查询权限。
数据库连接
您可以通过如下JDBC URL,使用JDBC Driver连接数据库。
jdbc:presto://<COORDINATOR>:<PORT>/[CATALOG]/[SCHEMA]
连接示例如下所示。
jdbc:presto://master-1-1:8889 # 连接数据库,使用Catalog和Schema。
jdbc:presto://master-1-1:8889/hive # 连接数据库,使用Catalog(hive)和Schema。
jdbc:presto://master-1-1:8889/hive/default # 连接数据库,使用Catalog(hive)和Schema(default)。
连接参数
JDBC Driver支持多种配置参数,这些参数可以通过以下两种方式传入:
使用Properties对象。
String url = "jdbc:presto://<主节点名称>:8889/hive/default"; Properties properties = new Properties(); properties.setProperty("user", "presto"); Connection connection = DriverManager.getConnection(url, properties); //......进行数据库操作
直接在URL中指定。
String url = "jdbc:presto://<主节点名称>:8889/hive/default?user=presto"; 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。 |
SSLKeyStorePath | STRING | 存储KeyStore文件的路径。 |
SSLKeyStorePassword | STRING | KeyStore的访问密码。 |
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:presto://<主节点名称>:8889/hive/default";
Properties properties = new Properties();
properties.setProperty("user", "presto");
// 创建连接对象。
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
}
}
}
相关文档
如果您只是进行简单的数据查询操作,建议使用命令行的方式访问Presto,详情请参见通过命令行方式访问Presto。