如何集成底层存储系统到Alluxio——Apache Ozone为例

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 文件夹和读取文件内容。

在这里插入图片描述

5 引用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值