
桔妹导读:Presto在滴滴内部发展三年,已经成为滴滴内部Ad-Hoc和Hive SQL加速的首选引擎。目前服务6K+用户,天天读取2PB ~ 3PB HDFS数据,处理30万亿~35万亿条记录,为了承接业务及丰富使用场景,滴滴Presto须要解决稳定性、易用性、性能、成本等诸多问题。咱们在3年多的时间里,作了大量优化和二次开发,积攒了很是丰富的经验。本文分享了滴滴对Presto引擎的改进和优化,同时也提供了大量稳定性建设经验。html


-
彻底基于内存的并行计算 -
流水线 -
本地化计算 -
动态编译执行计划 -
当心使用内存和数据结构 -
GC控制 -
无容错

-
Hive SQL查询加速 -
数据平台Ad-Hoc查询 -
报表(BI报表、自定义报表) -
活动营销 -
数据质量检测 -
资产管理 -
固定数据产品







-
PrestoSQL社区活跃度更高,PR和用户问题可以及时回复 -
PrestoDB主要主力仍是Facebook维护,以其内部需求为主 -
PrestoDB将来方向主要是ETL相关的,咱们有Spark兜底,ETL功能依赖Spark、Hive

-
隐式类型转换 -
语义兼容 -
语法兼容 -
支持Hive视图 -
Parquet HDFS文件读取支持 -
大量UDF支持 -
其余


-
latency高,QPS较低 -
不能查实时数据,若是有实时数据需求,须要再构建一条实时数据链路,增长了系统的复杂性 -
要想得到极限性能,必须与HDFS DataNode 混部,且DataNode使用高级硬件,有自建HDFS的需求,增长了运维的负担
-
结合 Druid 的预聚合、计算能力(过滤聚合)、Cache能力,提高Presto性能(RT与QPS) -
让 Presto 具有查询 Druid 实时数据能力 -
为Druid提供全面的SQL能力支持,扩展Druid数据的应用场景 -
经过Druid Broker获取Druid元数据信息 -
从Druid Historical直接获取数据 -
实现了Limit下推、Filter下推、Project下推及Agg下推
-
没法划分多个Split,查询性能差 -
请求查询Broker,以后再查询Historical,多一次网络通讯 -
对于一些场景,如大量Scan场景,会致使Broker OOM -
Project及Agg下推支持不完善

-
租户与权限 -
与内部Hadoop打通,使用HDFS SIMPLE协议作认证 -
使用Ranger作鉴权,解析SQL使Presto拥有将列信息传递给下游的能力,提供用户名+数据库名/表名/列名,四元组的鉴权能力,同时提供多表同时鉴权的能力 -
用户指定用户名作鉴权和认证,大帐号用于读写HDFS数据 -
支持视图、表别名鉴权
-
语法拓展 -
支持add partition -
支持数字开头的表 -
支持数字开头的字段
-
特性加强 -
insert数据时,将插入数据的总行数写入HMS,为业务方提供毫秒级的元数据感知能力 -
支持查询进度滚动更新,提高了用户体验 -
支持查询能够指定优先级,为用户不一样等级的业务提供了优先级控制的能力 -
修改通讯协议,支持业务方能够传达自定义信息,知足了用户的日志审计须要等 -
支持DeprecatedLzoTextInputFormat格式 -
支持读HDFS Parquet文件路径
-
经过Presto Plugin实现日志审计功能 -
经过JMX获取引擎指标将监控信息写入Ganglia -
将日志审计采集到HDFS和ES; 统一接入运维监控体系,将全部指标发到 Kafka; -
Presto UI改进: 能够查看Worker信息,能够查看Worker死活信息

在Presto交流社区,Presto的稳定性问题困扰了不少Presto使用者,包括Coordinator和Worker挂掉,集群运行一段时间后查询性能变慢等。咱们在解决这些问题时积累了不少经验,这里说下解决思路和方法。前端
根据职责划分,Presto分为Coordinator和Worker模块,Coordinator主要负责SQL解析、生成查询计划、Split调度及查询状态管理等,因此当Coordinator遇到OOM或者Coredump时,获取元信息及生成Splits是重点怀疑的地方。而内存问题,推荐使用MAT分析具体缘由。以下图是经过MAT分析,得出开启了FileSystem Cache,内存泄漏致使OOM。web

-
使用HDFS FileSystem Cache致使内存泄漏,解决方法禁止FileSystem Cache,后续Presto本身维护了FileSystem Cache -
Jetty致使堆外内存泄漏,缘由是Gzip致使了堆外内存泄漏,升级Jetty版本解决 -
Splits太多,无可用端口,TIME_WAIT过高,修改TCP参数解决 -
JVM Coredump,显示"unable to create new native thread",经过修改pid_max及max_map_count解决 -
Presto内核Bug,查询失败的SQL太多,致使Coordinator内存泄漏,社区已修复
-
经过Resource Group控制业务并发,防止严重超卖 -
经过JVM调优,解决一些常见内存问题,如Young GC Exhausted -
善用MAT工具,发现内存瓶颈

-
Sys load太高,致使业务查询性能影响很大,研究jvm原理,经过参数(-XX:PerMethodRecompilationCutoff=10000 及 -XX:PerBytecodeRecompilationCutoff=10000)解决,也可升级最新JVM解决 -
Worker查询hang住问题,缘由HDFS客户端存在bug,当Presto与HDFS混部署,数据和客户端在同一台机器上时,短路读时一直wait锁,致使查询Hang住超时,Hadoop社区已解决 -
超卖致使Worker Young GC Exhausted,优化GC参数,如设置-XX:G1ReservePercent=25 及 -XX:InitiatingHeapOccupancyPercent=15 -
ORC太大,致使Presto读取ORC Stripe Statistics出现OOM,解决方法是限制ProtoBuf报文大小,同时协助业务方合理数据治理 -
修改Presto内存管理逻辑,优化Kill策略,保障当内存不够时,Presto Worker不会OOM,只须要将大查询Kill掉,后续熔断机制会改成基于JVM,相似ES的熔断器,好比95% JVM 内存时,Kill掉最大SQL
-
某业务集群进行了JVM调优,将Ref Proc由单线程改成并行执行,普通查询由30S~1分钟下降为3-4S,性能提高10倍+ -
ORC数据优化,将指定string字段添加了布隆过滤器,查询性能提高20-30%,针对一些业务作了调优 -
数据治理和小文件合并,某业务方查询性能由20S下降为10S,性能提高一倍,且查询性能稳定 -
ORC格式性能优化,查询耗时减小5% -
分区裁剪优化,解决指定分区但获取全部分区元信息问题,减小了HMS的压力 -
下推优化,实现了Limit、Filter、Project、Agg下推到存储层
-
Presto on Alluxio查询性能提高35%,可是内存占用和性能提高不成正比,因此咱们放弃了Presto on Alluxio,后续可能会对一些性能要求敏感的业务使用 -
Presto on Carbondata是在18年8月份测试的,当时的版本,Carbondata稳定性较差,性能没有明显优点,一些场景ORC更快,因此咱们没有再继续跟踪调研Presto on Carbondata。 由于滴滴有专门维护Druid的团队,因此咱们对接了Presto on Druid,一些场景性能提高4~5倍,后续咱们会更多关注Presto on Clickhouse及Presto on Elasticsearch

经过以上工做,滴滴Presto逐渐接入公司各大数据平台,并成为了公司首选Ad-Hoc查询引擎及Hive SQL加速引擎,下图能够看到某产品接入后的性能提高:算法

上图能够看到大约2018年10月该平台开始接入Presto,查询耗时TP50性能提高了10+倍,由400S下降到31S。且在任务数逐渐增加的状况下,查询耗时保证稳定不变。数据库
而高性能集群,咱们作了不少稳定性和性能优化工做,保证了平均查询时间小于2S。以下图所示:数组


可是若是看最近一个月的CPU使用率会发现,平均CPU使用率比较低,且波峰在白天10~18点,晚上基本上没有查询,CPU使用率不到5%。以下图所示:性能优化

因此,解决晚上资源浪费问题是咱们从此须要解决的难题。微信
同时,为了避免与开源社区脱节,咱们打算升级PrestoDB 0.215到PrestoSQL 340版本,届时会把咱们的Presto on Druid代码开源出来,回馈社区。网络
▬
滴滴Presto引擎负责人,负责带领引擎团队深刻Presto内核,解决在海量数据规模下Presto遇到的稳定性、性能、成本方面的问题。搜索引擎及OLAP引擎爱好者,公众号:FFCompute

关于团队数据结构
▬
滴滴大数据架构部 OLAP & 检索平台组负责以 Elasticsearch、Clickhouse、Presto 及 Druid 为表明的 OLAP 引擎的内核级极致优化,为滴滴各个产品线提供稳定可靠的 PB 级海量数据的实时数据分析、日志检索、监控及即席查询服务。
博闻强识,招贤纳士,滴滴用广阔的舞台,在这里,等待你!

扫描了解更多岗位

本文分享自微信公众号 - 滴滴技术(didi_tech)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。