《专场13.3-Presto在b站的性能优化-郭建华.pdf》由会员分享,可在线阅读,更多相关《专场13.3-Presto在b站的性能优化-郭建华.pdf(36页珍藏版)》请在三个皮匠报告上搜索。
1、Presto在B站性能优化郭建华+b站+研发工程师个人简介个人简介 20162020 携程大数据离线平台 2020至今 B站大数据离线平台 负责Presto计算引擎目录目录1.架构2.Presto集群现状3.Presto Local Cache4.Presto Index5.后续工作架构架构Presto集群现状集群现状 30W/天 20PB/天 1200+Worker 2 IDC/6 cluster Presto-330Presto集群现状集群现状Presto Local Cache-背景背景1.容易受到慢DN影响,导致查询不稳定2.少量热表反复被查询3.减少网络传输,增加locality提升
2、查询性能Presto Local Cache-热度统计热度统计Presto Local Cache-热度统计热度统计Presto Local Cache-如何只缓存热表如何只缓存热表1.开发一个标记服务,将适合缓存的分区进行标记2.Presto在构建split时,load partition即可识别Presto Local Cache-架构架构1.强依赖HMS,且频繁请求2.构建split,访问NN获取FileStatus3.读数据,访问DN读blockPresto Local Cache-架构架构1.基于版本的元数据缓存2.主节点支持开启FileStatus cache3.HDFS数据缓存到
3、worker的ssd中4.Worker缓存orc/parquet的footer信息5.主节点软亲和调度Presto Local Cache-Soft-Affinity调度调度热点问题:热点问题:1.WorkerID1=Hash(splitID)%workerCount2.WorkerID2=Hash(splitID)%workerCount+1TaskTask集中问题:集中问题:Hive、iceberg、hudi:public String getSoftAffinityFilePath()return path+start;节点缩扩容问题节点缩扩容问题:Presto Local Cache-
4、Soft-Affinity调度调度分布不均问题:分布不均问题:掉线一台节点,相邻节点承载掉线节点全部负载解决:引入虚拟节点的概念1.更好的负载分布2.掉线节点负载均摊给各节点Presto Local Cache-本地磁盘管理本地磁盘管理1.Presto worker通过集成了AlluxioCachingFileSystem来进行热数据缓存2.读过来的数据被分成1MB为一个单位进行存储管理3.基于LRU来清理缓存块如何解决缓存失效问题?如何解决缓存失效问题?1.我们将split的FileModifiedTime 传递到FileContext2.pageSource再将该时间传递给LocalFS3
5、.LocalFS缓存Page的时候,将time写入元 数据4.LocalFS读文件的时候将该时间和存储的FileMeta中的时间进行对比Presto Local Cache-改进改进1.bugs一、FileSystem提前closeFileSystemCache涉及到对象回收的一个bugprestodb-17356二、disabled Filesystem cache情况下,viewfs 存在bugprestodb-17366三、insert语句存在跨namespace问题prestodb-17389Presto Local Cache-改进改进问题2:CacheManager只支持单路径社区
6、:社区:通过hash&mod的方式存入多磁盘改造:改造:基于AvailableSpace来做磁盘选择(借鉴HDFS)Presto Local Cache-改进改进问题3:HMS不支持获取带版本的Partition和table开启:改造:改造:HMS基于分区的lastModifyTime新增版本APIhive.partition-versioning-enabled=true异常:UnsupportedOperationExceptionPresto Local Cache-性能对比性能对比TPCH:30%数倍性能提升Presto Local Cache-线上情况线上情况 上线6个集群 分区走C
7、ache命中率40%Presto Index-背景背景1.ORC/parquet 内嵌index少2.文件中的index只能在worker端读的时候进行过滤3.合适的index,能过显著提升查询性能Presto Index-架构架构1.实现index语法,构建index数据,并写入到Hdfs中进行持久化。2.Coordinator侧source split调度利用index进行过滤。3.Worker侧在读orc文件时,根据index过滤stripe或者具体的行数据。Presto Index-indexes1.BitMap1.BitMap IndexIndex为索引字段的每个stripe构建bi
8、tmap+btree特点:1.数据量大,低基数列2.直接读取相应行数数据3.支持区间查询和点查缺点:1.只能在worker端过滤行2.不适合大基数列/hive/db/tbl/000.orcnameheightbobhighalexmiddlesamlowpeterhighkaelmiddleauxlow123456high100100middle010010low001001Presto Index-indexes2.BloomfilterBloomfilter IndexIndex(1)对索引列的每个stripe维护一个Bloomfilter对象,直接将列值读入去重后插入BloomFilte
9、r。特点:1.相对BitMap更节省存储2.能在coordinator过滤split3.能够适用高基数列缺点:1.只能应用等值表达式“=”“in”Presto Index-indexes3.MinMin-MaxMax IndexIndex记录了每个Stripe的min-max值特点:1.占用空间小,2.适合coordinator过滤split缺点:1.需要对column进行排序Presto Index-column热度收集热度收集获取colunn热度的时候,需要将能过下推到TableScan的表达式来统计column热度思路:Optimizer:PushPredicateIntoTableSc
10、an1.将Filter的expression 尝试将Predicate下推到TableScan2.如果能过下推的Predicate,表达式存在HiveTableHandle 的effectivePredicate中提取下推column及表达式:使用Visitor遍历Logical Plan在遍历到FileterNode,并且起Source为TableScan,则可以很方便的提取Column以及下推表达式Res:effectivePredicate:hive:tmp_bdp:tmp_test_index.a:=:1,hive:tmp_bdp:tmp_test_index.b:=:1,Presto
11、 Index-column热度收集热度收集Presto Index-自动构建自动构建index1.根据上述column 热度信息进行排序2.过滤掉不合法的column信息(分区字段、非orc、复杂类型)3.根据决策树,在hms中响应表中打上index tag4.消费hms event 事件,自动构建相应indexPresto Index-如何选择如何选择index1.低基数选择BitMap2.点查选择Bloom3.否则min-max,并且标记进行localsortPresto Index-语法语法创建:CREATE INDEX index_name USING bloom ON hive.schema.table(column1)WHERE p=part1;删除:DROP INDEX index_name(WHERE predicate);更新:REBUILD INDEX index_name;查询:SHOW INDEX(index_name);Presto Index-性能对比性能对比Presto Index-性能对比性能对比vs未来计划未来计划 支持物化列的读写支持物化列的读写 支持物化视图提升查询性能支持物化视图提升查询性能 NativeNative engineengine探索探索