如何开发底层存储扩展

Slack Docker Pulls GitHub edit source

该页是面向底层存储扩展的开发者的。请浏览managing extensions来获取使用已有扩展的指导。

底层存储扩展被构建为jar,并包含在一个特定的扩展位置,由Alluxio core提取。这一页描述了在Alluxio中的扩展如何工作的机制,并提供了开发底层存储扩展的详细说明。扩展提供了一个框架,使更多的存储库能够使用Alluxio,并使开发Alluxio不支持的模块变得方便。

工作原理

发现服务

扩展jar包在Alluxio server运行时动态加载,使得Alluxio能与新的底层存储扩展交互而不用重启。 Alluxio server使用Java ServiceLoader来发现底层存储API。 提供者要把alluxio.underfs.UnderFileSystemFactory的接口的实现包含在内。 实现的宣传方式是在META_INF/services中包含一个文本文件,其中只有一行指向实现该接口的类。

依赖管理

实现者需要将传递的依赖包含在扩展jar包内。Alluxio为每个扩展jar包实行独立的类加载来避免Alluxio server和扩展之间的冲突。

实现一个底层存储扩展

建立一个新的底层存储连接涉及:

-实现所需的存储接口

-声明服务实现

-将实现和传递依赖打包到一个uber JAR中

参考的实现可以在alluxio-extensions找到。 本章剩余部分将介绍写一个新底层存储扩展的步骤。名为DummyUnderFileSystem的样例,使用maven作为build和依赖管理工具,并将所有操作转发到本地文件系统。

实现底层存储接口

HDFS SubmoduleS3A Submodule是两个将存储系统对接Alluxio好的样例。

步骤1:实现接口UnderFileSystem

UnderFileSystem接口定义在模块org.alluxio:alluxio-core-common中。选择扩展BaseUnderFileSystemObjectUnderFileSystem来完成UnderFileSystem接口。 ObjectUnderFileSystem适合连接到对象存储,并将文件系统操作抽象为对象存储。

  1. public class DummyUnderFileSystem extends BaseUnderFileSystem {
  2. // Implement filesystem operations
  3. ...
  4. }

或是,

  1. public class DummyUnderFileSystem extends ObjectUnderFileSystem {
  2. // Implement object store operations
  3. ...
  4. }

步骤2:完成接口UnderFileSystemFactory

底层存储factory定义了UnderFileSystem实现支持的路径,以及如何创建UnderFileSystem实现。

  1. public class DummyUnderFileSystemFactory implements UnderFileSystemFactory {
  2. ...
  3. @Override
  4. public UnderFileSystem create(String path, UnderFileSystemConfiguration conf) {
  5. // Create the under storage instance
  6. }
  7. @Override
  8. public boolean supportsPath(String path) {
  9. // Choose which schemes to support, e.g., dummy://
  10. }
  11. }

声明该服务

src/main/resources/META_INF/services/alluxio.underfs.UnderFileSystemFactory创建文件来告知ServiceLoader完成的UnderFileSystemFactory

  1. alluxio.underfs.dummy.DummyUnderFileSystemFactory

编译

使用maven-shade-pluginmaven-assembly将扩展工程的所有传递依赖包含在built jar中。 此外,为了避免冲突,指定依赖alluxio-core-common的范围为provided。maven定义像下面这样:

  1. <dependencies>
  2. <!-- Core Alluxio dependencies -->
  3. <dependency>
  4. <groupId>org.alluxio</groupId>
  5. <artifactId>alluxio-core-common</artifactId>
  6. <scope>provided</scope>
  7. </dependency>
  8. ...
  9. </dependencies>

测试

扩展AbstractUnderFileSystemContractTest来测试定义的UnderFileSystem符合Alluxio与底层存储模块的约定。 看下面的参考实现来将测试参数包含。

  1. public final class DummyUnderFileSystemContractTest extends AbstractUnderFileSystemContractTest {
  2. ...
  3. }

恭喜!你已经开发了一个Alluxio的新底层存储扩展。 向Alluxio repository提交一个pull request来让社区知道它,在documentation page章节编辑扩展列表。