OSS/OSS-HDFS可以通过JindoFuse提供POSIX支持,将OSS/OSS-HDFS上的文件挂载到本地文件系统中,让您能够像操作本地文件系统一样操作OSS/OSS-HDFS上的文件。
环境准备
- EMR环境中,默认已安装JindoSDK,可以直接使用。说明 访问OSS-HDFS,需创建EMR-3.42.0及以上版本或EMR-5.8.0及以上版本的集群。
- 非EMR环境,请先安装部署JindoSDK,详情请参见在非EMR集群中部署JindoSDK。说明 访问OSS-HDFS,需部署JindoSDK 4.x及以上版本。
依赖准备
- EMR-3.44.0及之后版本或EMR-5.10.0及之后版本。
- JindoSDK 4.6.2及之后版本。
- JindoSDK 4.5.0及之前版本,需安装以下依赖。
# CentOS sudo yum install -y fuse3 fuse3-devel # Debian sudo apt install -y fuse3 libfuse3-dev
- JindoSDK 4.5.1及之后版本,需依赖libfuse 3.7+。
例如,执行以下命令安装fuse-3.11。
# build fuse required meson & ninja, for debian: apt install -y pkg-config meson ninja-build sudo yum install -y meson ninja-build # compile fuse required newer g++ (only CentOS) sudo yum install -y scl-utils sudo yum install -y alinux-release-experimentals sudo yum install -y devtoolset-8-gcc devtoolset-8-gdb devtoolset-8-binutils devtoolset-8-make devtoolset-8-gcc-c++ sudo su -c "echo 'source /opt/rh/devtoolset-8/enable' > /etc/profile.d/g++.sh" source /opt/rh/devtoolset-8/enable sudo ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/local/bin/gcc sudo ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/local/bin/g++ # compile & install libfuse wget https://github.com/libfuse/libfuse/releases/download/fuse-3.11.0/fuse-3.11.0.tar.xz xz -d fuse-3.11.0.tar.xz tar xf fuse-3.11.0.tar cd fuse-3.11.0/ mkdir build; cd build meson .. sudo ninja install
挂载JindoFuse
执行以下命令,创建一个挂载点。
mkdir -p <mount_point>
<mount_point>
需替换为一个本地路径。例如:/mnt/oss/。执行以下命令,挂载JindoFuse。
jindo-fuse <mount_point> -ouri=<oss_path>
<oss_path>
需替换为待映射的OSS/OSS-HDFS路径,路径可以为Bucket根目录或者子目录。例如:oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/subdir/。此命令会启动一个后台的守护进程,将指定的
<oss_path>
挂载到本地文件系统的<mount_point>
。说明挂载OSS和OSS-HDFS路径的方式基本一致,仅路径中的
endpoint
略有不同。更多信息,请参见OSS/OSS-HDFS快速入门。执行以下命令,确认是否挂载成功。
ps -ef | grep jindo-fuse
jindo-fuse进程存在,且启动参数与预期一致,说明挂载成功。
访问JindoFuse
如果将JindoFS服务挂载到了本地/mnt/oss/,可以执行以下命令访问JindoFuse。
查看/mnt/oss/路径下的所有目录
ls /mnt/oss/
创建目录
mkdir /mnt/oss/dir1
写入文件
echo "hello world" > /mnt/oss/dir1/hello.txt
读取文件
cat /mnt/oss/dir1/hello.txt
显示
hello world
删除目录
rm -rf /mnt/oss/dir1/
卸载JindoFuse
若您想卸载之前挂载的挂载点,可以使用如下命令。
umount <mount_point>
您也可以使用-oauto_unmount
参数,自动卸载挂载点。使用该参数后,支持killall -9 jindo-fuse
发送SIGINT给jindo-fuse进程,该进程退出前会自动卸载挂载点。
特性支持
目前JindoFuse已经支持以下POSIX API。
特性 | 说明 | OSS | OSS-HDFS |
getattr() | 查询文件属性 | 支持 | 支持 |
mkdir() | 创建目录 | 支持 | 支持 |
rmdir() | 删除目录 | 支持 | 支持 |
unlink() | 删除文件 | 支持 | 支持 |
rename() | 重命名文件 | 支持 | 支持 |
read() | 顺序读取 | 支持 | 支持 |
pread() | 随机读取 | 支持 | 支持 |
write() | 顺序写入 | 支持 | 支持 |
pwrite() | 随机写入 | 支持 | 支持 |
flush() | 刷新内存到内核缓冲区 | 仅支持以追加写方式打开的文件。 | 支持 |
fsync() | 刷新内存到磁盘 | 仅支持以追加写方式打开的文件。 | 支持 |
release() | 关闭文件 | 支持 | 支持 |
readdir() | 读取目录 | 支持 | 支持 |
create() | 创建文件 | 支持 | 支持 |
open() O_APPEND | 通过追加写的方式打开文件 | 支持,使用时有限制值,请参见使用限制。 | 支持 |
open() O_TRUNC | 通过覆盖写的方式打开文件 | 支持 | 支持 |
ftruncate() | 对打开的文件进行截断 | 不支持 | 支持 |
truncate() | 对未打开的文件进行截断 | 不支持 | 支持 |
lseek() | 指定打开文件中的读写位置 | 不支持 | 支持 |
chmod() | 修改文件权限 | 不支持 | 支持 |
access() | 查询文件权限 | 支持 | 支持 |
utimes() | 修改文件的存取时间和更改时间 | 不支持 | 支持 |
setxattr() | 修改文件xattr属性 | 不支持 | 支持 |
getxattr() | 获取文件xattr属性 | 不支持 | 支持 |
listxattr() | 列举文件xattr属性 | 不支持 | 支持 |
removexattr() | 删除文件xattr属性 | 不支持 | 支持 |
lock() | 支持posix锁 | 不支持 | 支持 |
fallocate() | 为文件预分配物理空间 | 不支持 | 支持 |
symlink() | 创建软连接 | 不支持 | 目前仅支持OSS-HDFS内部使用,且不支持缓存加速。 |
readlink() | 读取软连接 | 不支持 | 支持 |
进阶使用
挂载参数选项如下所示。
参数 | 是否必选 | JindoData版本 | 参数说明 | 使用范例 |
uri | 是 | 4.3.0及之后版本 | 配置需要映射的OSS路径。路径可以是根目录,也可以是子目录。例如:oss://examplebucket/或oss://examplebucket/subdir。 |
|
f | 否 | 4.3.0及之后版本 | 在前端启动进程。默认使用守护进程方式后台启动。使用该参数时,建议开启终端日志。 |
|
d | 否 | 4.3.0及之后版本 | 使用Debug模式,在前端启动进程。使用该参数时,建议开启终端日志。 |
|
auto_unmount | 否 | 4.3.0及之后版本 | fuse进程退出后自动卸载挂载节点。 |
|
ro | 否 | 4.3.0及之后版本 | 只读挂载,启用后不允许写操作。 |
|
direct_io | 否 | 4.3.0及之后版本 | 开启后,读写文件可以绕过Page Cache。 |
|
kernel_cache | 否 | 4.3.0及之后版本 | 开启后,利用内核缓存优化读性能。 |
|
auto_cache | 否 | 4.3.0及之后版本 | 与kernel_cache二选一,与kernel_cache不同的是,如果文件大小或修改时间发生变化,缓存就会失效。默认开启。 | 无 |
entry_timeout | 否 | 4.3.0及之后版本 | 文件名读取缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。 |
|
attr_timeout | 否 | 4.3.0及之后版本 | 文件属性缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。 |
|
negative_timeout | 否 | 4.3.0及之后版本 | 文件名读取失败缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。 |
|
max_idle_threads | 否 | 4.3.0及之后版本 | 处理内核回调的空闲线程池。默认值:10。 |
|
xengine | 否 | 4.3.0及之后版本 | 打开缓存。 |
|
pread | 否 | 4.5.1及之后版本 | 默认使用顺序读。打开后,使用随机读代替顺序读,适用于随机读远多于顺序读的场景。 |
|
no_symlink | 否 | 4.5.1及之后版本 | 配置后,关闭symlink功能。 |
|
no_writeback | 否 | 4.5.1及之后版本 | 配置后,关闭writeback功能。 |
|
no_flock | 否 | 4.5.1及之后版本 | 配置后,关闭flock功能。 |
|
no_xattr | 否 | 4.5.1及之后版本 | 配置后,关闭xttar功能。 |
|
配置参数选项如下所示。
配置项 | 默认值 | 说明 |
logger.dir | /tmp/bigboot-log | 日志目录,若不存在会自动创建。 |
logger.sync | false | 是否同步输出日志,false表示异步输出。 |
logger.consolelogger | false | 打印日志到终端。 |
logger.level | 2 | 输出大于等于该等级的日志,取值如下:
|
logger.verbose | 0 | 输出大于等于该等级的VERBOSE日志,等级范围为0-99,0表示不输出。 |
logger.cleaner.enable | false | 是否开启日志清理功能。 |
fs.oss.endpoint | 无 | 访问JindoFS服务的地址,例如:oss-cn-xxx.aliyuncs.com。 |
fs.oss.accessKeyId | 无 | 访问JindoFS服务需要的AccessKey ID。 |
fs.oss.accessKeySecret | 无 | 访问JindoFS服务需要的AccessKey Secret。 |
支持在挂载时同时指定JindoSDK配置参数和挂载选项,挂载时指定参数的优先级需高于配置文件,例如:
jindo-fuse <mount_point> -ouri=[<oss_path>] -ofs.oss.endpoint=[<YOUR_ENDPOINT>] -ofs.oss.accessKeyId=[<YOUR_KEY_ID>] -ofs.oss.accessKeySecret=[<YOUR_KEY_SECRET>]
常见问题
使用JindoFuse时如何定位错误信息?
不同于使用JindoSDK调用API时可以获取更为具体的错误信息,JindoFuse只能显示操作系统预设的错误信息。如果需要定位具体的错误原因,可以根据JindoSDK配置中的logger.dir,在指定路径下的jindosdk.log
文件中,寻找具体的错误。