FUSE-based POSIX API
The Alluxio POSIX API is a feature that allows mounting an Alluxio File System as a standard file system on most flavors of Unix. By using this feature, standard tools (for example, ls
, cat
or mkdir
) will have basic access to the Alluxio namespace. More importantly, with the POSIX API integration applications can interact with the Alluxio no matter what language (C, C++, Python, Ruby, Perl, or Java) they are written in without any Alluxio library integrations.
Note that Alluxio-FUSE is different from projects like s3fs, mountableHdfs which mount specific storage services like S3 or HDFS to the local filesystem. The Alluxio POSIX API is a generic solution for the many storage systems supported by Alluxio. Data orchestration and caching features from Alluxio speed up I/O access to frequently used data.
The Alluxio POSIX API is based on the Filesystem in Userspace (FUSE) project. Most basic file system operations are supported. However, given the intrinsic characteristics of Alluxio, like its write-once/read-many-times file data model, the mounted file system does not have full POSIX semantics and contains some limitations. Please read the section of limitations for details.
Requirements
- JDK 1.8 or newer
- libfuse 2.9.3 or newer (2.8.3 has been reported to also work - with some warnings) for Linux
- osxfuse 3.7.1 or newer for MacOS
Usage
Mount Alluxio-FUSE
After properly configuring and starting an Alluxio cluster; Run the following command on the node where you want to create the mount point:
$ ${ALLUXIO_HOME}/integration/fuse/bin/alluxio-fuse mount <mount_point> [<alluxio_path>]
This will spawn a background user-space java process (alluxio-fuse
) that will mount the Alluxio path specified at <alluxio_path>
to the local file system on the specified <mount_point>
.
For example, running the following commands from the ${ALLUXIO_HOME}
directory will mount the Alluxio path /people
to the folder /mnt/people
on the local file system.
$ ./bin/alluxio fs mkdir /people
$ sudo mkdir -p /mnt/people
$ sudo chown $(whoami) /mnt/people
$ chmod 755 /mnt/people
$ integration/fuse/bin/alluxio-fuse mount /mnt/people /people
When <alluxio_path>
is not given, the value defaults to the root (/
). Note that the <mount_point>
must be an existing and empty path in your local file system hierarchy and that the user that runs the integration/fuse/bin/alluxio-fuse
script must own the mount point and have read and write permissions on it. You can create multiple Alluxio to mount points. All the AlluxioFuse
processes share the same log output at $ALLUXIO_HOME\logs\fuse.log
, which is useful for troubleshooting when errors happen on operations under the filesystem.
Unmount Alluxio-FUSE
To unmount a previously mounted Alluxio-FUSE file system, on the node where the file system is mounted run:
$ ${ALLUXIO_HOME}/integration/fuse/bin/alluxio-fuse unmount mount_point
This unmounts the file system at the mount point and stops the corresponding Alluxio-FUSE process. For example,
$ ${ALLUXIO_HOME}/integration/fuse/bin/alluxio-fuse unmount /mnt/people
Unmount fuse at /mnt/people (PID:97626).
Check the Alluxio POSIX API mounting status
To list the mount points; on the node where the file system is mounted run:
$ ${ALLUXIO_HOME}/integration/fuse/bin/alluxio-fuse stat
This outputs the pid, mount_point, alluxio_path
of all the running Alluxio-FUSE processes.
For example, the output could be:
pid mount_point alluxio_path
80846 /mnt/people /people
80847 /mnt/sales /sales
Advanced configuration
Configure Alluxio client options
Alluxio POSIX API is based on the standard Java client API alluxio-core-client-fs
to perform its operations. You might want to customize the behaviour of the Alluxio client used by Alluxio POSIX API the same way you would for any other client application.
One possibility, for example, is to edit ${ALLUXIO_HOME}/conf/alluxio-site.properties
and set your specific Alluxio client options. Note that these changes should be done before the mounting steps.
Configure mount point options
You can use -o [mount options]
to set mount options. If you want to set multiple mount options, you can pass in comma separated mount options as the value of -o
. The -o [mount options]
must follow the mount
command.
The available Linux mount options are listed here. The mount options of MacOS with osxfuse are listed here . Some mount options (e.g. allow_other
and allow_root
) need additional set-up and the set up process may be different depending on the platform.
$ ${ALLUXIO_HOME}integration/fuse/bin/alluxio-fuse mount \
-o [comma separated mount options] mount_point [alluxio_path]
Note that the direct_io
mount option is set by default so that writes and reads bypass the kernel page cache and go directly to Alluxio.
Different versions of libfuse
and osxfuse
support different mount options.
Example: allow_other or allow_root
By default, Alluxio-FUSE mount point can only be accessed by the user mounting the Alluxio namespace to the local filesystem.
For Linux, add the following line to file /etc/fuse.conf
to allow other users or allow root to access the mounted folder:
user_allow_other
This option allow non-root users to specify the allow_other
or allow_root
mount options.
For MacOS, follow the osxfuse allow_other instructions to allow other users to use the allow_other
and allow_root
mount options.
After setting up, pass the allow_other
or allow_root
mount options when mounting Alluxio-FUSE:
# All users (including root) can access the files.
$ integration/fuse/bin/alluxio-fuse mount -o allow_other mount_point [alluxio_path]
# The user mounting the filesystem and root can access the files.
$ integration/fuse/bin/alluxio-fuse mount -o allow_root mount_point [alluxio_path]
Note that only one of the allow_other
or allow_root
could be set.
Assumptions and limitations
Currently, most basic file system operations are supported. However, due to Alluxio implicit characteristics, please be aware that:
- Files can be written only once, only sequentially, and never be modified. That means overriding a file is not allowed, and an explicit combination of delete and then create is needed. For example, the
cp
command will fail when the destination file exists.vi
andvim
commands will succeed because the underlying system do create, delete, and rename operation combinations. - Alluxio does not have hard-links or soft-links, so commands like
ln
are not supported. The hardlinks number is not displayed inll
output. - The user and group are mapped to the Unix user and group only when Alluxio POSIX API is configured to use shell user group translation service, by setting
alluxio.fuse.user.group.translation.enabled
totrue
. Otherwisechown
andchgrp
are no-ops, andll
will return the user and group of the user who started the Alluxio-FUSE process. The translation service does not change the actual file permission when runningll
.
Performance considerations
Due to the conjunct use of FUSE and JNR, the performance of the mounted file system is expected to be worse than what you would see by using the Alluxio Java client directly.
Most of the overheads come from the fact that there are several memory copies going on for each call for read
or write
operations. FUSE caps the maximum granularity of writes to 128KB. This could be probably improved by a large extent by leveraging the FUSE cache write-backs feature introduced in the 3.15 Linux Kernel (supported by libfuse 3.x but not yet supported in jnr-fuse).
Configuration Parameters For Alluxio POSIX API
These are the configuration parameters for Alluxio POSIX API.
Parameter | Default Value | Description |
---|---|---|
alluxio.fuse.cachedpaths.max | 500 | Defines the size of the internal Alluxio-FUSE cache that maintains the most frequently used translations between local file system paths and Alluxio file URIs. |
alluxio.fuse.debug.enabled | false | Enable FUSE debug output. This output will be redirected in a fuse.out log file inside alluxio.logs.dir . |
alluxio.fuse.fs.name | alluxio-fuse | Descriptive name used by FUSE to mount the file system. |
alluxio.fuse.maxwrite.bytes | 131072 | The desired granularity of FUSE write upcalls in bytes. Note that 128K is currently an upper bound imposed by the linux kernel. |
alluxio.fuse.user.group.translation.enabled | false | Whether to translate Alluxio users and groups into Unix users and groups when exposing Alluxio files through the FUSE API. When this property is set to false, the user and group for all FUSE files will match the user who started the alluxio-fuse process |
Acknowledgements
This project uses jnr-fuse for FUSE on Java.