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: DEBUGINFOWARN 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

  1. coordinator=true
  2. node-scheduler.include-coordinator=false
  3. http-server.http.port=
  4. query.max-memory=7GB
  5. query.max-memory-per-node=4GB
  6. query.client.timeout=3m
  7. query.max-length=
  8. query.min-expire-age=30m
  9. discovery-server.enabled=true
  10. 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

  1. -server
  2. -Xmx2G
  3. -XX:+UseG1GC
  4. -XX:+ExplicitGCInvokesConcurrent
  5. -XX:+CMSClassUnloadingEnabled
  6. -XX:+AggressiveOpts
  7. -XX:+HeapDumpOnOutOfMemoryError
  8. -XX:OnOutOfMemoryError=kill - %p
  9. -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: DEBUGINFOWARN and ERROR.

# cd catalog/

# cat hive.properties

  1. connector.name=hive-hadoop2
  2. hive.metastore.uri=thrift://192.168.1.202:9083
  3. hive.config.resources=/data/hadoop-2.7./etc/hadoop/core-site.xml,/data/hadoop-2.7./etc/hadoop/hdfs-site.xml
  4. #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

  1. <property>
  2.  
  3. <name>hive.metastore.local</name>
  4.  
  5. <value>false</value>
  6.  
  7. </property>
  8.  
  9. <property>
  10.  
  11. <name>hive.metastore.uris</name>
  12.  
  13. <value>thrift://192.168.1.202:9083</value>
  14.  
  15. </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的时候碰到一个请求报错:

  1. [Simba][Presto] () Presto Query Error: Query text length () exceeds the maximum length () ()

超过最大长度限制了,然而去官网并没有找到相关的参数设置,于是google一番找到一个解决方法,原来有一个可以参数可以修改这个默认值。下面给出链接:

https://github.com/prestodb/presto/pull/7001/files#diff-3ac3edac3816e47832034679379d250cR172

  1. import io.airlift.units.Duration;
  2. import io.airlift.units.MinDuration;
  3. import javax.validation.constraints.Max;
  4. import javax.validation.constraints.Min;
  5. import javax.validation.constraints.NotNull;
  6. @@ -40,6 +41,7 @@
  7. private int initialHashPartitions = 100;
  8. private Duration minQueryExpireAge = new Duration(15, TimeUnit.MINUTES);
  9. private int maxQueryHistory = 100;
  10. private int maxQueryLength = 1_000_000;
  11. private Duration clientTimeout = new Duration(5, TimeUnit.MINUTES);
  12. private int queryManagerExecutorPoolSize = 5;
  13. @@ -160,6 +162,20 @@ public QueryManagerConfig setMaxQueryHistory(int maxQueryHistory)
  14. return this;
  15. }
  16. @Min(0)
  17. @Max(1_000_000_000)
  18. public int getMaxQueryLength()
  19. {
  20. return maxQueryLength;
  21. }
  22. @Config("query.max-length")
  23. public QueryManagerConfig setMaxQueryLength(int maxQueryLength)
  24. {
  25. this.maxQueryLength = maxQueryLength;
  26. return this;
  27. }
  28. @MinDuration("5s")
  29. @NotNull
  30. public Duration getClientTimeout()

有一个 query.max-length的配置可以修改那个默认值,在配置文件config.properties文件里面添加这个配置,重启presto server生效,再次尝试发现问题解决了。

  1. coordinator=true
  2. node-scheduler.include-coordinator=false
  3. http-server.http.port=8082
  4. query.max-memory=7GB
  5. query.max-memory-per-node=4GB
  6. query.client.timeout=3m
  7. query.max-length=100000000
  8. query.min-expire-age=30m
  9. discovery-server.enabled=true
  10. discovery.uri=http://192.168.1.202:8080

2、升级presto到0.218版本后,使用presto查询的时候总是报错:

  1. Presto Upgraded to 0.218 Version, Corrupted statistics for column "[nickname] BINARY" in Parquet file

原因是存储的parquet文件有部分是损坏的,而presto在0.216开始添加了一个文件完整性检测,这个默认是开启的,可以直接关掉:

# vim  catalog/hive.properties

  1. hive.parquet.fail-on-corrupted-statistics=false

重启服务即可解决。

大数据之presto的更多相关文章

  1. Facebook 正式开源其大数据查询引擎 Presto

    Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...

  2. 低调、奢华、有内涵的敏捷式大数据方案: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 ...

  3. 比hive快10倍的大数据查询利器presto部署

    目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...

  4. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

        你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...

  5. 追本溯源 解析“大数据生态环境”发展现状(CSDN)

    程学旗先生是中科院计算所副总工.研究员.博士生导师.网络科学与技术重点实验室主任.本次程学旗带来了中国大数据生态系统的基础问题方面的内容分享.大数据的发展越来越快,但是对于大数据的认知大都还停留在最初 ...

  6. 后Hadoop时代的大数据架构(转)

    原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞       提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...

  7. 了解大数据的技术生态系统 Hadoop,hive,spark(转载)

    首先给出原文链接: 原文链接 大数据本身是一个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你能够把它比作一个厨房所以须要的各种工具. 锅碗瓢盆,各 ...

  8. 大数据技术生态圈形象比喻(Hadoop、Hive、Spark 关系)

    [摘要] 知乎上一篇很不错的科普文章,介绍大数据技术生态圈(Hadoop.Hive.Spark )的关系. 链接地址:https://www.zhihu.com/question/27974418 [ ...

  9. 一文教你看懂大数据的技术生态圈:Hadoop,hive,spark

    转自:https://www.cnblogs.com/reed/p/7730360.html 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞 ...

随机推荐

  1. 18:description方法

    本小节知识点: [掌握]description基本概念 [掌握]description重写的方法 [了解]description陷阱 1.description基本概念 NSLog(@"%@ ...

  2. Scala_函数式编程基础

    函数式编程基础 函数定义和高阶函数 函数字面量 字面量包括整数字面量.浮点数字面量.布尔型字面量.字符字面 量.字符串字面量.符号字面量.函数字面量和元组字面量. scala> val i = ...

  3. hdu 3910 Liang Guo Sha

    题目链接:hdu 3910 Liang Guo Sha 题目大意:Alice和Bob这两个小伙伴又发明了一种新游戏, 叫两国杀, 每个人手上有两张牌,“杀” 和“闪”, 然后有三个数值A,B和C, 当 ...

  4. yum改成网易的源

    用网易的源会快很多,步骤如下:http://mirrors.163.com/.help/centos.html 1.首先备份/etc/yum.repos.d/CentOS-Base.repo mv / ...

  5. C - Roll-call in Woop Woop High

    Description The new principal of Woop Woop High is not satisfied with her pupils performance. She in ...

  6. Linux-用户及权限

    1. 用户组 RHEL 7/CentOS 7系统中的用户组有如下3类: 超级用户,UID 0:系统的超级用户. 系统用户,UID 1-999:系统中系统服务由不同用户运行,更加安全,默认被限制不能登录 ...

  7. Ocelot入门实践

    博主是第一次写技术文档,一是对这两年工作以来的一些技术和经验进行整理,二也是希望能和大家多多分享交流,如有写的不对的地方望大家多多指正.进入正题 Ocelot 概念就不说了,大家自行百度,今天做一个O ...

  8. 背水一战 Windows 10 (41) - 控件(导航类): Frame

    [源码下载] 背水一战 Windows 10 (41) - 控件(导航类): Frame 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) Frame 示例Controls ...

  9. EMACS快捷键

    C = Control M = Meta = Alt | Esc Del = Backspace 基本快捷键(Basic) C-x C-f "find"文件, 即在缓冲区打开/新建 ...

  10. 网络基础、多线程、ftp任务铺垫

    一.网络基础 学习网络编程,了解一些网络基础的知识是必不可少的,下面学习一些基础的网络知识: 1.我们的电脑里有网卡,网卡里有mac地址: 2.我到某个地方插上网线,路由器或交换机中的DHCP服务为我 ...