专栏首页Hadoop实操如何在CDH集群中部署Presto

如何在CDH集群中部署Presto

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.文档编写目的


Presto是由Facebook开源,完全基于内存的并行计算以及分布式SQL交互式查询引擎。它可以共享Hive的元数据,然后直接访问HDFS中的数据,同时支持Hadoop中常见的文件格式比如文本,ORC和Parquet。同Impala一样,作为Hadoop之上的SQL交互式查询引擎,通常比Hive要快5-10倍。另外,Presto不仅可以访问HDFS,还可以访问RDBMS中的数据,以及其他数据源比如CASSANDRA。

Presto是一个运行在多台服务器上的分布式系统。 完整安装包括一个coordinator和多个worker。 由客户端提交查询,从Presto命令行CLI提交到coordinator。 coordinator进行解析,分析并执行查询计划,然后分发处理队列到worker。

本篇文章Fayson主要介绍如何在CDH集群部署Presto并与Hive集成。

  • 内容概述:

1.安装准备及环境说明

2.Presto部署及Hive集成

3.Presto与Hive集成测试

4.总结

  • 测试环境:

1.CM5.14.3/CDH5.14.2

2.Presto版本0.205

3.操作系统版本为Redhat7.3

4.采用root用户进行操作

2.安装准备及环境说明


1.Presto部署节点及角色说明

IP地址

HOSTNAME

NodeID

角色

172.27.0.4

cdh01.fayson.com

presto-cdh01

coordinator

172.27.0.11

cdh02.fayson.com

presto-cdh02

worker

172.27.0.7

cdh03.fayson.com

presto-cdh03

worker

172.27.0.3

cdh04.fayson.com

presto-cdh04

worker

Presto服务的安装目录为/opt/cloudera/parcels/presto

2.在Presto官网下载presto-server-0.205.tar.gz安装包

下载地址:

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

将下载好的presto-server-0.205.tar.gz上传至Presto集群的所有服务器上

3.将presto-server-0.205.tar.gz压缩包解压至/opt/cloudera/parcels目录

[root@cdh01 presto]# tar -zxvf presto-server-0.205.tar.gz -C /opt/cloudera/parcels/

为presto-server-0.205创建persto软链接

[root@cdh01 parcels]# ln -s presto-server-0.205 presto

该步骤需要在Presto集群的所有节点进行操作,这里以cdh01.fayson.com节点为例。

4.在/opt/cloudera/parcels/presto/bin/launcher文件如下位置添加JAVA环境变量

JAVA_HOME=/usr/java/jdk1.8.0_131
PATH=$JAVA_HOME/bin:$PATH

使用这种方式就可以直为Presto服务指定JAVA环境,而不会影响服务器上其它服务的JAVA环境。

3.准备Presto的配置文件


1.新建node.properties文件,内容如下:

[root@cdh01 presto-etc]# vim etc/node.properties
node.environment=faysonpresto
node.id=presto-cdh01
node.data-dir=/data/disk1/presto

配置说明:

node.environment:集群名称。所有在同一个集群中的Presto节点必须拥有相同的集群名称。

node.id:每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id。

node.data-dir:数据存储目录的位置(操作系统上的路径)。Presto将会把日期和数据存储在这个目录下。

2.配置Presto的JVM参数,创建jvm.config文件,内容如下:

[root@cdh01 presto-etc]# vim jvm.config
-server
-Xmx8G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M

配置文件的格式是:一系列的选项,每行配置一个单独的选项。由于这些选项不在shell命令中使用。因此即使将每个选项通过空格或者其他的分隔符分开,java程序也不会将这些选项分开,而是作为一个命令行选项处理。(就想下面例子中的OnOutOfMemoryError选项)。

由于OutOfMemoryError将会导致JVM处于不一致状态,所以遇到这种错误的时候我们一般的处理措施就是将dump headp中的信息(用于debugging),然后强制终止进程。

Presto会将查询编译成字节码文件,因此Presto会生成很多class,因此我们我们应该增大Perm区的大小(在Perm中主要存储class)并且要允许Jvm class unloading。

3.创建config.properties文件

该配置文件包含了Presto Server的所有配置信息。每个Presto Server既是Coordinator也是一个Worker。在大型集群中,处于性能考虑,建议单独用一台服务器作为Coordinator。

coordinator节点的配置如下:

[root@cdh01 presto-etc]# vim coordinator-config.properties 
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=4GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://cdh01.fayson.com:8080

worker节点的配置如下:

[root@cdh01 presto-etc]# vim worker-config.properties 
coordinator=false
http-server.http.port=8080
query.max-memory=4GB
query.max-memory-per-node=1GB
discovery.uri=http://cdh01.fayson.com:8080

配置项说明:

coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)。

node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作。对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worke将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都不会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行。

http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯。

discovery.uri:Discoveryserver的URI。由于启用了Prestocoordinator内嵌的Discovery 服务,因此这个uri就是Prestocoordinator的uri。修改example.net:8080,根据你的实际环境设置该URI。注意:这个URI一定不能以“/“结尾。

4.新建日志文件log.properties,内容如下

[root@cdh01 presto-etc]# vim log.properties
com.facebook.presto=INFO

4.将准备好的配置文件分发


1.在Presto集群所有节点创建/opt/cloudera/pracles/presto/etc目录

[root@cdh01 shell]# sh ssh_do_all.sh node.list "mkdir -p /opt/cloudera/parcels/presto/etc"

2.将node.properties拷贝至Presto集群的所有节点

[root@cdh01 shell]# sh bk_cp.sh node.list /root/presto-etc/node.properties /opt/cloudera/parcels/presto/etc/

注意:这里拷贝了需要将Presto所有节点的node.id修改为对应节点的ID。

3.将jvm.config和log.properties配置文件拷贝至Presto集群所有节点

[root@cdh01 shell]# sh bk_cp.sh node.list /root/presto-etc/jvm.config /opt/cloudera/parcels/presto/etc/
[root@cdh01 shell]# sh bk_cp.sh node.list /root/presto-etc/log.properties /opt/cloudera/parcels/presto/etc/

4.将coordinator-config.properties文件拷贝至cdh01节点,并充命名为config.properties

[root@cdh01 presto-etc]# cp coordinator-config.properties /opt/cloudera/parcels/presto/etc/config.properties
[root@cdh01 presto-etc]# ll /opt/cloudera/parcels/presto/etc/

5.将worker-config.properties文件拷贝至Presto集群的worker节点,并重命名为config.properties

[root@cdh01 shell]# sh bk_cp.sh worker.node.list /root/presto-etc/worker-config.properties /opt/cloudera/parcels/presto/etc/config.properties

至此就完成了Presto集群的部署。

5.Presto服务启停


1.在Presto集群的所有节点执行如下命令启动Presto服务

[root@cdh01 bin]# /opt/cloudera/parcels/presto/bin/launcher start

2.在Presto集群的所有节点执行如下民拿过来停止Presto服务

[root@cdh01 bin]# /opt/cloudera/parcels/presto/bin/launcher stop

关于Presto的更多命令,可以通过如下命令查看

[root@cdh01 bin]# /opt/cloudera/parcels/presto/bin/launcher --help

6.Presto集成Hive


1.在Presto集群的所有节点创建目录,命令如下:

[root@cdh01 shell]# sh ssh_do_all.sh node.list "mkdir -p /opt/cloudera/parcels/presto/etc/catalog"

2.创建hive.properties,该文件与Hive服务集成使用,内容如下:

[root@cdh01 presto-etc]# vim hive.properties 
connector.name=hive-hadoop2
hive.metastore.uri=thrift://cdh01.fayson.com:9083

3.将hive.properties配置文件拷贝至Presto集群所有节点${PRESTO_HOME}/etc/catalog目录下

[root@cdh01 shell]# sh bk_cp.sh node.list /root/presto-etc/hive.properties /opt/cloudera/parcels/presto/etc/catalog

4.修改presto的jvm.config,在配置文件中增加Presto访问HDFS的用户名

[root@cdh01 presto-etc]# vim jvm.config 
-server
-Xmx8G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
-DHADOOP_USER_NAME=presto

将修改后的jvm.config文件同步至Presto集群所有节点的/opt/cloudera/parcels/presto/etc目录下。

5.上面的配置中指定了presto用户作为访问HDFS的用户,需要在集群所有节点添加presto用户

[root@cdh01 shell]# sh ssh_do_all.sh node.list "useradd presto"

6.重启Presto服务,在Presto集群所有节点执行如下命令:

/opt/cloudera/parcels/presto/bin/launcher restart

7.Presto与Hive集成测试


这里测试Presto与Hive的集成使用Presto提供的Presto CLI,该CLI是一个可执行的JAR文件,也意味着你可以想UNIX终端窗口一样来使用CLI。

1.下载Presto的presto-cli-0.205-executable.jar,并重命名为presto并赋予可以执行权限

https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.205/presto-cli-0.205-executable.jar
[root@cdh01 presto-etc]# mv presto-cli-0.205-executable.jar presto
[root@cdh01 presto-etc]# chmod +x presto 
[root@cdh01 presto-etc]# ll presto 

2.集群启用了Sentry,这里我们使用presto用户访问Hive所以为presto用户授权default库的所有权限

3.在命令行执行命令访问Hive库

[root@cdh01 presto-etc]# ./presto --server localhost:8080 --catalog=hive --schema=default

登录Presto的8080界面查看SQL执行记录

8.总结


1.在指定Presto的node.environment名称时需要注意,不能包含特殊字符如“-”,否则在启动时会报错“Error: Constraint violation with property prefix'': environment is malformed”

2.Presto服务和Presto CLI均是JAVA实现,所以在部署前需要安装好JAVA的环境

3.由于Fayson的集群启用了Sentry,所以在访问hive表时,需要为presto用户授权,否则访问表时会报没有权限读写HDFS目录。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

本文分享自微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-02

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何为Presto集成Kerberos环境下的Hive

    Fayson
  • 0588-6.1.0-命令行动态指定MapReduce运行参数无效问题分析

    在本地完成MapReduce程序的开发后,打包提交到服务器上,然后在命令行使用hadoop jar命令运行,并在运行时动态的指定参数(如:Map和Reduce的...

    Fayson
  • Druid Segment Balance 及其代价计算函数分析

    Druid 的查询需要有实时和历史部分的 Segment,历史部分的 Segment 由 Historical 节点加载,所以加载的效率直接影响了查询的 RT(...

    Fayson
  • 使用JS生成Audio元素

    https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement

    山河木马
  • 当心外部连接中的ON子句

           在SQL tuning中,不良写法导致SQL执行效率比比皆是。最近的SQL tuning中一个外部连接写法不当导致过SQL执行时间超过15分钟左右...

    Leshami
  • truncate分区表的操作,会导致全局索引失效?

    truncate是删除数据操作,但他是DDL语句,不是delete这种DML语句,不会写redo和undo,不能rollback。

    bisal
  • 巧用parallel极速提升数据加载速度(r2第21天)

    并行在平时工作中可能不是很注意,因为有时候即使设定了parallel 相关的hint,感觉性能也好不到哪去。这是我以前的感觉。 今天通过一个案例来分享一下通过p...

    jeanron100
  • MPEG4视频中,I帧、p帧、B帧的判定(转载) By HKL,

    mpeg4的每一帧开头是固定的:00 00 01 b6,那么我们如何判断当前帧属于什么帧呢?在接下来的2bit,将会告诉我们答案。注意:是2bit,不是byte...

    hiplon
  • python 创建自己的包

    创建一个文件夹:mymath,在该文件夹下创建三个python 文件,分别为:__init__.py   getMax.py     getMin.py

    py3study
  • 常用linux监控命令

    查看性能使用率进程 # yum -y install htop #htop ? 查看I/O使用情况 #yum -y install iotop #iotop...

    零月

扫码关注云+社区

领取腾讯云代金券