Alluxio 可以将HDFS, S3, OSS, COS 等主流存储系统挂载到 Alluxio 中,但如果你想使用的存储系统,目前 Alluxio 还未支持,该怎么办呢?你可以自己动手,集成新的底层存储系统到 Alluxio中来。
1 Alluxio全局namespace介绍
从下图可以了解到,Alluxio作为一个数据编排系统,可以把各种各样的主流的存储系统,挂载到Alluxio中,并且这些主流的大数据生态应用,都可以在不修改代码的前提下接入Alluxio。
在 Alluxio 中,一个底层存储系统是可以插拔的,任何文件存储系统和对象存储系统都可以集成到 Alluxio 中。因此,用户可以挂载不同的存储,像 AWS S3 或者 HDFS 等存储系统都可以挂载到 Alluxio 中。Alluxio 将 UnderFileSystem 框架设计成模块化,为了让用户可以很容易地扩展自己的底层文件系统支持。
如上图,我们可以同时挂载HDFS, S3, OSS, COS, Ozone 等底层存储到 Alluxio 中。某种意义上,Alluxio是一个全局的中心化的挂在表,并提供一个全局统一的命名空间。
我们可以挂载很多底层存储到Alluxio,终端用户不会感知到访问请求被映射到哪里,也不会感知到正在访问哪个存储系统。
甚至我们重新将一个挂载点,从一个底层存储,转移到另一个底层存储,客户端和终端用户什么都不需要做。
2 Alluxio UnderFileSystem如何工作
2.1如何挂载底层存储
./bin/alluxio fs mount \
--option alluxio.underfs.hdfs.configuration=<DIR>/ozone-site.xml:<DIR>/core-site.xml\
/ozone o3fs://<OZONE_BUCKET>.<OZONE_VOLUME>/
挂载底层存储系统的方法,可以在alluxio-site.properties里配置,或者通过调用Alluxio java API 中的mount方法,最简单的方式,就是使用 Alluxio 提供的 mount
命令进行挂载。需要特别注意的是,如果你指定了配置文件,则需要保证,Alluxio的master和worker上同样的路径都存在指定的配置文件,因为Alluxio的 master 和worker 都需要访问底层存储。
2.2加载 UnderFileSystem
Alluxio有很多UnderFileSystem实现,那么,Alluxio是如何发现这些支持的 UnderFileSystem的呢?Alluxio服务在运行时,动态加载扩展的 JAR,这使得 Alluxio 可以与新的底层文件系统通信,并且无需重启服务。Alluxio的服务使用Java ServicesLoader寻找实现了UnderFileSystemFactory接口的底层存储,底层存储实现者需要创建一个UnderFileSystemFactory文件来指定具体的UnderFileSystemFactory实现类。
2.3依赖管理
实现新的底层存储,需要包含透明的依赖包到自己的扩展JAR包里,我们通常叫它 shaded fat jar。Alluxio为每一个扩展JAR采用独立的类加载器,从而避免Alluxio服务和底层扩展之间的依赖冲突。
每一个UFS模块的JAR会在构建之后,生成在lib文件夹,然后Service Loader会通过这些 JAR 发现并加载其中的底层存储系统。
下图是Alluxio的underfs模块的子模块。
下图中的文件是从那些底层模块生成的JAR。
3 如何实现一个UnderFileSystem
首先,你需要实现UnderFileSystem接口。下图展现出UnderFileSystem的所有实现类。选择扩展自一个合适的父类,会事半功倍。
其实不是特别麻烦,只需要实现很少的接口方法就可以。就像下图中的方法。
你还需要在特定的位置创建一个文件文件,META_INF/services/alluxio.underfs.UnderFileSystemFactory然后把你的实现类填写到这个文件中,如下图所示。
为了获取一个shaded fat jar,你需要在你新创建的模块的pom.xml中,新增以下maven 插件。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.coderplus.maven.plugins</groupId>
<artifactId>copy-rename-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4 实现Ozone UnderFileSystem
目前,Alluxio已经支持Ozone作为底层存储系统。因此,我们可以挂载Ozone到Alluxio中,Alluxio的client可以通过Alluxio的master和worker,来访问Ozone。
这可以提速文件系统语义操作,如listStatus操作,listStatus在对象存储里是比较重的操作,但对于文件系统,则非常简单迅速。并且,Alluxio 可以缓存 Ozone 的数据,所以,Alluxio 可以在大数据场景下,为 Ozone 起到加速效果。
下图是Alluxio支持Ozone UFS相关的变更项清单,最重要的是 OzoneUnderFileSystemFactory类,它扩展自HdfsUnderFileSystemFactory,因此,这可以减少大部分工作,也减少了大部分冗余代码。
关键点是,我使用OzoneFilesystem来访问Ozone,OzoneFilesystem是hadoop 兼容文件系统接口的实现类,大部分工作都被HdfsUnderFileSystemFactory完成,甚至,我都不用创建OzoneUnderFileSystem,因为HdfsUnderFileSystem就够了。
需要澄清一个小细节,我不得不创建一个额外的shaded-ozone模块,因为,一些依赖类已经被hadoop-shaded模块利用maven shade插件进行过shade。如果我不shade Ozone,则会遇到ClassCastException。
但是,如果你正在写一个全新的底层文件系统模块,没有依赖任何其它底层存储模块,则不必担忧这个问题。
下图是serviceloader需要加载的文件,内容是OzoneUnderFileSystemFactory的完成的类名,Alluxio 底层文件系统框架会通过这个文件发现 Ozone UFS。
以下链接时 Alluxio 支持 Ozone 作为新的 UFS 的相关的PullRequest 链接。
https://github.com/Alluxio/alluxio/pull/11396
https://github.com/Alluxio/alluxio/pull/12371
下图是 Alluxio 的 master WebUI, 我们把 Ozone 挂载到了 Alluxio 中。
我们可以 list Ozone文件夹的内容,也可以通过Alluxio 读取 Ozone 里的文件。
Alluxio 命令行工具,也可以 list Ozone 文件夹和读取文件内容。