iceberg 底层存储HDFS与juiceFS的区别
一、iceberg
Iceberg 是一个表格式(table format):
它不存储数据引擎,而是负责:
元数据管理(快照、分区、数据文件列表等)
跟踪数据文件的位置
支持 schema 演进、时间旅行等高级特性
它的底层数据文件通常是 Parquet、ORC、Avro 格式。
那么他底层数据存储格式是HDFS,juiceFS,和对象存储的区别是什么呢
二、juiceFS
juiceFS是一款基于社区版本打造的高性能云原生分布式文件系统,为海量数据设计。支持弹性、多云、兼容多种协议,支持多客户端共享访问。数据部分存储在对象存储上,元数据引擎实现了文件协议并提供了极高的访问性能。
JuiceFS 在设计之初是为了解决 HDFS 大数据上云的场景,产品的架构理念符合云原生的发展趋势。随着近年来AI及大模型训练需求的高速增长,JuiceFS的海量规模、高性能及读写加速能力发挥出了极大的优势。
(一)核心特性:
多协议兼容:POSIX兼容像本地文件系统一样使用、同时支持 HDFS 协议、S3对象存储协议
云原生:可以通过 CSI Driver 在 K8S 中使用,已适配接入 Matrix、Cloudml 、数据工场平台
多端共享:同一文件系统可在上千台服务器同时挂载,高性能并发读写,共享数据;
缓存加速:支持单机缓存与分布式缓存多级加速能力,提升对象存储访问速度,降低延时
数据安全:接入IAM权限管理、支持操作审计、支持回收站
(二)核心概念
1. POSIX
POSIX 是一套“操作系统怎么统一说话和做事的规则”。🧩类比解释:
想象一下你在不同国家旅行,每个国家的插座形状都不一样,结果你手机充电器插不进去,很麻烦,对吧?
那如果全世界都用统一的插座标准,是不是你去哪都能充电?
——POSIX 就像这样的统一标准,只不过它不是用来充电的,而是用在“操作系统”上的。
POSIX 是 IEEE 计算机协会指定的一系列标准,用于维护操作系统之间的兼容性。 POSIX 定义了系统和用户级应用程序编程接口(API),以及命令行 shell 和实用程序接口,以实现与 Unix 和其他操作系统变体的软件兼容性(可移植性)。 POSIX 也是IEEE 的商标。 POSIX 旨在供应用程序和系统开发人员使用。
POSIX 是做什么的?
POSIX 是 “Portable Operating System Interface(可移植操作系统接口)” 的缩写,它是一套由 IEEE 制定的标准,主要解决下面几个问题:
程序员痛点:
不同的操作系统写程序规则不一样,比如 Linux、macOS、某些 UNIX 系统,不统一,写好的程序很难在多个系统上运行。POSIX的作用:
规定了:
操作系统要提供哪些“接口”(比如:文件操作、进程管理、输入输出等)
程序员可以使用哪些“标准函数”去写程序
系统怎么响应这些操作
结果就是:
程序员按照 POSIX 标准写代码,程序可以在多个操作系统上运行(只要这些系统“遵守”POSIX)。
系统开发者要实现这些 POSIX 接口,让程序员写的程序能跑得起来。
🧾举个生活中常见的例子:
你写了一个 C 程序,里面用了
open()
、read()
、write()
这样的函数来操作文件。这些函数就是 POSIX 规定的接口。只要系统支持 POSIX,你的程序基本上就可以在 Linux、macOS、FreeBSD 等系统上运行,无需修改。
✅哪些系统是“POSIX兼容”的?
Linux(大多数发行版)
macOS
FreeBSD、OpenBSD
以前的 Unix 系统(像 AIX、Solaris)
甚至还有一些嵌入式系统
JuiceFS 作为一个文件系统,通过像 FUSE 这样的机制,向操作系统暴露出一套 POSIX 兼容的接口,
让你可以用标准的系统调用(open/read/write/close 等)来访问 JuiceFS 存储的文件。🔧也就是说:
JuiceFS 自己实现了一套 POSIX 文件系统接口,用来“假装”它是个本地硬盘。
这就好比你写程序时调用 open(),操作系统通过 JuiceFS 实现的 POSIX 接口,
把你要打开的 /mnt/juicefs/file.txt 实际映射到远端的 S3 或 HDFS 里。
2. JuiceFS 是怎么用 FUSE 来实现 POSIX 兼容的?
FUSE 简单理解:
FUSE 是 Filesystem in Userspace(用户空间文件系统)的缩写。
操作系统的文件系统通常跑在内核空间,速度快但开发复杂。
FUSE 允许开发者在用户空间写文件系统程序,操作系统通过一个内核模块把用户空间的文件系统“挂载”到系统里。
JuiceFS + FUSE 的流程是这样的:
用户操作文件
比如你在命令行里执行cat /mnt/juicefs/file.txt
,操作系统内核拦截到你要打开这个文件的请求。FUSE 内核模块转发请求
操作系统内核把打开文件的请求通过 FUSE 通道,交给用户空间的 JuiceFS 进程。JuiceFS 用户态程序处理请求
JuiceFS 根据请求,查元数据(文件目录结构、权限等)和数据(实际文件内容):
元数据通常存储在数据库或元数据服务里。
文件内容存储在对象存储(如 S3)里。
JuiceFS 返回结果给内核
JuiceFS 把文件内容或操作结果返回给内核,内核再返回给用户程序。
为什么能实现 POSIX 兼容?
JuiceFS 在用户态实现了所有 POSIX 文件操作接口的逻辑,比如:
open()
,read()
,write()
,close()
文件权限、目录结构、符号链接等
让系统和程序觉得这就是个正常的本地文件系统。
3. POSIX 和 HDFS / S3 之间的差异
方面 | POSIX 文件系统 | HDFS | S3 对象存储 |
---|---|---|---|
接口规范 | 标准操作系统文件系统接口 | Hadoop 生态专用接口 | RESTful API(HTTP) |
访问方式 | 文件路径,支持随机读写 | 以大文件批处理为主 | 以对象为单位,通常不支持随机写 |
写操作模式 | 支持随机读写和更新 | 一般写一次,读多次 | 对象不可变(更新通常是重写) |
目录支持 | 支持真正的目录结构 | 支持目录结构 | 通过前缀模拟目录结构 |
典型应用 | 系统文件存储,传统应用 | 大数据批处理,分析 | 云存储,备份,静态资源托管 |
三、juiceFS和HDFS的区别
我们先看看Iceberg表的组成。
Iceberg 表大致由以下几种文件组成:
数据文件(data file): parquet/ORC 数据块
manifest file: 记录某个快照里包含了哪些数据文件
manifest list: 记录所有 manifest 文件
metadata.json: 当前表结构、schema、快照历史等
这些文件都存储在一个你配置的“仓库目录”中,比如:
hdfs://warehouse/iceberg/table/
s3a://bucket/iceberg/table/
jfs://volume/iceberg/table/
🧪 三种方式对比存储效果:
存储方式 | 存储路径格式 | 读写机制 | 支持功能 | 特点 |
---|---|---|---|---|
HDFS | hdfs://... | 数据本地或通过 HDFS RPC 访问 | 全功能 | 强一致、高吞吐,需集群管理 |
JuiceFS | jfs://... 或 POSIX 路径 | 自己实现的 FS 接口或 POSIX FUSE | 全功能 | 基于对象存储,具备 HDFS 的行为 |
S3 | s3a://... | 通过 REST API 调用 | 部分限制(最终一致性、rename开销) | 便宜、弹性高、性能不稳定 |
🚨 关键区别在几个点:
关键点 | HDFS | S3 | JuiceFS |
---|---|---|---|
一致性 | 强一致 | 最终一致 | 强一致(JuiceFS 保证) |
rename 支持 | 快速 | 成本高(实际是 copy) | 快速(JuiceFS 用元数据支持) |
写入性能 | 高(本地块) | 较慢(网络 & REST) | 介于中间,优化过上传流程 |
扩展性 | 垂直扩展 | 水平无限扩展 | 依赖对象存储,弹性高 |
部署复杂度 | 高(需要 HDFS 集群) | 无 | 低(只需要 JuiceFS 客户端) |
📌 举个实际例子:
使用 HDFS:
fs.defaultFS=hdfs://hadoop-nn:8020 warehouse=hdfs://hadoop-nn:8020/user/hive/warehouse/iceberg/
Iceberg 会将所有的 manifest、metadata、data 文件写入 HDFS。
rename 很快,写文件强一致,事务安全。
使用 S3:
fs.defaultFS=s3a://my-bucket warehouse=s3a://my-bucket/iceberg/
Iceberg 依赖 S3 的 eventual consistency,必须开启 Iceberg 的一致性补丁(如 rename handling)。
rename 会变成 copy + delete,开销大。
更适合 Append-only 的模型。
使用 JuiceFS:
fs.defaultFS=jfs://my-volume warehouse=jfs://my-volume/iceberg/
rename 快速(元数据操作)
一致性强(JuiceFS 保证),兼具 HDFS 的行为
后端是对象存储,但对 Iceberg 来说无感知,表现如 HDFS。