一个表的所有文件都存储在一个基本目录下。Paimon 文件是以分层的方式组织的。下图说明了文件的布局。从一个快照文件开始,Paimon 读取器可以递归地访问表中的所有记录。
快照文件(Snapshot Files)
所有的快照文件都存储在 snapshot
目录中。
一个快照文件是一个 JSON 文件,包含有关此快照的信息,包括:
清单文件(Manifest Files)
所有清单列表和清单文件都存储在 manifest
目录中。
清单列表是清单文件名称的列表。
清单文件是一个包含有关 LSM 数据文件和变更日志文件的变更文件。例如,在相应的快照中,哪个 LSM 数据文件被创建,哪个文件被删除。
数据文件(Data Files)
数据文件是按分区和桶组织的。每个桶目录包含一个 LSM 树及其变更日志文件。
目前,Paimon 支持使用 orc(默认)、parquet 和 avro 作为数据文件的格式。
LSM 树(LSM Trees)
Paimon 采用 LSM 树(log-structured merge-tree,日志结构合并树)作为文件存储的数据结构。本文档简要介绍了 LSM 树的概念。
Sorted Runs(有序段)
LSM 树将文件组织成几个 Sorted Run。一个 Sorted Run 由一个或多个数据文件组成,每个数据文件正好属于一个 Sorted Run。
数据文件内的记录按其主键进行排序。在一个 Sorted Run 中,数据文件的主键范围不会重叠。
正如你所看到的,不同的 Sorted Run 可能有重叠的主键范围,甚至可能包含相同的主键。当查询 LSM 树时,必须合并所有 Sorted Run,所有具有相同主键的记录必须根据用户指定的合并引擎和每个记录的时间戳进行合并。
写入 LSM 树的新记录首先会缓冲在内存中。当内存缓冲区满时,内存中的所有记录将被排序并刷新到磁盘。这时,就创建了一个新的 Sorted Run。
Compaction(压缩)
当越来越多的记录写入 LSM 树时,Sorted Run 的数量会增加。因为查询 LSM 树需要合并所有的 Sorted Run,太多的 Sorted Run 会导致查询性能变差,甚至是内存溢出。
为了限制 Sorted Run 的数量,我们必须不时地将几个 Sorted Run 合并成一个大的 Sorted Run。这个过程被称为 Compaction(压缩)。
然而,Compaction 操作是一个资源密集型的过程,会消耗一定的 CPU 时间和磁盘 IO,所以太频繁的 Compaction 可能会反过来导致写入速度变慢。这是一个在查询性能和写入性能之间的权衡。Paimon 目前采用与 Rocksdb 的通用压缩策略类似的 Compaction 策略。
默认情况下,当 Paimon 写入器向 LSM 树追加记录时,他们也会根据需要进行 Compaction。用户也可以选择在一个专门的 Compaction 作业中执行所有的 Compaction。有关详细信息,请参阅专用 Compaction 作业。
文件布局示例
Paimon 表 dwd_user
的一级目录结构如下:
1 2 3 4 5 6
| $ hadoop fs -ls /fts/default.db/dwd_user Found 4 items drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:37 /fts/default.db/dwd_user/bucket-0 drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:37 /fts/default.db/dwd_user/manifest drwxr-xr-x - hadoop hdfs 0 2023-02-12 19:05 /fts/default.db/dwd_user/schema drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:37 /fts/default.db/dwd_user/snapshot
|
Paimon 表 dwd_user
的子目录内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $ hadoop fs -ls -R /fts/default.db/dwd_user/ drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:31 /fts/default.db/dwd_user/bucket-0 -rw-r--r-- 3 hadoop hdfs 0 2023-05-17 18:35 /fts/default.db/dwd_user/bucket-0/data-0c690527-c8de-4f50-8937-63d727cdfbad-51.orc -rw-r--r-- 3 hadoop hdfs 8092 2023-06-10 13:25 /fts/default.db/dwd_user/bucket-0/data-45105a64-dedc-42b6-be47-1e40334a802a-119.orc -rw-r--r-- 3 hadoop hdfs 9860 2023-06-10 13:28 /fts/default.db/dwd_user/bucket-0/data-45105a64-dedc-42b6-be47-1e40334a802a-120.orc -rw-r--r-- 3 hadoop hdfs 9788 2023-06-10 13:31 /fts/default.db/dwd_user/bucket-0/data-45105a64-dedc-42b6-be47-1e40334a802a-121.orc -rw-r--r-- 3 hadoop hdfs 9400 2023-06-10 13:34 /fts/default.db/dwd_user/bucket-0/data-45105a64-dedc-42b6-be47-1e40334a802a-122.orc drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:31 /fts/default.db/dwd_user/manifest -rw-r--r-- 3 hadoop hdfs 3973 2023-06-10 13:31 /fts/default.db/dwd_user/manifest/manifest-5d06962a-5f92-4235-a383-b6e4ccae4ed2-6186 -rw-r--r-- 3 hadoop hdfs 2396 2023-06-10 13:31 /fts/default.db/dwd_user/manifest/manifest-5d06962a-5f92-4235-a383-b6e4ccae4ed2-6187 -rw-r--r-- 3 hadoop hdfs 2353 2023-06-10 13:34 /fts/default.db/dwd_user/manifest/manifest-5d06962a-5f92-4235-a383-b6e4ccae4ed2-6188 drwxr-xr-x - hadoop hdfs 0 2023-02-12 19:05 /fts/default.db/dwd_user/schema -rw-r--r-- 3 hadoop hdfs 3714 2023-02-12 19:05 /fts/default.db/dwd_user/schema/schema-0 drwxr-xr-x - hadoop hdfs 0 2023-06-10 14:31 /fts/default.db/dwd_user/snapshot -rw-r--r-- 3 hadoop hdfs 5 2023-06-10 14:28 /fts/default.db/dwd_user/snapshot/EARLIEST -rw-r--r-- 3 hadoop hdfs 5 2023-06-10 14:31 /fts/default.db/dwd_user/snapshot/LATEST -rw-r--r-- 3 hadoop hdfs 422 2023-06-10 13:31 /fts/default.db/dwd_user/snapshot/snapshot-66591 -rw-r--r-- 3 hadoop hdfs 422 2023-06-10 13:34 /fts/default.db/dwd_user/snapshot/snapshot-66592 -rw-r--r-- 3 hadoop hdfs 422 2023-06-10 13:37 /fts/default.db/dwd_user/snapshot/snapshot-66593 -rw-r--r-- 3 hadoop hdfs 422 2023-06-10 13:40 /fts/default.db/dwd_user/snapshot/snapshot-66594 -rw-r--r-- 3 hadoop hdfs 423 2023-06-10 13:40 /fts/default.db/dwd_user/snapshot/snapshot-66595
|
(END)