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>
  • 执行以下命令,挂载JindoFuse。
    jindo-fuse <mount_point> -ouri=<oss_path>

    <mount_point>需替换为一个本地路径。 <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/dir1ls /mnt/oss/
  • 写入文件
    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。

特性说明OSSOSS-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版本参数说明使用范例
uri4.3.0及之后版本配置需要映射的OSS路径。路径可以是根目录,也可以是子目录。例如:oss://examplebucket/或oss://examplebucket/subdir。-ouri=oss://examplebucket/
f4.3.0及之后版本在前端启动进程。默认使用守护进程方式后台启动。使用该参数时,建议开启终端日志。-f
d4.3.0及之后版本使用Debug模式,在前端启动进程。使用该参数时,建议开启终端日志。-d
auto_unmount4.3.0及之后版本fuse进程退出后自动卸载挂载节点。-oauto_unmount
ro4.3.0及之后版本只读挂载,启用后不允许写操作。-oro
direct_io4.3.0及之后版本开启后,读写文件可以绕过Page Cache。-odirect_io
kernel_cache4.3.0及之后版本开启后,利用内核缓存优化读性能。-okernel_cache
auto_cache4.3.0及之后版本kernel_cache二选一,与kernel_cache不同的是,如果文件大小或修改时间发生变化,缓存就会失效。默认开启。
entry_timeout4.3.0及之后版本文件名读取缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。-oentry_timeout=60
attr_timeout4.3.0及之后版本文件属性缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。-oattr_timeout=60
negative_timeout4.3.0及之后版本文件名读取失败缓存保留时间(秒),用于优化性能。默认值:60。0表示不缓存。-onegative_timeout=0
max_idle_threads4.3.0及之后版本处理内核回调的空闲线程池。默认值:10。-omax_idle_threads=10
xengine4.3.0及之后版本打开缓存。-oxengine
pread4.5.1及之后版本默认使用顺序读。打开后,使用随机读代替顺序读,适用于随机读远多于顺序读的场景。-opread
no_symlink4.5.1及之后版本配置后,关闭symlink功能。-ono_symlink
no_writeback4.5.1及之后版本配置后,关闭writeback功能。-ono_writeback
no_flock4.5.1及之后版本配置后,关闭flock功能。-ono_flock
no_xattr4.5.1及之后版本配置后,关闭xttar功能。-ono_xattr

配置参数选项如下所示。

配置项默认值说明
logger.dir/tmp/bigboot-log日志目录,若不存在会自动创建。
logger.syncfalse是否同步输出日志,false表示异步输出。
logger.consoleloggerfalse打印日志到终端。
logger.level2输出大于等于该等级的日志,取值如下:
  • 0:TRACE
  • 1:DEBUG
  • 2:INFO
  • 3:WARN
  • 4:ERROR
  • 5:CRITICAL
  • 6:OFF
logger.verbose0输出大于等于该等级的VERBOSE日志,等级范围为0-99,0表示不输出。
logger.cleaner.enablefalse是否开启日志清理功能。
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文件中,寻找具体的错误。