客户端接口

Ozone 的原生 C/C++ 客户端访问

师成师成· 更新于 2026-09-28· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

组件概述

  • libhdfs:标准的 Hadoop C API,是 C/C++ 与 Java FileSystem 实现之间的 JNI 桥接层。
  • libo3fs:轻量级封装,为 Ozone 客户端提供简化的 API,构建于 libhdfs 之上。
  • OFS(Ozone FileSystem):基于 Java 的文件系统客户端,libhdfs 内部使用它与 Ozone 进行交互。

概述

原生 C/C++ 应用程序可以使用 Hadoop HDFS 的 libhdfs JNI 库来访问 Ozone 卷和存储桶。例如,Apache Impala 就使用该库来访问 Ozone。

为了演示,我们在 libhdfs 之上构建了一个简单的封装 libo3fs。应用程序既可以选择使用 libo3fs,也可以直接使用低级别的 libhdfs 库进行基本的文件操作。

架构与设计说明

原生客户端利用 Hadoop 的 libhdfs C API 实现低级别的 JNI 绑定,并在 libo3fs 中实现了额外的封装以支持 Ozone 语义。内部工作方式如下:

  • libo3fs 封装 Ozone FileSystem API,用于基本的文件操作(读/写)。
  • libhdfs 实现 JNI 接口。
  • JNI 调用会回连到基于 JVM 的 Ozone 客户端来执行操作。

构建 C/C++ 客户端库

前置条件

  • 从源码构建的 Apache Ozone(ozone-dist/)
  • 已编译 libhdfs.so 的 Hadoop
  • Java 8 或更高版本
  • Linux(内核版本 > 2.6.9)

以下步骤假设你已经从源码构建了 Ozone,下载并解压了 Hadoop 二进制发行版,并将环境变量 OZONE_HOME 和 HADOOP_HOME 分别设置为其对应目录。

0. 下载 Hadoop 二进制发行版(可选)

wget https://archive.apache.org/dist/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz
tar -xzf hadoop-3.4.0.tar.gz

1. 编译核心库与动态库

export JAVA_HOME=/path/to/java
export HADOOP_HOME=/path/to/hadoop
export OZONE_HOME=/path/to/ozone

cd $OZONE_HOME/hadoop-ozone/native-client/libo3fs
gcc -fPIC -pthread \
  -I$HADOOP_HOME/include \
  -g -c o3fs.c

gcc -shared -o libo3fs.so o3fs.o \
  $HADOOP_HOME/lib/native/libhdfs.so

2. 编译示例应用程序

cd $OZONE_HOME/hadoop-ozone/native-client/libo3fs-examples
gcc -fPIC -pthread -I$OZONE_HOME/hadoop-ozone/native-client/libo3fs \
  -I$HADOOP_HOME/include -g -c libo3fs_read.c
gcc -fPIC -pthread -I$OZONE_HOME/hadoop-ozone/native-client/libo3fs \
  -I$HADOOP_HOME/include -g -c libo3fs_write.c

3. 链接可执行文件

# o3fs_read
gcc -o o3fs_read libo3fs_read.o -L$HADOOP_HOME/lib/native -lhdfs \
  -L$JAVA_HOME/lib/server -ljvm \
  -L$OZONE_HOME/hadoop-ozone/native-client/libo3fs -lo3fs -pthread

# o3fs_write
gcc -o o3fs_write libo3fs_write.o -L$HADOOP_HOME/lib/native -lhdfs \
  -L$JAVA_HOME/lib/server -ljvm \
  -L$OZONE_HOME/hadoop-ozone/native-client/libo3fs -lo3fs -pthread

4. 环境变量

export CLASSPATH=$($OZONE_HOME/bin/ozone classpath ozone-tools)
export LD_LIBRARY_PATH=\
$HADOOP_HOME/lib/native:\
$JAVA_HOME/lib/server:\
$OZONE_HOME/hadoop-ozone/native-client/libo3fs

5. 运行示例应用程序

ozone sh volume create my-volume
ozone sh bucket create /my-volume/my-bucket
// o3fs_write writes a 100-byte file named 'file1' using a 100-byte buffer to the 'my-bucket' bucket in the 'my-volume' volume,
// connecting to an Ozone Manager (om) on port 9862.
./o3fs_write file1 100 100 om 9862 my-bucket my-volume

限制

  • 仅支持基本的文件 I/O 操作(不支持目录列表、ACL 等);如需高级功能,请直接使用 libhdfs。
  • JNI 依赖要求兼容的 JVM 和共享库
  • 测试仅在 Linux 上进行;不支持 Windows 和 Mac

参考资料

评论

登录后参与评论

正在加载评论…