参考:https://blog.youkuaiyun.com/wangqiaowq/article/details/154058848
参考“: apache flink + Paimon 快速搭建指南 - 兰丰岐 - 博客园
jdk已有

minio服务已有
安装flink服务
wget https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.18.1/flink-1.18.1-bin-scala_2.12.tgz
tar zxvf flink-1.18.1-bin-scala_2.12.tgz -C /opt/
wget https://repo1.maven.org/maven2/org/apache/paimon/paimon-s3/0.8.0/paimon-s3-0.8.0.jar wget https://repo1.maven.org/maven2/org/apache/paimon/paimon-flink-1.18/0.8.0/paimon-flink-1.18-0.8.0.jar wget https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc/3.1.2-1.18/flink-connector-jdbc-3.1.2-1.18.jar wget https://repo1.maven.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar wget https://repo1.maven.org/maven2/org/apache/flink/flink-s3-fs-hadoop/1.18.0/flink-s3-fs-hadoop-1.18.0.jar

cp ./*.jar /opt/flink-1.18.1/lib/

start flink
cd /opt/flink-1.18.1/
修改
conf/flink-conf.yaml
# JobManager 地址(客户端用来连接的地址)
jobmanager.rpc.address: 192.168.1.244
jobmanager.rpc.port: 6123
# JobManager 绑定地址(实际监听的网卡)
jobmanager.bind-host: 0.0.0.0
# TaskManager
taskmanager.bind-host: 0.0.0.0
taskmanager.host: 192.168.1.244 # 如果 TM 和 JM 不在同一台,这里要设为 TM 自己的 IP
# REST API
rest.port: 8081
rest.address: 192.168.1.244 # 告诉客户端“用这个地址访问我”
rest.bind-address: 0.0.0.0 # 实际监听所有接口
支持远程访问
bash ./bin/stop-cluster.sh

bash ./bin/start-cluster.sh


--------------------------------------------------------------------
在 minio 上 创建 warehouse Bucket

flink 创建pamion表
bash flink 客户端:
cd /opt/flink-1.18.1/
./bin/sql-client.sh embedded
创建 Iceberg Catalog 和表
CREATE CATALOG my_catalog WITH (
'type' = 'paimon',
'warehouse' = 's3://warehouse/wh',
's3.endpoint'='http://192.168.1.243:9000',
's3.access-key' = 'minio',
's3.secret-key' = 'minio@123',
's3.region' = 'us-east-1'
);
1. CREATE CATALOG paimon
- 创建一个名为
paimon的 Catalog。 - Catalog 是数据库对象的容器,可以包含多个数据库(database),每个数据库又可以包含多个表(table)。
2. PROPERTIES (...) 中的参数说明:
✅ "type" = "paimon"
- 指定 Catalog 的类型为 Paimon。
- 这告诉系统使用 Paimon 的 Catalog 实现来管理元数据和表结构。
✅ "warehouse" = "s3://warehouse/wh/"
- 仓库路径(Warehouse Path):这是 Paimon 存储所有数据库和表数据的根目录。
- 所有在该 Catalog 下创建的数据库和表的数据文件(如 Parquet、ORC 等)以及元数据(如 snapshot、manifest 等)都会存放在这个路径下。
- 示例中使用的是 S3 路径:
s3://warehouse/wh/,表示数据将存储在名为warehouse的 S3 bucket 中的wh/目录下。
✅ "s3.endpoint" = "http://minio:9000"
- S3 兼容服务的访问地址。
- 此处使用的是 MinIO(一个开源的 S3 兼容对象存储服务),运行在本地或内网的
minio:9000地址。 - 如果是 AWS S3,通常不需要设置 endpoint(或设为
s3.amazonaws.com),但使用 MinIO、Ceph、或其他 S3 兼容服务时必须显式指定。
✅ "s3.access_key" = "admin"
- 访问 S3 服务所需的 Access Key。
- 类似于用户名,用于身份验证。
- 在 MinIO 中,默认的 access key 可以是
admin(取决于部署配置)。
✅ "s3.secret_key" = "password"
- 访问 S3 服务所需的 Secret Key。
- 类似于密码,与 access key 配对使用进行身份认证。
- 示例中使用的是明文密码
password,实际生产环境中应使用安全方式管理密钥(如通过环境变量、密钥管理服务等)。
✅ "s3.region" = "us-east-1"
- S3 区域(Region)。
- 虽然 MinIO 本身不严格区分 region,但很多 S3 客户端库(如 AWS SDK)要求提供 region,否则可能报错。
- 设置为
us-east-1是一种常见做法,尤其当使用兼容 S3 的服务时,即使该服务不真正使用 region 概念。
补充说明:
- 这些配置使得 Paimon 能够通过 S3 API 将数据持久化到 MinIO。
- 所有写入 Paimon 表的数据最终会以对象形式存储在
s3://warehouse/wh/路径下,结构类似:s3://warehouse/wh/ ├── database1/ │ └── table1/ │ ├── snapshot/ │ ├── manifest/ │ └── data/ └── database2/ └── ...

USE CATALOG my_catalog;
-- create a word count table
CREATE TABLE word_count (
word STRING PRIMARY KEY NOT ENFORCED,
cnt BIGINT
);

插入数据
USE CATALOG my_catalog;
-- insert data into word count table
insert into word_count values ('hello',2);







在 Apache Paimon(原 Flink Table Store)中,当你创建一个表并写入数据后,Paimon 会在你指定的 warehouse 路径(例如 s3://warehouse/wh/)下,为每个数据库和表生成一套结构化的目录和文件。这些文件共同构成了 Paimon 表的元数据 + 数据存储体系。
下面以一个典型 Paimon 表的目录结构为例,解释各个目录和文件的含义:
📁 示例路径结构(假设数据库为 default,表为 my_table)
s3://warehouse/wh/
└── default.db/ ← 数据库目录(固定以 .db 结尾)
└── my_table/ ← 表目录
├── snapshot/ ← 快照元数据
├── manifest/ ← Manifest 文件(描述数据文件的索引)
├── data/ ← 实际数据文件(按分区/桶组织)
├── schema/ ← 表结构(schema)定义
└── options ← 表的配置选项(可选)
1. snapshot/ 目录


作用:存储表的快照(Snapshot)信息,用于实现 ACID 事务、时间旅行(Time Travel)、流批统一读取等核心功能。
- 每次成功提交写入(如 Flink Checkpoint 完成),Paimon 会生成一个新的 snapshot。
- 快照文件是 JSON 格式,命名如:
1,2,3, ...(数字递增)。 - 每个快照包含:
- 指向当前有效的 manifest list(见下文)
- 提交时间、操作类型(APPEND / COMPACT / OVERWRITE 等)
- schema ID、watermark 等元信息
🔄 最新快照由
snapshot/下的特殊文件标识:
latest:指向最新快照的 ID(如内容为3)earliest:指向最早保留的快照(用于 TTL 清理)
2. manifest/ 目录
作用:存储 Manifest 文件,是数据文件的“索引”或“目录”。




Paimon 使用两级结构:
- Manifest List(在 snapshot 中引用):记录一组 Manifest File 的路径。
- Manifest File(存于
manifest/目录):每个文件包含多个 Data File Entry,描述:- 数据文件路径(如
data/bucket-0/.../xxx.parquet) - 文件的 min/max key(用于谓词下推)
- 文件大小、记录数、level(用于 LSM 合并)
- 分区信息、bucket ID 等
- 数据文件路径(如
✅ 优点:读取时只需加载 manifest,无需扫描所有数据文件,提升查询性能。
3. data/ 目录
作用:存储实际的数据文件(通常是列式格式,如 Parquet)。
结构示例:
data/
├── bucket-0/
│ └── .../1234567890-0.parquet
├── bucket-1/
│ └── .../1234567890-1.parquet
└── dt=2024-01-01/ ← 如果是分区表
└── bucket-0/
└── .../9876543210-0.parquet

- Bucket 机制:Paimon 默认对主键哈希分桶(bucket),每个 bucket 独立管理 LSM 树,支持高并发写入和高效更新。
- 文件命名:通常包含时间戳 + bucket ID,便于排序和合并。
- 格式:默认为 Parquet(支持高效压缩和列裁剪)。
4. schema/ 目录

作用:存储表的 Schema(表结构)历史版本。
- 每次执行
ALTER TABLE ... ADD COLUMN等 DDL 操作,Paimon 会生成新的 schema 文件(如1,2, ...)。 - schema 文件是 JSON 格式,包含:
- 字段名、类型、是否主键
- 分区字段
- 主键定义
- 元数据(如创建时间)
🔁 快照中会记录当前使用的 schema ID,实现 schema evolution(模式演进)。
5. options 文件(可选)
- 一个纯文本文件,存储表级别的配置参数,例如:
bucket=4 changelog-producer=input merge-engine=deduplicate - 这些选项在建表时通过
WITH (...)指定,Paimon 会持久化到此文件。
补充:.paimon 目录(在 warehouse 根目录) 未找到
在 s3://warehouse/wh/ 根目录下,你可能会看到:
.paimon/
└── version
.paimon/version:记录当前 Paimon 仓库的格式版本号(如3),用于兼容性检查。- 防止不同版本的 Paimon 客户端误操作导致数据损坏。
总结表格
| 目录/文件 | 作用 | 是否可读 | 是否可删 |
|---|---|---|---|
snapshot/ | 快照管理,实现事务和时间旅行 | ✅ JSON 可读 | ❌ 不可随意删(影响数据一致性) |
manifest/ | 数据文件索引 | ✅ JSON/二进制 | ❌ 由 Paimon 自动管理 |
data/ | 实际数据(Parquet) | ✅ 可用 Parquet 工具读 | ❌ 不建议手动删 |
schema/ | 表结构定义 | ✅ JSON 可读 | ❌ |
options | 表配置 | ✅ 文本 | ⚠️ 建议通过 DDL 修改 |
.paimon/version | 仓库版本标识 | ✅ | ❌ |
🛠️ 运维提示:
- 不要手动修改或删除这些文件,除非你非常清楚后果。
- Paimon 提供了 TTL 清理、Compaction、Tag 管理等机制来安全地管理历史数据。
- 可通过 Paimon 的
FileStoreScan或CatalogAPI 程序化访问元数据。
3739

被折叠的 条评论
为什么被折叠?



