Presto 在 B 站的应用

Presto 在 B 站的应用
最前面有一层 dispatcher,使用了 Linkedin 开源的 coral 对语法做分析,转换
根据不同的 SQL 类型,转到不同的引擎
spark 用了 kyuubi 做了前端,实现多租户、高可用
presto 也是类似,前面有一个 gateway,实现高可用
另外所有的引擎都接入了 ranger,做鉴权

改造点
所有的请求经过 gateway 到 presto
探测 coordinator 状态,根据作业 ID 来选择机房调度
对 query 做解析,根据依赖的表和分区,选择合适的机房
探测 coordinator 负载,内存、作业堵塞,来选择负载均衡

coordinator 多活改造
使用 redis 作为持久注册
coordinator 启动时注册分布式锁
worker 读取 redis 获取对应的 coordinator
gateway 随机选择一个 coordinate,或者一直使用这个会话

稳定性方面
资源隔离方面,使用了 lable,根据已经配置好的 lable,动态选择对应的集群
同样的请求第二次路由,就会找低负载的集群
另外有惩罚措施,会占用过大的请求,会将惩罚下发到所有 worker 节点
gateway 会解析 SQL,替换表达式提取通用 MD5 特种,如果类似的请求出现,会做拦截,或者 kill
worker 端根据 MBean,kill 掉超过一定比例的 task
可用性方面
spark/hive 语法兼容
隐式转换,hive UDF 兼容,insert overwrite table
支持更多的数据源,多数据源联合查询
HDFS 上的 jar,动态加载 catalog
Job History 服务
监听发布系统 kill -15 信号,将自身状态改为非 activ,等完成任务再退出,实现无损发布
性能方面
增加 alluxio
开发 cache invalidate 服务,监听 hive meta event,根据分区路径删除无效缓存
查询结果做 MD5 提取,放到 redis,如果有 DDL 事件,根据分区,做缓存失效处理
高版本的 Dynamic Partition Pruning,根据这种思路重现实现改造的
多机房架构
用户侧统一接入 Presto gateway,每个机房部署独立 集群
访问单张表:调度到数据所在机房
多表在同一机房,作业路由到数据所在机房
多表在不同机房,路由到数据量较大的表所在机房,较小的表限流读
实现跨 IDC 的计算下推
多表访问时,将子查询下推第二机房,再跟主机房合并
通过血缘关系找出跨机房热分区,提前预加载到缓存

参考
官网
github
PrestoCon Day 2022 youtub
Presto 在 B 站的实践
Presto 在字节跳动的内部实践与优化(实践篇)
Presto 在字节跳动的内部实践与优化(优化篇)
Presto 实现原理和美团的使用实践
Presto 在滴滴的探索与实践
一文看懂 VLDB 22 技术趋势及精选论文
Presto:Meta 十年数据分析之旅
Speed Up Presto at Uber with Alluxio Local Cache
Engineering Data Analytics with Presto and Apache Parquet at Uber
Presto at Bytedance youtub
Data Lake Analytics: Alibaba’s Federated Cloud Strategy
Forecasting SQL query resource usage with machine learning
评论