Hi,大家好,我们又满血复活了。
2025年开年更新频率不快,一方面是大模型如火如荼,也一直在补相关知识;另外一方面,新的一年里身体健康被我摆到了第一位,不会像前几年那么卷了。
后续我们的更新会变得佛系,内容也偏向简单和科普,不会在像前两年更新的非常有深度,面向更广泛的受众(曲高和寡加上精力有限)。主要精力会放在大数据提高班上,内容上也会扩展到大模型和数据结合的领域。
今天要更新的文章是Paimon1.0版本新特性的解读。
前几天Paimon1.0版本公告发布,这个版本是一个里程碑意义的稳定版本,内核上的优化设计是这个版本主要考虑的因素。这个版本中有一些能力提升,其中一个很重要的优化点是Lookup性能优化,也是今天我们要讲的内容。
本地 Lookup是Paimon点查LSM结构的基础能力,它是如下能力的基础结构:
lookup changelog-producer:点查历史文件生成changlog
主键表deletion vectors模式:点查历史文件生成deletion vectors
Flink Lookup Join:当Join条件是维表的主键时,会使用本地 Lookup 的方式
之前的版本使用 HashFile 来解决 Lookup 问题,它有两个缺点:
生成HashFile写入时,磁盘会拷贝多次。
HashFile 的压缩率太差
目前Paimon仅支持AVRO、ORC和Parquet文件格式。在历史版本中,当用作Lookup join时,Paimon会将列格式数据动态转换为key-value 格式数据。
这种数据格式在几十GB数据下其实没什么问题,但是对于超大维度表,性能下降明显。因此在新的版本中,Paimon引入了新的基于sort lookup store的key-value文件格式,并且Paimon可以下载 key-value格式文件并使用主键检索数据。
Paimon社区把这种文件格式命名为PFile,并且PFile文件格式仅用于主键表。当在append-only table中配置时,paimon会抛出异常。下面是PFile的文件结构:
这个文件有4部分:Data Index、Leaf Index、Level Block Index、Trailer。
这个文件的格式的读写分别是怎样的呢?
写入Pfile的步骤如下:
在数据块中写入键值记录,直到数据块填满
压缩字节并将其刷新到存储
生成块索引并将其写入数据索引块
读取PFile的步骤如下:
会先打开文件,先读取 foot info,然后从file foot中读取block index和bloom filter,搜索给定主键的特定数据块,然后从数据块中读取数据。
对于查表,它会检查文件是否存在于本地磁盘中,下载该文件,然后获取给定主键的键值对。
以上就是Lookup join所需要的主键表所做的优化了。