文章目录
1. presto的介绍
presto是什么:简单的说,类似外部数据源。
1.1 优势
- 多数据源
- 支持SQL
- pluggable Connectors
- across
- pipeline
1.2 不足
- 如果一个Sql的执行时间超过20min以上,不建议使用。
2. presto的安装
-
下载presto-server-0.227.tar.gz、presto-cli-0.227-executable.jar(The current Presto release version is 0.227)
下载链接 -
将下载的 presto-server-0.227.tar.gz 解压到 ~/app 目录下
[hadoop@spark000 software]$ tar -zxvf presto-server-0.227.tar.gz -C ~/app
-
将 presto-cli-0.227-executable.jar 复制到 pre-server-0.227 的 bin 目录下
[hadoop@spark000 software]$ cp presto-cli-0.227-executable.jar ~/app/presto-server-0.227/bin
-
进入到 pre-server-0.227 的 bin 目录下
[hadoop@spark000 bin]$ mv presto-cli-0.227-executable.jar presto [hadoop@spark000 bin]$ chmod +x presto
-
创建data目录
[hadoop@spark000 ~]$ mkdir presto-directory [hadoop@spark000 ~]$ cd presto-directory/ [hadoop@spark000 presto-directory]$ ll total 0 [hadoop@spark000 presto-directory]$ pwd /home/hadoop/presto-directory
-
在 pre-server-0.227 目录下创建 etc 目录
[hadoop@spark000 presto-server-0.227]$ mkdir etc [hadoop@spark000 presto-server-0.227]$ ll total 208 drwxr-xr-x 3 hadoop hadoop 98 Oct 22 17:04 bin drwxrwxr-x 2 hadoop hadoop 6 Oct 22 17:10 etc drwxrwxr-x 2 hadoop hadoop 8192 Oct 22 17:00 lib -rw-r--r-- 1 hadoop hadoop 191539 Oct 17 08:06 NOTICE drwxrwxr-x 30 hadoop hadoop 4096 Oct 22 17:00 plugin -rw-r--r-- 1 hadoop hadoop 126 Oct 17 08:06 README.txt
-
在 etc 目录下创建所需文件
[hadoop@spark000 presto-server-0.227]$ cd etc [hadoop@spark000 etc]$ touch node.properties [hadoop@spark000 etc]$ touch jvm.config [hadoop@spark000 etc]$ touch config.properties [hadoop@spark000 etc]$ touch log.properties [hadoop@spark000 etc]$ mkdir catalog [hadoop@spark000 etc]$ cd catalog/ [hadoop@spark000 catalog]$ touch mysql.properties
-
编辑各文件内容
# 编辑mysql.properties [hadoop@spark000 catalog]$ vim mysql.properties connector.name=mysql connection-url=jdbc:mysql://spark000:3306 connection-user=root connection-password=123456 # 编辑node.properties [hadoop@spark000 etc]$ vim node.properties node.environment=production node.id=ffffffff-ffff-ffff-ffff-ffffffffffff-001 node.data-dir=/home/hadoop/presto-directory # 指定刚才创建的data目录 # 编辑jvm.config [hadoop@spark000 etc]$ vim jvm.config -server -Xmx4G -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit # 编辑config.properties [hadoop@spark000 etc]$ vim config.properties coordinator=true node-scheduler.include-coordinator=true http-server.http.port=8080 query.max-memory=2GB query.max-memory-per-node=1GB query.max-total-memory-per-node=2GB discovery-server.enabled=true discovery.uri=http://spark000:8080 # 编辑log.properties [hadoop@spark000 etc]$ vim log.properties com.facebook.presto=INFO
-
启动
[hadoop@spark000 presto-server-0.227]$ bin/launcher run
看到如下这个页面表示启动成功
这时可以访问 spark000:8080,查看能否看到 ui 页面
-
客户端启动
[hadoop@spark000 bin]$ ./presto --server spark000:8080 --catalog mysql presto>
经测试:–catalog这个参数加与不加,不影响数据的查询。
3. 启动过程中遇到的错误
Error: java.lang.IllegalArgumentException: Invalid memory configuration. The sum of max total query memory per node (2147483648) and heap headroom (644245094) cannot be larger than the available heap memory (2147483648)
错误分析: max total query memory per node + heap headroom > heap memory
这时我查看 config.properties的参数:
query.max-memory=2GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
再查看 jvm.config中的参数
-Xmx2G
解决: 将jvm.config文件中的-Xmx参数的值改为4G即可
结论:
query.max-memory:表示单个查询在分布在所有相关节点上能用的内存之和的最大值。
query.max-memory-per-node:单个查询在单个节点上用户内存能用的最大值。
从定义上就能看出:query.max-memory-per-node 必须小于 query.max-total-memory-per-node。
同样:query.max-memory 也必须小于 query.max-total-memory。
另外:query.max-total-memory-per-node 与 memory.heap-headroom-per-node 之和必须小于 jvm max memory ,也就是 jvm.config 中配置的 -Xmx参数。
4. MySQL Connector
- SHOW SCHEMAS FROM mysql;
- SHOW TABLES FROM mysql.database_name;
- DESCRIBE mysql.database_name.table_name;
- SHOW COLUMNS FROM mysql.database_name.table_name;
- SELECT * FROM mysql.database_name.table_name;
5. Hive Connector
-
在 etc/catalog 目录下新建文件 hive.properties
[hadoop@spark000 catalog]$ vim hive.properties connector.name=hive-hadoop2 hive.metastore.uri=thrift://spark000:9083 hive.config.resources=/home/hadoop/app/hadoop/etc/hadoop/core-site.xml,/home/hadoop/app/hadoop/etc/hadoop/hdfs-site.xml
-
开启 hive metastore 服务,默认监听 9083 端口
[hadoop@spark000 hive]$ bin/hive --service metastore
[hadoop@spark000 catalog]$ ps -ef|grep hive
[hadoop@spark000 catalog]$ netstat -nlp | grep 36465 -
退出刚才开启的MySQL客户端,并杀死 PrestoServer 进程
-
重新开启服务
[hadoop@spark000 presto-server-0.227]$ bin/launcher run [hadoop@spark000 bin]$ ./presto --server spark000:8080 --catalog hive presto>
-
查询操作和MySQL类似
6. 跨数据源查询
描述:部门表 dept 在MySQL中,员工表 emp 在 Hive 中,两表进行关联。
7. idea连接 presto 操作
package com.ruozedata.bigdata.spark.sql01
import java.sql.DriverManager
object PrestoApp {
def main(args: Array[String]): Unit = {
Class.forName("com.facebook.presto.jdbc.PrestoDriver")
val connection = DriverManager.getConnection("jdbc:presto://spark000:8080/catalog","root",null)
val stmt = connection.createStatement()
val sql = "select e.empno, e.ename, e.deptno, d.dname from hive.wuji_spark.emp e join mysql.wuji_spark.dept d on e.deptno = d.deptno"
val resultSet = stmt.executeQuery(sql)
while (resultSet.next()){
val empno = resultSet.getInt("empno")
val ename = resultSet.getString("ename")
val deptno = resultSet.getString("deptno")
val dname = resultSet.getString("dname")
println(empno + "\t" + ename + "\t" + deptno + "\t" + dname)
}
resultSet.close()
stmt.close()
connection.close()
}
}
运行结果: