数据湖使用
第一阶段:数据仓库--数据湖
数据湖的主流用户是数据分析师和数据工程师,主要处理 CSV、JSON、Parquet等结构化数据
第二阶段:常规做法是
将每个文件单独存成 S3 上的一个 object,然后在数据库或 Parquet 里维护一张元数据表,通过文件路径去关联
需要维护元数据和对象存储这两套系统之间的一致性
传统数据湖的跟进:
引入了跨生态统一的 Variant 类型,解决了半结构化 JSON 数据的存储问题
Paimon 引入 Blob 数据类型--blob-as-descriptor 机制:
记录数据在外部存储(如OSS)中的位置、文件路径、起始偏移和长度等元信息,将实际数据读取任务交给下游系统按需流式加载
第三阶段
数据湖曾承诺可以存储任意格式的数据,但一直未能兑现,现在
lanceDB 将二进制 Blob 数据(图片、视频、音频字节)与结构化元数据(标签、时间戳、embedding 向量)存储在同一张表里,
并且允许直接用 offset+size 的方式读取
对延迟不敏感的批处理任务
Arrow
物理布局、Array(数组)、Schema(模式)和 RecordBatch(记录批次)
Physical Layout(物理布局):Physical Layout (或 DataTypeLayout) 定义了数据类型的内存布局,即如何在内存中表示和组织数据
物理布局结构体DataTypeLayout的 C++ 实现被定义在cpp\src\arrow\type.h 头文件中,
其中定义了 4 种 BufferSpec :
FixedWidth(单值定长类型),VariableWidth(变长类型
Bitmap(位图记录空值),AlwaysNull(始终为空)
基于DataTypeLayout结构体中的 4 种 BufferSpec 进行组合使用,Apache Arrow 提供了多种物理布局类型
DataType(数据类型
基于物理布局 physical layout,Arrow 提供了一套对应的逻辑类型 logical type,即 DataType
根据物理布局中的定长类型(Fixed-size)和变长类型(Variable-size)等类型划分,Arrow 提供了如下种类的数据类型:
定长类型(FixedWidthType):Boolean, Int, Floating Point,
Decimal, Date, Time, Timestamp, Interval, Duration 等
嵌套类型(Nested Types):List, Struct, Map, Union 等
Array(数组):Array(或 Vector) 是 Apache Arrow 中的数据容器
Array 数据结构被定义为 ArrayData
Fixed-size Primitive Layout
Variable-size Binary Layout 是用于存储可变大小二进制数据类型的布局方式
RecordBatch 是 Apache Arrow 中一组具有相同结构的数组 Array 或分块数组 ChunkedArray 构成的集合
RecordBatch 是序列化数据的基本单位,
它由多个字段(Field)组成的有序集合构成,每个字段对应一个数组,
而每个数组的长度彼此相同,但数据类型可能不同
RecordBatch 的序列化形式包括 data header和body两个部分
Arrow
Arrow 的C Data Interface 定义了3个C结构体
Arrow C data interface
Arrow libraries
C 数据接口(C Data Interface)与 IPC 格式(Arrow IPC Format)是两种不同的数据交换机制
C Data Interface
数据库 / 引擎对外提供 Arrow 格式结果,不绑定 Arrow 库
仅限同进程,跨进程用 Arrow IPC
No buffer reassembly (data is already exposed in logical Arrow format).
struct ArrowSchema {
struct ArrowArray {
struct ArrowArrayStream { Arrow C stream interface
IPC 格式(Arrow IPC Format)
对于进行间通信而言,消息在不同进程之间传递需要进行序列化和反序列化 serialization/deserialization
Apache Arrow IPC Format 采用了高性能序列化方式
FlatBuffers 来对元数据 metadata 进行序列化,
对于消息体直接使用数据缓冲区 raw data buffers 传输数据而不需要进行序列化操作
Schema.fbs is the authoritative
Lance
FileFormat --> lance file
Lance Columnar Format
Table Format --> lance Dataset (Data 目录数据目录-包含多个lance数据文件,manifest index类型编码索引版本等)
Table Format 是在 File Format 基础上组织的数据集
Lance 表(又称 Lance 数据集)
命名空间、目录、模式、数据库、元数据存储和元湖。其中,命名空间
Apache Hive 使用 目录 → 数据库 → 表模型
Apache Iceberg 的 REST 目录则采用 目录 → 多级命名空间 → 表的层次结构
namespace
Lance REST 命名空间是一个 OpenAPI 协议,它通过连接这些元数据服务或以标准化方式构建自定义元数据服务器
Lance dir 命名空间是一个轻量级、简单的 1 级 Lance 命名空间,仅包含表列表
Root Namespace
Lance directory namespace
V1 (Directory Listing)
V2 (Manifest) # The manifest table
任何仅存储的实现(例如目录命名空间),Lance 表同时存在于存储和实现中。
例如,对于Hive 命名空间,Lance 表同时存在于 HMS 和存储
原生 Lance 命名空间实现是在此 lance-namespace
Lance 命名空间是一个集中式存储库,用于发现、组织和管理 Lance 表
/path/to/dataset:
├─ data/.lance # 列式数据文件
├─ _versions/.manifest # 版本清单(每个版本一个)
├─ _indices/{UUID}/index.idx # 二级索引(向量/标量)
├─ _deletions/.{arrow,bin} # 删除文件(行ID)
└─ _transactions/.txn # 事务文件(冲突检测)
LanceDB
LanceDB 可以像 SQLite 或 DuckDB 一样嵌入运行,提供无服务器选项
Namespace --> lance namespace
Namespace依据通过“查询元数据表”(__manifest)<V2模式>,来找到其下所有的Table
Category
LanceDB 在 v2 版本
LanceDB Namespace 是 LanceDB 中用于组织和隔离多个表(即数据集)的逻辑容器,支持多租户、权限控制与环境隔离等企业级功能
对二进制的处理-基于 S3 来构建数据库的趋势
Python 生态库,在设计时假设数据以普通文件的形式存在于文件系统中
大量成熟的API 接受一个 File (文件描述符)或文件路径
Lance 提供了 BlobFile 对象—— 一个实现了 Python io.RawIOBase 接口的 Wrapper,可以懒加载列式存储中的 blob 数据
lance-namespace lance lance-namespace-impl
LanceDB 采用了多层次的缓存策略来优化查询性能并降低延迟
LanceDB 还利用 I/O 缓存来优化从远程存储(如云对象存储)的数据检索效率 RemoteTake
IVF-PQ (倒排文件索引与乘积量化): IVF-PQ 是一种两阶段的复合索引技术,旨在平衡搜索速度和准确性
Multimodal Lakehouse: 多模态数据湖
lanceDB操作
namespace:
默认
显式
db = lancedb.connect_namespace("dir", {"root": "./local_lancedb"})
两种namespace: dir 和 rest 类型
table 增删改查 create_table, drop_table,open_table, and rename_table
Duckdb与Arrow
使用nanoarrow 而未使用libarrow--只要数据交换协议
src/include/duckdb/common/arrow/nanoarrow/nanoarrow.h
src/include/duckdb/common/arrow/nanoarrow/nanoarrow.hpp
src/common/adbc/nanoarrow/schema.cpp
duckdb/function/table/arrow/arrow_duck_schema.hpp
DuckDB集成Arrow列式存储格式,实现ADBC接口
src/include/duckdb/common/adbc/adbc.hpp
Arrow ADBC(Apache Arrow Database Connectivity)是一个用于数据库访问的统一 API 标准
类似于 ODBC/JDBC,但它是Arrow 原生
扩展
src/include/duckdb/common/arrow/arrow_type_extension.hpp
###
nanoarrow 的核心是一个小型的 C 库,编译后仅几百KB,同时提供了R和Python的绑定,安装大小约为1MB。
它采用单文件头文件(nanoarrow.h)和源码文件(nanoarrow.c)
cyberRT
<1>同进程-跨进程--跨机器
<2>chunk
<3>message 定长类型和动长类型
Gravitino
Gravitino 其核心目标并非移动数据,而是统一元数据
异构数据源的统一管理,
涵盖关系型数据库(如 MySQL、PostgreSQL)、
数据湖(如 Hive、Iceberg)、
文件系统(如 HDFS、S3)、
消息队列(如 Kafka)
以及 AI/ML 模型
Daft
本地运行 Daft 时,它会使用 Swordfish 引擎,不依赖分布式框架
Swordfish 是用 Rust 实现的多线程异步执行引擎
在集群模式下,Daft 使用 Ray 作为分布式调度框架
IOPS(每秒输入/输出操作)-量化了设备每秒可支持的读写操作次数
使用任何托管数据库产品,是在用性能和成本换取易用性和容错性
存储和计算的分离的好处显而易见,但代价呢--云IOPS贵-更大的网络带宽
增量计算引擎+数据库缓存引擎
存储-计算-网络带宽
存储-元数据-计算
问题
IO 抖动 和 网络抖动 存储 I/O 和网络传输层面
场景:
互联网场景-数据量大,并发规模大
智能驾驶场景--数据量大,非结构化数据
处理海量数据:列式存储parquet/lance--对象存储s3
分析型 SQL 常常不会用到所有的列,而仅仅对其中某些感兴趣的列做运算
OLTP:
行为单位存储,再配合以 B+ 树或 SS-Table 作为索引,就能快速通过主键找到相应的行数据。
大多数操作都以实体(entity)为单位,即大多为增删改查一整行记录
参考
https://arrow.apache.org/docs/format/CDataInterface.html
https://github.com/apache/arrow-nanoarrow/tree/main/src/nanoarrow
https://mp.weixin.qq.com/s/uUvd1vLhEWcys8cuXkK9nQ
DuckDB:DuckDB 与 Arrow 生态的融合—— 为什么它是 Polars、Pandas 的理想后端
https://sharkdtu.github.io/posts/lance-format.html#more
Lance-面向AI场景的数据存储格式 https://sharkdtu.github.io/posts/lance-format.html
LanceDB: 二进制数据湖的崛起 https://zhuanlan.zhihu.com/p/2011415328782046841
https://zhuanlan.zhihu.com/p/15895223522
https://lqhl.me/blog/lancedb/
浙公网安备 33010602011771号