# Paimon功能介绍
Apache Paimon是面向流式数据处理和湖仓一体架构设计的开源数据湖存储系统。它将数据湖的低成本、开放存储能力与数据库的实时更新、事务一致性能力结合起来，适用于实时数仓、离线数仓以及流批一体等场景。
Paimon采用类似LSM-Tree的存储结构，支持高吞吐写入、主键更新、删除、局部更新和数据合并。数据写入后通过快照、Manifest和数据文件进行组织，每次提交都会生成一个一致性快照，从而实现原子提交、版本管理、时间旅行和故障恢复。对于主键表，Paimon能够根据主键合并多次变更，适合处理数据库CDC数据，并可直接构建实时更新的数据湖表。
Paimon支持以下功能：
- 流批一体写入：支持Flink流式持续写入和Spark批量写入，一份数据同时服务流式和批量计算场景。
- 主键表实时更新：基于LSM-Tree结构支持按主键的插入、更新和删除，适合CDC数据接入和实时聚合。
- Append-Only表：不支持主键的纯追加表，适用于日志、事件流等无需更新的场景，写入性能更高。
- 时间旅行：通过快照机制支持查询历史版本数据，可用于数据审计、回溯对比和故障恢复。
- Schema演进：支持加列、删列、重命名、类型变更等Schema变更操作，无需重写数据文件。
- Compaction：将小文件合并为大文件，优化查询性能和存储效率，支持同步和异步两种模式。
- Changelog Producer：支持从Paimon表直接产出变更日志，下游可订阅增量数据进行流式处理。
- Tag与Branch：支持为表快照创建标签和分支，便于版本管理和数据回滚。
#### 主要特点
- 流批一体：同一份数据同时支持流式读取和批量查询，无需维护两套数据链路。
- 高吞吐写入：基于LSM-Tree的写入路径优化，支持百万级TPS的数据写入场景。
- 实时更新：主键表支持按主键的更新和删除操作，满足实时数仓的数据变更需求。
- 开放生态：与Flink深度集成，同时支持Spark计算引擎。
- 事务一致性：每次提交生成一致性快照，提供ACID事务保证，支持并发读写的隔离。
- 低成本存储：底层基于HDFS或对象存储，结合列式存储格式，兼顾低成本和高性能。
 
#### 基本概念
- Table（表）：Paimon表是数据的基本组织单元，包含Schema、分区策略、主键定义和属性配置等信息。分为Append-Only表和主键表两种类型。
- Snapshot（快照）：表在某一时间点的一致性视图，每次提交生成一个快照，是时间旅行和并发控制的基础。
- Schema（表结构）：描述表的字段定义、数据类型和字段ID。Paimon通过字段ID实现Schema演进后的数据兼容。
- Manifest（清单）：记录数据文件的元数据信息，包括文件路径、分区值、行数和列统计信息，用于查询时过滤和扫描规划。
- Data File（数据文件）：实际存储数据的文件，默认使用ORC或Parquet列式格式。
- Changelog（变更日志）：记录表中数据变更的信息，通过Changelog Producer机制生成，供下游流式消费。
- Commit（提交）：将数据变更原子性地写入到表中，生成新快照的操作。Paimon采用乐观并发控制处理并发提交。
 
#### 文件组织方式
Paimon将数据分为元数据管理层和数据存储层。
- 元数据管理层：
  - Snapshot文件：为JSON格式，存储当前快照信息，包括Schema、分区规范、所有Manifest文件引用以及上一次快照的引用，每次commit生成一个新快照文件。
  
  - Manifest文件：为Avro格式，存储数据文件的清单列表，每行记录一个数据文件的详细描述，包括文件路径、分区值、文件大小、行数以及列级别的统计信息（最大最小值、空值数等），用于查询时过滤不必要的文件。
  
  - Manifest List文件：为Avro格式，一次commit生成一个清单列表文件，存储该次提交涉及的Manifest文件路径和分区范围信息。
   
- 数据存储层：默认为ORC或Parquet列式文件格式。
 
