(实验版)使用FUSE挂载Alluxio

Alluxio-FUSE是一个新的处于实验阶段的特性,该特性允许在一台Linux机器上的本地文件系统中挂载一个Alluxio分布式文件系统。通过使用该特性,标注的工具(例如lscat以及echo)和传统的POSIX应用程序都能够直接访问Alluxio分布式文件系统中的数据。

由于Alluxio固有的属性,例如它的write-once/read-many-times文件数据模型,该挂载的文件系统并不完全符合POSIX标准,尚有一定的局限性。因此,在使用该特性之前,请先阅读本页面余下的内容,从而了解该特性的作用以及局限。

安装依赖

  • Linux kernel 2.6.9及以上
  • JDK 1.8及以上
  • libfuse 2.9.3及以上 (2.8.3也能够工作,但会提示一些警告)

构建

在编译Alluxio源码过程中,只有当maven的fuse设置开启时,alluxio-fuse才会被构建。当使用JDK 1.8及以上编译Alluxio源码时该设置会自动开启。

为了保持与JAVA 7的兼容性,预编译的alluxio二进制文件并不支持alluxio-fuse,因此若需要在部署中使用alluxio-fuse,你需要自己构建Alluxio。

最好的方式是从Alluxio GitHub repository处获取你需要的分支的源码,或者直接从source distribution处获取,请参考该页面进行构建。

用法

挂载Alluxio-FUSE

在完成配置以及启动Alluxio集群后,在需要挂载Alluxio的节点上启动Shell并进入$ALLUXIO_HOME目录,再运行

$ integration/fuse/bin/alluxio-fuse.sh mount <mount_point>

该命令会启动一个后台java进程,用于将Alluxio挂载到<mount_point>指定的路径。注意<mount_point>必须是本地文件系统中的一个空文件夹,并且该用户拥有该挂载点及对其的读写权限。另外,目前每个节点上只能挂载一个Alluxio-FUSE。

卸载Alluxio-FUSE

要卸载Alluxio-FUSE时,在该节点上启动Shell并进入$ALLUXIO_HOME目录,再运行:

$ integration/fuse/bin/alluxio-fuse.sh umount

该命令将终止alluxio-fuse java后台进程,并卸载该文件系统。

检查Alluxio-FUSE是否在运行

$ integration/fuse/bin/alluxio-fuse.sh stat

可选配置

Alluxio-FUSE是基于标准的alluxio-core-client-fs进行操作的。你也许希望像使用其他应用的client一样,自定义该alluxio-core-client-fs的行为。

一种方法是编辑$ALLUXIO_HOME/integration/fuse/bin/alluxio-fuse.sh配置文件,将特定的配置项添加到ALLUXIO_JAVA_OPTS变量中。

操作前提和状态

目前,alluxio-fuse支持大多数基本文件系统的操作。然而,由于Alluxio某些内在的特性,一定要清楚:

  • 文件只能顺序地写入一次,并且无法修改;
  • 由于以上的限制,文件只有只读访问方法。

下面说明作用于文件系统的UNIX系统调用受到的限制条件。

open(const char* pathname, int flags, mode_t mode)

(see also man 2 open)

如果pathname为一个Alluxio中不存在的文件,那么open操作只有在以下条件满足时才会成功:

  1. pathname的基目录在Alluxio中存在;
  2. O_CREATO_WRONLY被传递到flags位字段中。

同样的,当(1)满足并且pathname不存在时,creat(const char* pathname )操作会成功。

如果pathname为一个Alluxio中存在的文件,那么open操作只有当以下条件满足时才会成功:

  1. O_RDONLY被传递到flags位字段中。

注意,无论哪种情况,目前Alluxio-FUSE会忽略mode参数。

read(int fd, void* buf, size_t count)

(see also man 2 read)

只有当fd指向的文件已经在指定O_RDONLY flags方式下被打开时,read操作才会成功。

lseek(int fd, off_t off, int whence)

(see also man 2 lseek)

Seek操作只支持用于读的文件,即在指定O_RDONLY flags方式下被打开的文件。

write(int fd, const void* buf, size_t count)

(see also man 2 write)

只有当fd指向的文件已经在指定O_WRONLY flags方式下被打开时,write操作才会成功。

性能考虑

由于FUSE和JNR的配合使用,与直接使用alluxio-core-client-fs相比,使用挂载文件系统的性能会相对较差。

大多数性能问题的原因在于,每次进行readwrite操作时,内存中都存在若干个副本,并且FUSE将写操作的最大粒度设置为128KB。其性能可以利用kernel 3.15引入的FUSE回写(write-backs)缓存策略从而得到大幅提高(但该特性目前尚不被libfuse 2.x用户空间库支持)。

Alluxio-FUSE配置参数

以下是Alluxio-FUSE相关的配置参数。

参数默认值描述
alluxio.fuse.maxwrite.bytes 131072 FUSE写操作的粒度(bytes),注意目前128KB是linux内核限制的上界。
alluxio.fuse.debug.enabled false 允许FUSE调试输出, 该输出会被重定向到`alluxio.logs.dir`指定目录中的`fuse.out`日志文件。
alluxio.fuse.cachedpaths.max 500 定义Alluxio-FUSE内部缓存的大小,该缓存用于存储最频繁使用的本地文件系统路径与Alluxio文件URI的对应关系。
alluxio.fuse.mount.default /mnt/alluxio 默认挂载点,只有当用户在挂载时未指定其他值时使用。
alluxio.fuse.fs.root /mnt Alluxio文件系统中的路径,该路径被当作FUSE挂载的根路径。
alluxio.fuse.fs.name alluxio-fuse FUSE挂载文件系统使用的描述性名称。

致谢

该项目使用jnr-fuse以支持基于Java的FUSE。

Need help? Ask a Question