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/dataworker的配置实际上类似,只有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端全部自己制定,包括权限啊等等。