客户端接口
Ozone 的原生 C/C++ 客户端访问
登录后可跨设备保存划线和私人笔记登录
组件概述
- 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.gz1. 编译核心库与动态库
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.so2. 编译示例应用程序
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.c3. 链接可执行文件
# 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 -pthread4. 环境变量
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/libo3fs5. 运行示例应用程序
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
参考资料
评论
登录后参与评论
正在加载评论…
KnowForge