阿里网盘优质资源分享 阿里云管理控制台( 四 )


文章插图
文件分类器:由于文件在OSS上面是按照目录存储的,当通过Schema识别器识别出了叶子节点目录下面的Schema情况后,如果每个叶子节点目录创建一张表,表会很多,管理复杂且难以分析 。因此需要有一套文件分类器来聚合生成最终的表 。且支持增量文件的Schema变更,比如添加字段、添加分区等 。下面是整个分类算法过程,根据目录树形的结构,第一步先深度遍历并结合“文件Schema识别器”在每个节点聚合子节点的Schema是否兼容,如果兼容则把子目录向上合并为分区,如果不兼容则每个子目录创建一张表 。经过第一步后每个节点是否可以创建表、分区信息,以及合并后的Schema都会存储在节点上面;第二步再次遍历可以生成对应的Meta创建事件 。

阿里网盘优质资源分享 阿里云管理控制台

文章插图
这种通用的算法可以识别任意目录摆放,但是由于面向海量分区的场景,事先不知道分区目录是否可以聚合,这样每个目录都需要采样识别,且在聚合时如果某个分区和其他分区兼容度达不到要求,会拆分生成大量的表,在这种场景下性能一般 。如果用户的OSS目录结构按照典型的数仓结构,库、表、分区模式规划,那么在分区识别及表识别上面会有固定的规则,这样可以对上面的算法遍历过程剪枝,分区间的采样率进一步减少,且容错率更高 。数仓模式的目录规划需要如下:

阿里网盘优质资源分享 阿里云管理控制台

文章插图
3、海量分区处理技术
分区投影
在大数据场景中,分区是用于提升性能非常常见的方法,合理划分分区有利于计算引擎过滤掉大量无用的数据从而提升计算性能 。但是如果分区非常多,比如单表数百万的分区,那么计算引擎从元数据服务查询分区所需要的时间就会上升,从而使得查询的整体时间变长 。比如我们客户有张表有130多万分区,一个简单的分区过滤查询元数据访问这块就花了4秒以上的时间,而剩下的计算时间却不到1秒!
针对这个问题,我们设计开发出了一种叫做“分区映射”的功能,分区映射让用户指定分区的规则,然后具体每个SQL查询的分区会直接通过SQL语句中的查询条件结合用户创建表时候指定的规则直接在计算引擎中计算出来,从而不用去查询外部的元数据,避免元数据爆炸带来的性能问题 。经测试,上述场景下,利用分区投影生成分区需要的时间降为1秒以下,大大提升查询效率 。

阿里网盘优质资源分享 阿里云管理控制台

文章插图
基于OSS的Metatable技术
可以看到DLA的分区投影技术降低了海量分区情况下,访问Meta服务的时间开销,该技术通过计算侧计算分区的方法来规避掉海量分区的访问 。DLA目前基于Apache Hudi实现DLA Lakehouse,提供高效的湖仓 。其中在海量分区处理这块,Apache Hudi将表的海量分区映射信息存储在一个OSS上面的Object里面,这样通过读取若干个Object文件可以获取所有的分区信息,规避访问Meta服务的开销 。下面介绍DLA Lakehouse基于Hudi的Metatable技术:

阿里网盘优质资源分享 阿里云管理控制台

文章插图
从上图可以看到DLA Meta中会存储库、表、分区的信息,使用当前方案OSS上面分区目录对应的分区信息会存储在DLA Meta服务中,当分析引擎访问这张表的时候,会通过DLA Meta服务读取大量的分区信息,这些分区信息会从底层的RDS中读出,这样会有一定的访问开销 。如果使用到DLA Lakehouse方案,可以将大量的分区映射信息单独存储在基于OSS对象的Hudi Metatable中,Metatable底层基于HFile支持更新删除,通过KV存储方式提高分区查询效率 。这样分析引擎在访问分区表的时候,可以只在Meta中读取库、表轻量的信息,分区信息可以通过读取OSS的对象获取 。目前该方案还在规划中,DLA线上还不支持 。

推荐阅读