原生文件系统Java客户端
Alluxio提供了访问数据的文件系统接口。Alluxio上的文件提供了一次写入的语义:文件全部被写入之后就不会改变,而且文件在写操作完成之前不能进行读操作。Alluxio提供了两种不同的文件系统API,本地API和兼容Hadoop的API。本地API提供了额外的功能,而兼容Hadoop的API使用户可以灵活利用Alluxio,但没必要修改用Hadoop API写的代码。
所有的本地javaAPI资源可以通过 AlluxioURI
指定,AlluxioURI
代表资源路径。
获取文件系统客户端
若需要使用Java代码获取一个Alluxio文件系统实例,可使用:
FileSystem fs = FileSystem.Factory.get();
创建文件
所有的元数据操作,以及用于读文件的打开文件的操作或用于写文件的创建文件的操作,都会通过FileSystem对象来执行。因为Alluxio文件一旦写入就不会改变,惯用的创建文件的方式是使用FileSystem#createFile(AlluxioURI)
,这条语句会返回一个用于写文件的流对象,例如:
FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Create a file and get its output stream
FileOutStream out = fs.createFile(path);
// Write data
out.write(...);
// Close and complete file
out.close();
指定操作选项
对于所有FileSystem的操作,可能要指定额外的options
域,该域允许用户指定该操作的非默认设置。例如:
FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Generate options to set a custom blocksize of 128 MB
CreateFileOptions options = CreateFileOptions.defaults().setBlockSize(128 * Constants.MB);
FileOutStream out = fs.createFile(path, options);
IO选项
Alluxio有两种存储类型:Alluxio管理的存储和底层存储。Alluxio管理的存储是分配给Worker的内存、SSD、和(或)HDD。底层存储是由底层存储系统管理的存储资源,如S3,Swift或HDFS。用户可以通过指定ReadType
和WriteType
来与Alluxio本地存储或底层存储进行交互。在读文件的时候,ReadType
给该数据指定了读行为,例如:该数据是否应该被保留在Alluxio存储内。在写新文件的时候,WriteType
给该数据指定了写行为,例如:该数据是否应该被写到Alluxio存储内。
下表描述了ReadType
不同类型对应的不同行为。相较于底层存储系统,优先从Alluxio存储上进行读取。
读类型 | 行为 |
---|---|
CACHE_PROMOTE | 如果读取的数据在Worker上时,该数据被移动到Worker的最高层。如果该数据不在本地Worker的Alluxio存储中,那么就将一个副本添加到本地Alluxio Worker中。如果没有本地Worker,那么就将副本添加到远端Alluxio Worker中。 |
CACHE | 如果该数据不在本地Worker的Alluxio存储中,那么就将一个副本添加到本地Alluxio Worker中。如果没有本地Worker,那么就将副本添加到远端Alluxio Worker中。 |
NO_CACHE | 仅读取数据,不在Alluxio中存储副本。 |
下表描述了WriteType
不同类型对应的不同行为。
写类型 | 行为 |
---|---|
CACHE_THROUGH | 数据被同步地写入到Alluxio的Worker和底层存储系统。 |
MUST_CACHE | 数据被同步地写入到Alluxio的Worker。但不会被写入到底层存储系统。这是默认写类型。 |
THROUGH | 数据被同步地写入到底层存储系统。但不会被写入到Alluxio的Worker。 |
ASYNC_THROUGH | 数据被同步地写入到Alluxio的Worker,并异步地写入到底层存储系统。处于实验阶段。 |
定位策略
Alluxio提供定位策略,用于确定应该选择哪个Worker来存储文件数据块。
使用Alluxio的Java API,用户可以在CreateFileOptions
中设置该策略以用于写文件,也可在OpenFileOptions
中设置该策略用于向Alluxio中读文件。
用户可以简单的覆盖默认策略类通过修改配置文件alluxio.user.block.write.location.policy.class
内的属性。内置策略包括:
-
LocalFirstPolicy(alluxio.client.block.policy.LocalFirstPolicy)
首先返回本地主机,如果本地Worker没有足够的容量容纳一个数据块,那么就会从有效的Worker列表中随机选择一个Worker。这也是默认策略。
-
MostAvailableFirstPolicy (alluxio.client.block.policy.MostAvailableFirstPolicy)
返回拥有最多可用容量的Worker。
-
RoundRobinPolicy (alluxio.client.block.policy.RoundRobinPolicy)
以循环的方式选取存储下一个数据块的Worker,如果该Worker没有足够的容量,就将其跳过。
-
SpecificHostPolicy (alluxio.client.block.policy.SpecificHostPolicy)
返回指定主机名的Worker。该策略不能被设置为默认策略。
Alluxio支持自定义策略,所以你可以通过实现接口alluxio.client.block.policy.BlockLocationPolicy
,开发自己的定位策略来迎合应用需求。注意默认策略必须要有一个空构造函数。要想使用ASYNC_THROUGH写类型,所有的文件数据块必须被写到相同的Worker上。
访问Alluxio上一个存在的文件
对存在的文件和目录进行的所有操作都需要用户指定AlluxioURI
。利用AlluxioURI
,用户可以使用FileSystem
的方法来访问资源。
Write Tier
Alluxio允许客户端在向本地worker写入数据块时选择偏好的存储层。目前这种策略偏好只存在于本地worker,不支持远程workers; 远程worker会将数据块写到最高存储层。
默认情况下,数据写入顶层。 用户可以通过修改alluxio.user.file.write.tier.default
配置文档属性改变默认设置,或通过FileSystem#createFile(AlluxioURI)
的API调用选项覆盖默认设置。
读数据
AlluxioURI
可被用于执行Alluxio FileSystem的操作,例如:修改文件元数据,如ttl或pin状态,或者通过获取一个输入流来读取文件。
例如,读文件:
FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Open the file for reading
FileInStream in = fs.openFile(path);
// Read data
in.read(...);
// Close file relinquishing the lock
in.close();
Javadoc
想要获得更多API信息,请参考 Alluxio javadocs