如何开发底层存储扩展
该页是面向底层存储扩展的开发者的。请浏览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 Submodule和S3 Submodule是两个将存储系统对接Alluxio好的样例。
步骤1:实现接口UnderFileSystem
UnderFileSystem
接口定义在模块org.alluxio:alluxio-core-common
中。选择扩展BaseUnderFileSystem
或ObjectUnderFileSystem
来完成UnderFileSystem
接口。 ObjectUnderFileSystem
适合连接到对象存储,并将文件系统操作抽象为对象存储。
public class DummyUnderFileSystem extends BaseUnderFileSystem {
// Implement filesystem operations
...
}
或是,
public class DummyUnderFileSystem extends ObjectUnderFileSystem {
// Implement object store operations
...
}
步骤2:完成接口UnderFileSystemFactory
底层存储factory定义了UnderFileSystem
实现支持的路径,以及如何创建UnderFileSystem
实现。
public class DummyUnderFileSystemFactory implements UnderFileSystemFactory {
...
@Override
public UnderFileSystem create(String path, UnderFileSystemConfiguration conf) {
// Create the under storage instance
}
@Override
public boolean supportsPath(String path) {
// Choose which schemes to support, e.g., dummy://
}
}
声明该服务
在src/main/resources/META-INF/services/alluxio.underfs.UnderFileSystemFactory
创建文件来告知ServiceLoader完成的UnderFileSystemFactory
。
alluxio.underfs.dummy.DummyUnderFileSystemFactory
编译
使用maven-shade-plugin
或maven-assembly
将扩展工程的所有传递依赖包含在built jar中。 此外,为了避免冲突,指定依赖alluxio-core-common
的范围为provided
。maven定义像下面这样:
<dependencies>
<!-- Core Alluxio dependencies -->
<dependency>
<groupId>org.alluxio</groupId>
<artifactId>alluxio-core-common</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
测试
扩展AbstractUnderFileSystemContractTest
来测试定义的UnderFileSystem
符合Alluxio与底层存储模块的约定。 看下面的参考实现来将测试参数包含。
public final class DummyUnderFileSystemContractTest extends AbstractUnderFileSystemContractTest {
...
}
恭喜!你已经开发了一个Alluxio的新底层存储扩展。 向Alluxio repository提交一个pull request来让社区知道它,在documentation page章节编辑扩展列表。