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
node.environment=production
node.id=24a2f667-0395-402d-8521-303050cda031
node.data-dir=/var/presto/data
node.id=24a2f667-0395-402d-8521-303050cda031:节点独一无二的标识,Presto服务的重启、更新前后,这个值必须一致。
node.data-dir=/var/presto/data:Presto存储日志和其它数据的地方。
5. 配置catalog:
mkdir catalog && cd catalog
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
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
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
5. 关于性能的一些测试经验: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文件就可以正常访问到了。
以上,只是一些尝试性的总结和经验,希望能对有需要的同学有帮助,如果文中有疏漏或者错误,也欢迎大家不吝赐教。
如果不禁止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