一、服务端安装
官网地址:Presto | Distributed SQL Query Engine for Big Data
1、下载包
2、解压缩
tar -zxvf presto-server-0.265.1.tar.gz
mv presto-server-0.265.1 /usr/local/presto
3、 创建data、etc文件夹:
mkdir data
mkdir etc
plugin下存放各种数据源的连接
data:后期会存储我们计算过程当中的临时数据。
4、在etc下添加jvm.config
vi jvm.config
添加如下内容:
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
5、presto支持多个数据源,在presto中叫catalog,这里我们配置支持hive的数据源,配置一个hive的catalog。
cd /usr/local/presto/etc
mkdir catalog
vi hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://master:9083
此处的hive-hadoop2中的Hadoop2指的是Hadoop的版本。
6、配置好后分发给其他服务器。
7、分发完成后,在etc下创建node.properties
node.id的值可以为数据、字母、运算符。只要保证每台机器不一样即可。
node.data-dir:存储临时数据的路径
8、presto是由一个corrdinator节点和多个worker节点组成。在master节点上配置成coordinator,在master-backup和node1上配置成worker。
master:
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8881
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://master:8881
master-backup和node1
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery.uri=http://master:8881
query.max-memory为查询的最大内存。测试环境没那么大的数据量,随便配。生产上要根据服务器内存,其他组件使用的内存等综合考虑。
discovery-server是coordinator内置的一个服务,共用8881端口。
discovery-server用来跟workder进行通讯。服务启动后worker会向discovery-server进行注册并保持监听,实时汇报任务状态和健康状态,并与coordinator保持通讯,这样coordinator就可以知道每个worker的状态,可以更好的分配任务。
9、配置完成后,就可以启动服务了,启动前需要先启动hive。
启动hive
cd /usr/local/hive
bin/hive --service metastore
启动presto
前台启动: bin/launcher run
后台启动:bin/launcher start
二、客户端安装
Command Line Interface — Presto 0.266 Documentation
mv presto-cli-0.265.1-executable.jar prestocli
chmod +x prestocli
./prestocli
./prestocli --server master:8881 --catalog hive --schema default
show schemas;
use db_hive;
show tables;
三、可视化客户端安装
下载 yanagishima-17.0.tar.gz 最新包
跨库查询
Presto整合MySQL和Hive,实现跨引擎查询_逆天骚年的博客-CSDN博客
/usr/local/presto/etc/catalog
java API实现mysql和hive跨库查询
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.234.1</version>
</dependency>
package com.example.demo;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import java.sql.*;
import java.util.Properties;
public class PrestoTest {
public static void main(String[] args) {
String sql = "select * from mysql.company.dept as d join hive.default.stu as e on d.id = e.sid";
//String sql = "select * from staff";
try {
new PrestoTest().getDataAll(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
private String server ="192.168.3.*";
private String port="8881";
private String username="root";
private String password="***empty***";
private Connection getConnection() throws Exception {
/**
* 功能:presto 通过 jdbc 连接
* 示例:jdbc:presto://host:port/
**/
String jdbcurl = "jdbc:presto://192.168.3.*:8881/mysql/company";
Connection conn ;
Properties props = new Properties();
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
props.setProperty("user", username);
if (StringUtils.isNotBlank(password)) {
props.setProperty("password", password);
props.setProperty("SSL", "false");
//props.setProperty("SSLTrustStorePath", SSLTrustStorePath);
//props.setProperty("SSLTrustStorePassword", SSLTrustStorePassword);
jdbcurl = String.format("jdbc:presto://%s:%s/", server, port);
}
conn = DriverManager.getConnection(jdbcurl, props);
//conn = DriverManager.getConnection(jdbcurl, "root","***empty***");
/*设置连接的数据源类型
* 示例:mysql、hive
*/
conn.setCatalog("mysql");
return conn;
}
public JSONArray getDataAll(String sql)
throws Exception {
JSONArray array = new JSONArray();
Statement ps = null;
ResultSet rs = null;
Connection con = null;
try {
con = getConnection();
ps = con.createStatement();
rs = ps.executeQuery(sql);
// 获取列数
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
// 遍历ResultSet中的每条数据
while (rs.next()) {
JSONObject jsonObj = new JSONObject();
// 遍历每一列
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
String value = StringUtils.isBlank(rs.getString(columnName)) ? "" : rs.getString(columnName);
jsonObj.put(columnName, value);
}
System.out.println(jsonObj.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
rs.close();
ps.close();
con.close();
}
return array;
}
}
package com.example.demo;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import java.sql.*;
import java.util.Properties;
public class PrestoTest {
public static void main(String[] args) {
String sql = "select * from mysql.company.dept as d join hive.default.stu as e on d.id = e.sid";
//String sql = "select * from staff";
try {
new PrestoTest().getDataAll(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
private String server ="192.168.3.*";
private String port="8881";
private String username="root";
private String password="***empty***";//没有密码时用***empty***
private Connection getConnection() throws Exception {
/**
* 功能:presto 通过 jdbc 连接
* 示例:jdbc:presto://host:port/
**/
String jdbcurl = "jdbc:presto://192.168.3.*:8881/";
Connection conn ;
Properties props = new Properties();
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
props.setProperty("user", username);
if (StringUtils.isNotBlank(password)) {
props.setProperty("password", password);
props.setProperty("SSL", "false");
//props.setProperty("SSLTrustStorePath", SSLTrustStorePath);
//props.setProperty("SSLTrustStorePassword", SSLTrustStorePassword);
jdbcurl = String.format("jdbc:presto://%s:%s/", server, port);
}
conn = DriverManager.getConnection(jdbcurl, props);
//conn = DriverManager.getConnection(jdbcurl, "root","***empty***");
/*设置连接的数据源类型
* 示例:mysql、hive
*/
conn.setCatalog("hive");//这里既可以为mysql,也可以为hive
return conn;
}
public JSONArray getDataAll(String sql)
throws Exception {
JSONArray array = new JSONArray();
Statement ps = null;
ResultSet rs = null;
Connection con = null;
try {
con = getConnection();
ps = con.createStatement();
rs = ps.executeQuery(sql);
// 获取列数
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
// 遍历ResultSet中的每条数据
while (rs.next()) {
JSONObject jsonObj = new JSONObject();
// 遍历每一列
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
String value = StringUtils.isBlank(rs.getString(columnName)) ? "" : rs.getString(columnName);
jsonObj.put(columnName, value);
}
System.out.println(jsonObj.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
rs.close();
ps.close();
con.close();
}
return array;
}
}