大数据实时查询-Presto集群部署搭建

Presto介绍

Presto是一个分布式SQL查询引擎, 它被设计为用来专门进行高速、实时的数据分析。它支持标准的ANSI SQL,包括复杂查询、聚合(aggregation)、连接(join)和窗口函数(window functions)。Presto的运行模型和Hive或MapReduce有着本质的区别。Hive将查询翻译成多阶段的MapReduce任务, 一个接着一个地运行。 每一个任务从磁盘上读取输入数据并且将中间结果输出到磁盘上。 然而Presto引擎没有使用MapReduce。它使用了一个定制的查询和执行引擎和响应的操作符来支持SQL的语法。除了改进的调度算法之外, 所有的数据处理都是在内存中进行的。 不同的处理端通过网络组成处理的流水线。 这样会避免不必要的磁盘读写和额外的延迟。 这种流水线式的执行模型会在同一时间运行多个数据处理段, 一旦数据可用的时候就会将数据从一个处理段传入到下一个处理段。 这样的方式会大大的减少各种查询的端到端响应时间。

Presto查询引擎是一个Master-Slave的架构,由一个Coordinator节点,一个Discovery Server节点,多个Worker节点组成,Discovery Server通常内嵌于Coordinator节点中。Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。

image.png

Presto支持从以下版本的Hadoop中读取Hive数据:支持以下文件类型:Text, SequenceFile, RCFile, ORC

  • Apache Hadoop 1.x (hive-hadoop1)
  • Apache Hadoop 2.x (hive-hadoop2)
  • Cloudera CDH 4 (hive-cdh4)
  • Cloudera CDH 5 (hive-cdh5)

此外,需要有远程的Hive元数据。 不支持本地或嵌入模式。 Presto不使用MapReduce,只需要HDFS.

部署安装

https://prestodb.io/docs/current/installation/deployment.html

下载

https://repo1.maven.org/maven2/com/facebook/presto/presto-server/

将安装包copy至服务器

创建log目录

sudo mkdir /opt/bigdata
sudo mkdir /opt/bigdata/presto
sudo mkdir /opt/bigdata/presto/data

解压安装包

目录/opt/bigdata/presto/

sudo tar -zxvf /opt/bigdata/presto/presto-server-0.208.tar.gz
sudo mkdir /opt/bigdata/presto/presto-server-0.208/catalog
sudo mkdir /opt/bigdata/presto/presto-server-0.208/etc

更改用户组

sudo chgrp -R ec2-user /opt/bigdata

sudo chown -R ec2-user /opt/bigdata

配置文件

在presto目录下创建etc目录,并在etc目录下,创建以下配置文件

  1. config.properties :Presto 服务配置
  2. node.properties :环境变量配置,每个节点特定配置
  3. jvm.config :Java虚拟机的命令行选项
  4. log.properties: 允许你根据不同的日志结构设置不同的日志级别
  5. catalog目录 :每个连接者配置(data sources)

coordinator config.properties

包含了Presto server的所有配置信息。 每个Presto server既是一个coordinator也是一个worker。 但是在大型集群中,处于性能考虑,建议单独用一台机器作为 coordinator,一个coordinator的etc/config.properties应该至少包含以下信息:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=9000
query.max-memory=30GB
query.max-total-memory-per-node=6GB
query.max-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://10.111.0.0:9000

参数说明:

  1. coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)
  2. node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作, 对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worke将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行
  3. http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯
  4. task.max-memory=1GB:一个单独的任务使用的最大内存 (一个查询计划的某个执行部分会在一个特定的节点上执行)。 这个配置参数限制的GROUP BY语句中的Group的数目、JOIN关联中的右关联表的大小、ORDER BY语句中的行数和一个窗口函数中处理的行数。 该参数应该根据并发查询的数量和查询的复杂度进行调整。如果该参数设置的太低,很多查询将不能执行;但是如果设置的太高将会导致JVM把内存耗光
  5. discovery-server.enabled:Presto 通过Discovery 服务来找到集群中所有的节点。为了能够找到集群中所有的节点,每一个Presto实例都会在启动的时候将自己注册到discovery服务。Presto为了简化部署,并且也不想再增加一个新的服务进程,Presto coordinator 可以运行一个内嵌在coordinator 里面的Discovery 服务。这个内嵌的Discovery 服务和Presto共享HTTP server并且使用同样的端口
  6. discovery.uri:Discovery server的URI。由于启用了Presto coordinator内嵌的Discovery 服务,因此这个uri就是Presto coordinator的uri。注意:这个URI一定不能以“/“结尾

worker config.properties

coordinator=false
http-server.http.port=9000
query.max-memory=30GB
query.max-total-memory-per-node=10GB
query.max-memory-per-node=2GB
discovery.uri=http://10.111.0.0:9000

node.properties

包含针对于每个节点的特定的配置信息。 一个节点就是在一台机器上安装的Presto实例,etc/node.properties配置文件至少包含如下配置信息

node.environment=presto
node.id=
node.data-dir=/opt/bigdata/presto/data

参数说明:

  1. node.environment: 集群名称, 所有在同一个集群中的Presto节点必须拥有相同的集群名称
  2. node.id: 每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id
  3. node.data-dir: 数据存储目录的位置(操作系统上的路径), Presto将会把日期和数据存储在这个目录下

jvm.config

包含一系列在启动JVM的时候需要使用的命令行选项。这份配置文件的格式是:一系列的选项,每行配置一个单独的选项。由于这些选项不在shell命令中使用。 因此即使将每个选项通过空格或者其他的分隔符分开,java程序也不会将这些选项分开,而是作为一个命令行选项处理,信息如下:

-server
-Xmx10G
-Xms10G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
-XX:CMSInitiatingOccupancyFraction=70

log.properties

这个配置文件中允许你根据不同的日志结构设置不同的日志级别。每个logger都有一个名字(通常是使用logger的类的全标示类名). Loggers通过名字中的“.“来表示层级和集成关系,信息如下:

com.facebook.presto=DEBUG

配置日志等级,类似于log4j。四个等级:DEBUG,INFO,WARN,ERROR

Catalog Properties

通过在etc/catalog目录下创建catalog属性文件来完成catalogs的注册。 例如:可以先创建一个etc/catalog/jmx.properties文件,文件中的内容如下,完成在jmxcatalog上挂载一个jmxconnector

connector.name=jmx

在etc/catalog目录下创建hive.properties,信息如下:

connector.name=hive-hadoop2
hive.metastore.uri=thrift://10.111.0.0:9083
hive.config.resources=/opt/bigdata/hadoop/hadoop-2.8.0/etc/hadoop/core-site.xml, /opt/bigdata/hadoop/hadoop-2.8.0/etc/hadoop/hdfs-site.xml
hive.allow-drop-table=true

启动

在安装目录的bin/launcher文件,就是启动脚本。Presto可以使用如下命令作为一个后台进程启动:

bin/launcher start

也可以在前台运行, 可查看具体的日志

bin/launcher run

停止服务进程命令

bin/launcher stop

查看进程:

ps -aux|grep PrestoServer 或 jps

安装cli

https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/

./presto-cli-0.208-executable.jar --server 10.111.0.86:9000 --catalog hive --schema db_name;

WebUI

http://ip:9000/ui/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JackeyGao的博客

Django小技巧04: 自动日期时间字段

Django 的DateTimeField和DateField有两个非常有用的参数,用于自动管理时间。如果你需要跟踪保存纪录的创建时间和更改时间,则无须手动执行...

37530
来自专栏Python中文社区

听说 Django 与 celery 配合更美味

博客主页:https://www.zhihu.com/people/tu-dou-dou-27-10

12920
来自专栏数据和云

Oracle 12.2新特性掌上手册 - 第五卷 RAC and Grid

编辑手记:RAC是Oracle最重要的高可用架构之一,具有扩展性良好、实现负载均衡等多维度的优势,Oracle RAC提供了相应的集群软件和存储管理软件,今天我...

33140
来自专栏cmazxiaoma的架构师之路

MySQL复制性能优化和常见问题分析

二进制日志文件并不是每次写的时候都会同步到磁盘,当发生宕机的时候,可能会有最后一部分数据没有写入到binlog中,这给恢复和复制带来了问题。当sync_binl...

15020
来自专栏ChaMd5安全团队

Pentest box系列——爬坑记

0x0 前言 本文作为一篇记录文章,将各种问题进行统合,以便省去使用时出现问题百度的时间!其中一些地方参照了各位大佬的姿势,而大部分为偶在使用中...

1.4K90
来自专栏大内老A

谈谈分布式事务之二:基于DTC的分布式事务管理模型[上篇]

通过上一篇的介绍,我们知道了SOA真正需要的是一个能够协调服务操作直接(通过服务自身访问的资源)或者间接(通过被调用服务访问的资源)访问的所有资源的分布式事务管...

19370
来自专栏逸鹏说道

项目分布式部署那些事(2):一个简单的分布式锁

什么是锁,它用来解决什么问题? 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个...

285100
来自专栏我是攻城师

Bug死磕之hue集成的oozie+pig出现资源任务死锁问题

35260
来自专栏PPV课数据科学社区

工具 | 大数据系列(3)——Hadoop集群完全分布式坏境搭建

文|指尖流淌 前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一...

37360
来自专栏我叫刘半仙

SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架

前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置部署都变得简单,越来越多的互联网公司已经选择Spring...

1.4K130

扫码关注云+社区

领取腾讯云代金券