大数据之presto
1、概述
Presto是一个分布式SQL查询引擎,用于查询分布在一个或多个不同数据源中的大数据集。presto可以通过使用分布式查询,可以快速高效的完成海量数据的查询。它是完全基于内存的,所以速度非常快。presto不仅可以查询HDFS,还可以查询RDMBS数据库。
具体的介绍可以参考官方:https://prestodb.io/docs/current/overview/concepts.html
presto是facebook开源的,目前很多国内知名企业都在用如唯品会、美团、阿里。
2、部署
目前最新的版本是presto-server-0.189.tar.gz,下载地址:http://maven.aliyun.com/nexus/content/groups/public/com/facebook/presto/presto-server/
相应的cli版本presto-cli-0.189-executable.jar,下载地址:http://maven.aliyun.com/nexus/content/groups/public/com/facebook/presto/presto-cli/
下载需要的版本后,进行解压并重命名:
# tar xf presto-server-0.189.tar.gz
#mv presto-server-0.189 presto
presto集群包括coordinator(调度节点)和多个worker。 由客户端提交查询,从Presto命令行CLI提交到coordinator。 coordinator进行解析,分析并执行查询计划,然后分发处理队列到worker
presto需要一个data目录用来存放logs、etc,建议目录创建在安装目录外面,方便升级。
在安装目录中创建一个etc目录。 在这个etc目录中放入以下配置信息:
- 节点属性:每个节点的环境配置信息
- JVM 配置:JVM的命令行选项
- 配置属性:Presto server的配置信息
- Catalog属性:configuration forConnectors(数据源)的配置信息
coordinator节点:
#mkdir presto/etc
#ls presto/etc
catalog config.properties jvm.config log.properties node.properties
#cat node.properties
node.environment=huoqiu
node.id=huoqiu_coordinator
node.data-dir=/data/presto/data
- node.environment: 集群名称。所有在同一个集群中的Presto节点必须拥有相同的集群名称。
- node.id: 每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id。
- node.data-dir: 数据存储目录的位置(操作系统上的路径)。Presto将会把日期和数据存储在这个目录下。
# cat config.properties
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=3GB
query.max-memory-per-node=3GB
discovery-server.enabled=true
discovery.uri=http://192.168.1.202:8080
- coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)。
- node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作。对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worke将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都不会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行。
- http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯。
- query.max-memory=3GB:一个单独的任务使用的最大内存 (一个查询计划的某个执行部分会在一个特定的节点上执行)。 这个配置参数限制的GROUP BY语句中的Group的数目、JOIN关联中的右关联表的大小、ORDER BY语句中的行数和一个窗口函数中处理的行数。 该参数应该根据并发查询的数量和查询的复杂度进行调整。如果该参数设置的太低,很多查询将不能执行;但是如果设置的太高将会导致JVM把内存耗光。
- discovery-server.enabled:Presto 通过Discovery 服务来找到集群中所有的节点。为了能够找到集群中所有的节点,每一个Presto实例都会在启动的时候将自己注册到discovery服务。Presto为了简化部署,并且也不想再增加一个新的服务进程,Presto coordinator 可以运行一个内嵌在coordinator 里面的Discovery 服务。这个内嵌的Discovery 服务和Presto共享HTTP server并且使用同样的端口。
- discovery.uri:Discovery server的URI。由于启用了Presto coordinator内嵌的Discovery 服务,因此这个uri就是Presto coordinator的uri。修改example.net:8080,根据你的实际环境设置该URI。注意:这个URI一定不能以“/“结尾。
# cat jvm.config
-server
-Xmx1G
-XX:+UseG1GC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
# cat log.properties
com.facebook.presto=INFO
@This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.
# cd catalog/
# cat hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://192.168.1.202:9083
hive.config.resources=/data/hadoop-2.7.3/etc/hadoop/core-site.xml,/data/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
#hive.allow-drop-table=true
# cat jmx.properties
connector.name=jmx
@Presto通过connectors访问数据。这些connectors挂载在catalogs上。 connector 可以提供一个catalog中所有的schema和表。 例如: Hive connector 将每个hive的database都映射成为一个schema, 所以如果hive connector挂载到了名为hive的catalog, 并且在hive的web有一张名为clicks的表, 那么在Presto中可以通过hive.web.clicks来访问这张表。
通过在etc/catalog目录下创建catalog属性文件来完成catalogs的注册.
worker节点:
#mkdir presto/etc
#ls presto/etc
catalog config.properties jvm.config log.properties node.properties
#cat node.properties
node.environment=huoqiu
node.id=huoqiu_worker1
node.data-dir=/data/presto/data
- node.environment: 集群名称。所有在同一个集群中的Presto节点必须拥有相同的集群名称。
- node.id: 每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id。
- node.data-dir: 数据存储目录的位置(操作系统上的路径)。Presto将会把日期和数据存储在这个目录下。
# cat config.properties
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=
query.max-memory=7GB
query.max-memory-per-node=4GB
query.client.timeout=3m
query.max-length=
query.min-expire-age=30m
discovery-server.enabled=true
discovery.uri=http://192.168.1.202:8080
- coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)。
- node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作。对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worke将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都不会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行。
- http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯。
- query.max-memory=3GB:一个单独的任务使用的最大内存 (一个查询计划的某个执行部分会在一个特定的节点上执行)。 这个配置参数限制的GROUP BY语句中的Group的数目、JOIN关联中的右关联表的大小、ORDER BY语句中的行数和一个窗口函数中处理的行数。 该参数应该根据并发查询的数量和查询的复杂度进行调整。如果该参数设置的太低,很多查询将不能执行;但是如果设置的太高将会导致JVM把内存耗光。
- query.max-length=100000000: 这个参数在查询和写入数据量较大的时候会用到,默认值是1000000。
- discovery-server.enabled:Presto 通过Discovery 服务来找到集群中所有的节点。为了能够找到集群中所有的节点,每一个Presto实例都会在启动的时候将自己注册到discovery服务。Presto为了简化部署,并且也不想再增加一个新的服务进程,Presto coordinator 可以运行一个内嵌在coordinator 里面的Discovery 服务。这个内嵌的Discovery 服务和Presto共享HTTP server并且使用同样的端口。
- discovery.uri:Discovery server的URI。由于启用了Presto coordinator内嵌的Discovery 服务,因此这个uri就是Presto coordinator的uri。修改example.net:8080,根据你的实际环境设置该URI。注意:这个URI一定不能以“/“结尾。
# cat jvm.config
-server
-Xmx2G
-XX:+UseG1GC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill - %p
-XX:ReservedCodeCacheSize=150M
# cat log.properties
com.facebook.presto=INFO
@This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.
# cd catalog/
# cat hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://192.168.1.202:9083
hive.config.resources=/data/hadoop-2.7./etc/hadoop/core-site.xml,/data/hadoop-2.7./etc/hadoop/hdfs-site.xml
#hive.allow-drop-table=true
# cat jmx.properties
connector.name=jmx
@Presto通过connectors访问数据。这些connectors挂载在catalogs上。 connector 可以提供一个catalog中所有的schema和表。 例如: Hive connector 将每个hive的database都映射成为一个schema, 所以如果hive connector挂载到了名为hive的catalog, 并且在hive的web有一张名为clicks的表, 那么在Presto中可以通过hive.web.clicks来访问这张表。
通过在etc/catalog目录下创建catalog属性文件来完成catalogs的注册.
worker节点只需要修改node.id=huoqiu_worker1,coordinator=false。可以创建多个worker节点。
3、启动
如果连接hive metastore,需要先配置hive-site.xml
<property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.1.202:9083</value> </property>
首先要启动hive metatsore:
# nohup ./hive --service metastore >>/data/nohuo.out 2>&1 &
在安装目录下有个bin目录,有个可执行文件:
launcher
有两种启动方式:
1)./launcher run
这种方式是前台运行,日志直接输出在屏幕上。
2)./launcher start
这种方式是后台运行,会在上面配置的data(node.data-dir=/data/presto/data)生成var目录,里面是程序的日志,还有etc、plugin的软链接。
4、客户端
将下载的presto-cli-0.189-executable.jar上传至服务器,
只能连接coordinator,因为他是整个个入口:
#mv presto-cli-0.189-executable.jar presto
#chmod +x presto
#./presto --server 192.168.1.202:8080 --catalog hive --schema default
presto:default> show tables;
Table
-------
test
(1 row)
Query 20171123_163250_00025_s3abt, FINISHED, 2 nodes
Splits: 18 total, 18 done (100.00%)
0:01 [1 rows, 21B] [0 rows/s, 16B/s]
5、web
http://192.168.1.202:8080
QA:
1、最近在使用presto的时候碰到一个请求报错:
[Simba][Presto] () Presto Query Error: Query text length () exceeds the maximum length () ()
超过最大长度限制了,然而去官网并没有找到相关的参数设置,于是google一番找到一个解决方法,原来有一个可以参数可以修改这个默认值。下面给出链接:
https://github.com/prestodb/presto/pull/7001/files#diff-3ac3edac3816e47832034679379d250cR172
import io.airlift.units.Duration;
import io.airlift.units.MinDuration;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@@ -40,6 +41,7 @@
private int initialHashPartitions = 100;
private Duration minQueryExpireAge = new Duration(15, TimeUnit.MINUTES);
private int maxQueryHistory = 100;
private int maxQueryLength = 1_000_000;
private Duration clientTimeout = new Duration(5, TimeUnit.MINUTES);
private int queryManagerExecutorPoolSize = 5;
@@ -160,6 +162,20 @@ public QueryManagerConfig setMaxQueryHistory(int maxQueryHistory)
return this;
}
@Min(0)
@Max(1_000_000_000)
public int getMaxQueryLength()
{
return maxQueryLength;
}
@Config("query.max-length")
public QueryManagerConfig setMaxQueryLength(int maxQueryLength)
{
this.maxQueryLength = maxQueryLength;
return this;
}
@MinDuration("5s")
@NotNull
public Duration getClientTimeout()
有一个 query.max-length的配置可以修改那个默认值,在配置文件config.properties文件里面添加这个配置,重启presto server生效,再次尝试发现问题解决了。
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8082
query.max-memory=7GB
query.max-memory-per-node=4GB
query.client.timeout=3m
query.max-length=100000000
query.min-expire-age=30m
discovery-server.enabled=true
discovery.uri=http://192.168.1.202:8080
2、升级presto到0.218版本后,使用presto查询的时候总是报错:
Presto Upgraded to 0.218 Version, Corrupted statistics for column "[nickname] BINARY" in Parquet file
原因是存储的parquet文件有部分是损坏的,而presto在0.216开始添加了一个文件完整性检测,这个默认是开启的,可以直接关掉:
# vim catalog/hive.properties
hive.parquet.fail-on-corrupted-statistics=false
重启服务即可解决。
大数据之presto的更多相关文章
- Facebook 正式开源其大数据查询引擎 Presto
Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...
- 低调、奢华、有内涵的敏捷式大数据方案:Flume+Cassandra+Presto+SpagoBI
基于FacebookPresto+Cassandra的敏捷式大数据 文件夹 1 1.1 1.1.1 1.1.2 1.2 1.2.1 1.2.2 2 2.1 2.2 2.3 2.4 2.5 2.6 3 ...
- 比hive快10倍的大数据查询利器presto部署
目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...
- Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...
- 追本溯源 解析“大数据生态环境”发展现状(CSDN)
程学旗先生是中科院计算所副总工.研究员.博士生导师.网络科学与技术重点实验室主任.本次程学旗带来了中国大数据生态系统的基础问题方面的内容分享.大数据的发展越来越快,但是对于大数据的认知大都还停留在最初 ...
- 后Hadoop时代的大数据架构(转)
原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞 提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...
- 了解大数据的技术生态系统 Hadoop,hive,spark(转载)
首先给出原文链接: 原文链接 大数据本身是一个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你能够把它比作一个厨房所以须要的各种工具. 锅碗瓢盆,各 ...
- 大数据技术生态圈形象比喻(Hadoop、Hive、Spark 关系)
[摘要] 知乎上一篇很不错的科普文章,介绍大数据技术生态圈(Hadoop.Hive.Spark )的关系. 链接地址:https://www.zhihu.com/question/27974418 [ ...
- 一文教你看懂大数据的技术生态圈:Hadoop,hive,spark
转自:https://www.cnblogs.com/reed/p/7730360.html 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞 ...
随机推荐
- 《mysql必知必会》学习_第八章_20180730_欢
第八章学习LIKE操作符,百分百(%)通配符,下划线(_)通配符 P47 select prod_id,prod_name from products where prod_name LIKE 'je ...
- AngularJS 事件广播与接收 $broadcast,$emit,$on 作用域间通信 封装factory服务 发布订阅
不同作用域之间通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信. 一.说明 1.广播 $broadcast 说明:将事件从父级作用域传播至本作用域及子级作用域. 格式:$b ...
- sed,grep,进阶+source+export+环境变量
三剑客之sed 概括流程:从文件或管道中,可迭代读取. 命令格式: sed(软件) 选项 sed命令 输入文件 增 两个sed命令: a: 追加文本到指定行后 i: 插入到指定行前 sed -i '1 ...
- centos7 修改默认启动级别
systemctl set-default multi-user.target 设定默认为字符界面,也就是3 systemctl set-default graphical.target ...
- 7.Git与项目
Git简介 Git是目前世界上最先进的分布式版本控制系统 安装 sudo apt-get install git 安装成功后,运行如下命令 git 产生 Linus在1991年创建了开源的Linux, ...
- headpq
从一个集合中获得最大或者最小的N个元素列表 http://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p04_find_largest_or_sm ...
- “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- shapefile的使用和地理信息的获得
Shapefile文件是美国ESRI公司发布的文件格式,因其ArcGIS软件的推广而得到了普遍的使用,是现在GIS领域使用最为广泛的矢量数据格式.官方称Shapefile是一种用于存储地理要素的几何位 ...
- <转>PHP中正则表达式函数
PHP中的正则表达式函数 在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的,基于传统型NFA.PCRE库使用和Perl ...
- Dubbo启动时服务检查
所谓启动时服务检查是指Dubbo在启动的时候会检查当前引用的服务是否可用,不可用会抛出异常,阻止程序的初始化,以便能在上线前快速的找到问题,默认的情况下check=true 通过设置check=fal ...