您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[DataFunSummit2023:数据湖架构峰会]:华为云实时数据湖查询优化 - 发现报告

华为云实时数据湖查询优化

AI智能总结
查看更多
华为云实时数据湖查询优化

华为云实时数据湖查询优化 演讲人:孟涛—华为—高级工程师 华为云数据湖介绍 数据湖基础架构 数据入湖:历史存量数据通过CDM一次性搬迁。新增数据通过CDL实时搬迁。 数据存储:选用hudi作为数据湖的基座,支持hdfs/对象存储obs, 数据加工:流式加工:FlinkSQL增量拉取hudi表数据。批量加工: Spark、SparkSQL两种方式。 交互式分析:hetu引擎承担数据湖的查询出口。 Hudi查询能力介绍 Hudi介绍 流式挖掘,增量查询 高效的更新,删除能力,可插拔索引 事务, MVCC,并发控制,schema evolution,time travel 丰富的表级别服务:自动小文件合并,数据布局优化clustering,compacion, clean 丰富的生态集成,支持flink/spark写入Presto/hive/spark/flink等查询 Clustering hudi早在0.7版本就已经提供了clustering优化数据布局,0.10版本随着z-order/hilbert高阶聚类算法的加入,hudi的数据布局优化日趋强大。hudi当前提供以下三种不同的聚类方式,针对不同的点查场景,要根据具体的过滤条件来选择不同的策略 数据布局优化配合FileSkipping才能更好的发挥效果。当我们完成数据布局后,对每个文件的相关列收集统计信息,下图给个简单的示例,数据经过排序后写入表中生成三个文件,指定点查where a < 10下图可以清楚的看出a < 10的结果集只存在于parquet1文件中,parquet2/parquet3中a的最小值都比10大,显然不可能存在结果集,所以直接裁剪掉parquet2和parquet3即可 空间曲线z-order/hilbert生成。 普通sort无法满足多列排序需求,空间曲线类似于对每列做加权平均排序,对队列排序效果更好 tips: 实际环境中hilbert的聚合性比z-order更好 hilbert MDT metatable:hudi的元数据信息表,是一个自管理的hudi mor表,位于hudi表的.hoodie目录对用户无感知。同样的hudi很早就开始支持metaTable,经过不断的迭代,到0.12版本metatable已经成熟,当前metaTable表的能力如下: column_stats当前hudi支持对指定列收集包括min-max value,null count,total count在内的统计信息;并且hudi保证这些信息收集是原子性。利用这些统计信息结合查询引擎可以 很好的完成fileSkipping大幅度减少IO。 bloomfilterbloomfilter是hudi提供的另一种能力,当前只支持对主键构建bloomfilter。bloom的判断不存在就一定不存在的特性,可以很方便我们进行fileSkipping,我们可以将查询 条件直接作用到每个文件的bloomfilter上,进而过滤点无效的文件。注意bloom只适合等值过滤条件例如where a = 10,对于a > 10这种就无能为力的。 高性能fileList 在查询超大规模数据集是,fileList是不可避免的操作;在hdfs上该操作耗时还可以接受,一旦涉及到对象存储大规模的fileList效率极其低下,hudi引入metatable将文件信息直接保存在下来,从而避免了大规模filelist, 华为云基于hudi的性能优化 Hudi索引优化 索引是为了加快数据检索速度而创建的一种存储结构,是一种空间换时间的设计思想,作用可以理解为书的目录,通过目录我们可以快速检索到需要的内容。常见的索引类型有:数据索引(如对数据做分区,sort,z-order),二级索引(lucene、bitmap),前缀索引等等,每种所有都有各自的优缺点。引入这些索引可以极大的提升查询引擎的查询能力 ➢数据索引Min-max ➢Lucene索引 ➢Bitmap索引 ➢各种索引对比和使用建议 基于MDT的Min-max索引 Min-max索引要想效果好,数据入库后需要采用clustering,按照查询条件做排序异步重组数据。读取时开启mdt利用hfile高效的点查能力,快速加载索引数据完成数据文件的裁剪 基于MDT的Min-max索引集成 lucene Lucene是apache开源的一款搜索工具,具有极其高效的检索效率。solr和es均基于其进行开发。利用lucene强大的倒排索引能力,可以赋予hudi更高效的多维查询,文本检索能力。 正向索引,给每个文档编号,作为其唯一标识 倒排索引,对字段内容做分词,按分词和id构建索引 lucene 索引的创建和使用//create index create indexidx_nameonmytableusinglucene(c1) options(block_size=1024)//索引执行Callrun_build(table => ‘mytable,show_involved_partition=> true’) 构建lucene索引要注意的点 1)选择文件级别构建,我们选择行号作为docID,全表级别生成行号不现实,而且表里面数据会持续写入之前行号讲不可以。 2)异步构建方式,防止阻塞入库流程。天级别大任务可以选择同步构建 关于索引大小Lucene针对string类型,做分词后产生的索引文件很大,甚至比数据文件都大,18300行--> 600M数值类型产生的索引文件相对较小18300-->6.6M,可以直接放到内存,加快索引查询 Lucene会生成很多文件,这对hdfsnamenode是有压力的 bitmap Bitmap索引,其索引采用bit数组进行存储和计算操作,位置编码的每一位表示键值对应的数据行的有无,查询时直接用索引位图做运算,即可skipping掉大量数据 将age所有值存成有序数组,根据过滤条件选取对应bitmap进行交并运算,返回的结构即为具体某些行包含目标数据,如果返回结果位0直接可以skipping掉整个文件,否则进行做page级别skipping。 bitmap 索引的创建和使用 //create indexcreate indexidx_nameonmytableusinglucene(c1) options(block_size=1024) //索引执行 Callrun_build(table => ‘mytable,show_involved_partition=> true’) 构建lucene索引要注意的点 1)选择文件级别构建,2)异步构建方式,防止阻塞入库流程。3)等值bitmap占用空间较大,范围查询时非常不友好采用Bit-Slice Range Encoded Bitmap (featurebase.com/blog/range-encoded-bitmaps)方式构建bitmap,节省存储空间4)Bitmap入参需要整数,对于string,double,float等类型可以现在字典然后再按字典值生成bitmap 二级索引构建 1)引入新的timeline类型:index(社区已有相应pr,待合入)Index.request------索引计划生成,可按实际用户指定的索引类型生成Index.inflight------索引计划执行Index.commit------索引数据提交整个索引构建流程按先调度后执行的异步模式执行2)借助index服务,负责索引计划的执行,解放入库程序Commit timelineT1T2T3T4 二级索引集成 索引类型支持:支持Lucene/bitmap。Bloomfilter当前社区是直接放到mdt里面的并且实际文件较大,加载耗时较长。因此直接使用了parquet自身的能力替代 索引在work端生效,由于lucence/bitmap索引构建出来的索引文件很大,无法放到coordinator里面直接skipping扫描文件。 通过与index server交互,获取索引信息的位置,由work端获取相应的索引文件,做裁剪。 实际效果:采用我们采用和ck一样的SSB数据集进行测试, 数据规模1.5T,120亿条数据。性能提升3x到11x 各种索引对比和使用建议 统计信息优化 CBO: 当前大数据查询引擎可以使用基于成本的优化器(CBO)来改进查询计划,这对于多表关联场景具有很好的效果。收集表和列的统计信息,并保证这些信息的实时性对于cbo至关重要。 统计信息优化:1)利用hudi的MDT能力,实时收集统计信息并存入MDT,借助MDT和 hudi表的强一致性保障对外提供可靠的,实时性统计信息。2)支持同步/异步方式构建统计信息 查询瓶颈分析+索引缓存 瓶颈点1:MDT的文件大小随着表大小增长,当表中文件格式上万甚至几十 万,单次访问mdt的性能会下降 瓶颈点2:list files和list index info两个操作分属于读mdt表不同分区数据; 实际环境中大表每次调用mdt接口都要耗时400ms+,两次耗时就接近1s,对于亚秒级查询非常不友好 瓶颈点3: MDT的查询每次都是冷启动,导致每次查询都有不必要的开销 瓶颈点4:Parquet元数据信息,读取耗时 优化: 1)Coordinator/driver侧缓存mdt索引数据,减少直接访问mdt开销。2)数据入库后利用callback机制,通知缓存侧刷新缓存。 基于MDT简单的查询流程 查询瓶颈分析+索引缓存 通过缓存,查询数据预热等手段,日增入库几十TB的hudi表,多维查询稳定在1s~2s 后续工作 未来计划 •热点数据缓存:缓存热点数据文件。•实时物化视图:动态收集用户查询语句,在入库时实时构建物化视图。•Mor表读性能优化:引入delete vectors,平衡hudi读写开销。 感谢您的观看 演讲人:孟涛—华为—高级工程师