hadoop用来做数据仓库的主流技术HIVE比重比较大,支持SQL是原因之一。除此之外,还有一个原因是HADOOP生态圈能够用来作为仓库技术的实际并不多,但是HIVE的缺陷也很明显,那就是慢,因此才有impala之类的查询引擎出现。presto和impala有些类似,也是作为一个中间层的查询引擎,数据存储可以支持HIVE,HDFS,其他一些关系型数据库,这一点比impala要好,impala 仅仅附加在hive之上,kudu的出现算是对impala另外一个提升,毕竟修改数据在数据仓库中也是正常的。 问题在于impala这个玩意不是ANSI SQL,在SQL聚合等方面功能相对较弱,而presto支持ANSI SQL弥补了这个缺点。presto在DML方面很弱,因此各有各的好处,实际上就没有一个完美的方案。
接下来先安装presto再做一些测试,安装比较简单,下载好presto的压缩包,解压到一个目录,新建一个etc目录,添加以下4个配置文件,配置分为2种, coodinator和worker,下面是coordinator的配置:
[root@datanode03 etc]# cat config.properties
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8888
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://10.215.4.166:8888
[root@datanode03 etc]# cat jvm.config
-server
-Xmx2G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
[root@datanode03 etc]# cat log.properties
com.facebook.presto=INFO
[root@datanode03 etc]# cat log.properties
com.facebook.presto=INFO
[root@datanode03 etc]# cat node.properties
node.environment=prod
node.id=ffffffff-ffff-ffff-ffff-ffffffffff01
node.data-dir=/data/presto-server-0.192/data
worker的配置实际上类似,只有2个文件不同:
[root@datanode04 etc]# cat config.properties
coordinator=false
http-server.http.port=8888
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery.uri=http://10.215.4.166:8888
[root@datanode04 etc]# cat node.properties
node.environment=prod
node.id=ffffffff-ffff-ffff-ffff-ffffffffff02
node.data-dir=/data/presto-server-0.192/data
文件配置好之后就是启动, presto对jdk的版本有要求,根据错误提示进步修正即可。
bin/launcher start
启动完成之后会有一个web ui,就是开始配置文件的那个地址和端口.
默认presto不带cli, 还需要单独下载,真是有点奇葩。另外就是配置 connector, presto支持HIVE, 其他数据库等等,还支持kafka。
配置hive connector, 在presto目录下的etc下,新建 catalog,然后添加connector的配置:
[root@datanode03 catalog]# cat hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://10.215.4.164:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml, /etc/hadoop/conf/hdfs-site.xml
hive.allow-drop-table=true
下载cli之后,修改为可执行,就可以查看具体使用方法:
./presto --server localhost:8888 --catalog hive --schema default
[root@datanode03 presto-server-0.192]# ./presto --server localhost:8888 --catalog hive --schema default
presto:default> show tables;
Table
---------------
a_statistic
customers
jlwang
parquet_table
sample_07
sample_08
t_topic_5008
test
test1
test2
test3
test4
topic_5003
topic_5008
web_logs
(15 rows)
Query 20180201_092039_00053_jv5np, FINISHED, 2 nodes
Splits: 18 total, 18 done (100.00%)
0:00 [15 rows, 376B] [81 rows/s, 1.99KB/s
安装配置就结束了,可以开始使用。 通过sqoop抽取数据到HIVE,然后使用presto查询。
import -connect jdbc:mysql://10.10.188.178:3306/servicedata -username admin -password internal -table topic_5003 -hive-table topic_5003 -hive-database default -hive-import -hive-overwrite --as-parquetfile
测试查询:
presto:default> select count(*) from topic_5003;
_col0
----------
28877609
(1 row)
Query 20180201_092557_00057_jv5np, FINISHED, 1 node
Splits: 36 total, 36 done (100.00%)
0:01 [28.9M rows, 406MB] [37.5M rows/s, 527MB/s]
2800万的表 count只花了1秒,hive就不测试了,大家可以想象多少时间。
presto有很多东西也是不支持的,比如不支持HIVE关联hbase的表,会报错,因为inputformat和outputformat不允许为空,
也不支持sqoop默认抽取的格式,上面我使用的是parquet是presto支持的。
presto:default> select * from test;
Query 20180201_092939_00058_jv5np failed: outputFormat should not be accessed from a null StorageFormat
因为presto是内存计算,如果内存不够会出现oom:
presto:default> select id from topic_5003 group by id;
Query 20180201_093132_00066_jv5np, FAILED, 1 node
Splits: 67 total, 43 done (64.18%)
0:25 [27.2M rows, 387MB] [1.08M rows/s, 15.4MB/s]
Query 20180201_093132_00066_jv5np failed: Query exceeded local memory limit of 1GB
presto:default> select count(*) from (select equ_serialno,count(*) from topic_5003 group by equ_serialno);
_col0
-------
1341
(1 row)
Query 20180201_093429_00069_jv5np, FINISHED, 1 node
Splits: 68 total, 68 done (100.00%)
0:03 [28.9M rows, 406MB] [8.57M rows/s, 121MB/s]
2800W的数据做group by速度竟然如此之快,这是超过我想象的,要知道我就一个worker,而且配置的内存很少。
presto作为实时查询引擎来说,还是非常不错的,支持ANSI SQL,性能又快,impala本身其实也不错,但是不支持ANSI SQL是一个很大的弊端。
另外presto有很多web ui来支持查询,有airpal, shib等,从我个人测试来,全部是垃圾,我说的不是某一个,我指的是全部。网上竟然那么多人会推荐使用airpal,甚至美团也写了相关文章说airpal。 有人也通过 hue来访问presto,没有问题,但是hue默认是不支持presto的,还需要通过postgres来跳转一次,这太不方便了。
总之开源web UI大家不要抱有太大期望,以前我写过一个UI,通过zeeplin的REST接口来访问HIVE,然后做展示。 presto本身没有提供相应的REST API,我翻阅了少部分airpal代码,看他是怎么来连接presto的,发现presto有几个接口,如果要自己写UI,那么调用airpal的接口,返回数据进行展示,这样的话UI端全部自己制定,包括权限啊等等。