天天看点

另一种扩展并加速Hadoop计算能力的计算架构—Presto

Hadoop自身的MapReduce计算框架是非常传统的批量处理模型,对这个模型大多数的应用都是基于Hive,直接使用SQL语句来操作并分析数据,但是在使用过程中,发现其计算的延迟性越来越成为一个显著的因素。因此,一种能够增加计算速度的计算模型还是必要的。

为了满足对于速度的需求,已经有很多基于Hadoop的新的计算框架诞生了,比如Cloudera发布的Impala,以及Apache Spark等都以内存计算框架的形式出现了。期间Facebook继发布Hive之后,为了进一步提升计算效率,开发了Presto,并且已经开源。

1. Presto是什么?

如同Hive一样,一个分布式的SQL执行引擎,但是它不是基于MapReduce计算模型;它是一个更快的交互式的数据分析工具(根据官方的给出的数据,是较Hive有10倍左右的性能提升),并且能够处理多种数据源。

2. 系统架构

Presto属于传统的主从结构,主要角色有两个:Coordinator和Worker。用户通过HTTP协议发送一个查询请求给Coordinator,Coordinator首先会通过Connector Plugin去找元数据(Hive的元数据,MySQL的元数据等等),以找到对应的表的结构,据此创建一个执行计划。;然后将任务发送给每个Worker,然后会通过Connector Plugin去读取相应的数据;然后,Workers在内存中运行任务;最后客户端会从一个Worker上获取到最终的结果。

Presto(0.76)目前的实现中,支持Cassandra/Hive/JMX/Kafka/MySQL/PostgreSQL等。

3. 部署

Presto与现有的Hadoop集群基本上是一种松散耦合的关系,更确切的说,它只与HDFS有联系,因为Presto需要从中读取数据。当然,它除了能够访问HDFS中的数据之外,还有上面提到的各种数据源。

第一步:明确系统的整体结构。在这里,我们需要确定两种角色的位置,Coordinator和Worker,Coordinator去指挥众多的Workers去工作。除此之外,还有一个Discovery Server的角色,它主要是保存Presto集群中关于Worker节点的元数据,Worker节点会周期性地向Discovery Server报送状态信息,而Coordinator安排工作的时候会使用到这些信息。

第二步:规划服务器:

lambda:负责Coordinator和Discovery Server的角色

a00,a01,a02:三台服务器担负Worker的角色

第三步:下载程序文件,到安装目录下,并做好链接

cd /opt/
wget http://central.maven.org/maven2/com/facebook/presto/presto-server/0.76/presto-server-0.76.tar.gz
tar xvzf presto-server-0.76.tar.gz
ln presto-server-0.76 presto -s
           
第四步:配置Coordinator (lambda)
cd /opt/ && mkdir etc
           
所有的配置文件都放在etc目录下。

1. 第一个需要创建的文件是config.properties,它主要包含了一些角色设定的开关:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://lambda:8080
           

从中我们可以看到,我们将lambda设置成了Coordinator:coordinator=true

我们禁止在Coordinator上运行任务:node-scheduler.include-coordinator=false

本机的PrestoServer所监听的端口:http-server.http.port=8080

单个任务可以使用的最大的内存:task.max-memory=1GB

并且,我们启用了Discovery Server:discovery-server.enabled=true

最后,我们指定了Discovery Server的地址:discovery.uri=http://lambda:8080

2. JVM启动参数配置——jvm.config:

-server
-Xmx4G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:PermSize=150M
-XX:MaxPermSize=150M
-XX:ReservedCodeCacheSize=150M
-Xbootclasspath/p:/opt/presto/lib/floatingdecimal-0.1.jar
-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64
           

需要注意的是最后两行:

-Xbootclasspath/p:/opt/presto/lib/floatingdecimal-0.1.jar:这会在解析浮点数的时候,提升性能

-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64:这是为了在Presto中支持LZO

3. 配置日志级别——log.properties

com.facebook.presto=INFO
           

4. 配置与本节点密切相关的一些元数据:

node.environment=production
node.id=24a2f667-0395-402d-8521-303050cda031
node.data-dir=/var/presto/data
           

node.environment=production: 设置环境的名称,同一集群中的Presto节点必须有相同的环境名

node.id=24a2f667-0395-402d-8521-303050cda031:节点独一无二的标识,Presto服务的重启、更新前后,这个值必须一致。

node.data-dir=/var/presto/data:Presto存储日志和其它数据的地方。

5.  配置catalog:

mkdir catalog && cd catalog
           

在其中新建一个Hive的配置:hive.properties,其配置内容为:

connector.name=hive-cdh5
hive.metastore.uri=thrift://gamma:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
           

connector.name=hive-cdh5: 集群的版本是CDH5,故我们使用这个插件

hive.metastore.uri=thrift://gamma:9083:这个是Hive元数据服务的地址

hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml:由于使用了HDFS HA,我们需要指定一下HDFS相关配置文件。

通过以上的四步,Coordinator已经设置完毕。

下面来设置Workers。其实,所有的配置的目录结构都是一样的,只需要修改上述的两个文件就可以达成Workers上的统一配置:

修改第一个文件:config.properties:

coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery.uri=http://lambda:8080
           

我们看到,作为Worker节点,已经将coordinator禁用掉:coordinator=false;

PrestoServer的监听地址,还是8080端口;

单任务内存数还是1GB;

指向我们的DiscoveryServer:discovery.uri=http://lambda:8080

修改第二个文件:node.properties

node.environment=production
node.id=c0550bd7-fcc2-407d-bfda-b1f26fb341b0
node.data-dir=/var/presto/data
           

除了node.id的配置修改外,其它都保持一致即可,这个ID需要每个节点都不同,所以,这个不能简单的拷贝到其它Worker节点上,而要在每个节点上都修改成一个独一无二的值,我这里是通过uuidgen这个命令来生成的这个串。

4. 添加对LZO的支持:

1. 我们需要在每个Presto节点上的对应的插件目录下,放置hadoop-lzo.jar文件,以使其运行时可以加载到相关类:
cd /opt/presto/plugin/hive-cdh5
cp /usr/lib/hadoop/lib/hadoop-lzo.jar .
           
2. JVM启动参数中,添加如下参数:
-Djava.library.path=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64
           
这样,HDFS中的LZO文件就可以正常访问到了。

5. 关于性能的一些测试经验:

 如果不禁止Coordinator上运行任务(node-scheduler.include-coordinator=false),那么性能的降低也非常明显。

以上,只是一些尝试性的总结和经验,希望能对有需要的同学有帮助,如果文中有疏漏或者错误,也欢迎大家不吝赐教。

关于Presto的有用的资料:

http://prestodb.io/docs/current/installation/deployment.html
http://www.slideshare.net/frsyuki/presto-hadoop-conference-japan-2014

继续阅读