说明
- 定义FileSystem模型和API,向应用程序提供一致性模型。
- HDFS的操作系统是基于POSIX文件系统行为基础上建模的,使用POSIX的操作和返回码作为参考。
- 绑定的S3AFileSystem使得AWS的对象存储库可以通过FileSystem API访问。SwiftFileSystem可以访问OpenStack Swift BlobStore等等,不同的FileSystem可以绑定到不同的存储。具有不同的行为,特别是关于一致性的保证和原子性。还有一些第三方的FileSystem,但是没有保证兼容性。
- LocalFileSystem可以访问底层文件,它的行为和操作系统有关,可能和HDFS不一致。
FileSystem API的隐式说明
- 包含文件和目录
- 文件具有0或者多个Byte数据
- 文件下面不能包括文件或者目录
- 目录包含0个或多个文件
… - 目录列表中文件属性与文件的实际属性匹配,与打开文件的文件引用视图一致
- 安全:如果调用方没有操作权限,那么它将失败并引起错误
和POSIX的文件系统基本上一致,只不过太常见了,理所当然了。
- 路径
常见的约束,不能有.,不能有/,不能有不可见字符
Hadoop FileSystem兼容性的核心期望
Hadoop兼容的文件系统需要有这些期望,如果没有的话,可能会产生错误预期。
原子性
- create
- delete
- rename
这些操作需要具有原子性,HDFS文件系统提供了递归删除目录的原子性保证,但是其他的系统没保证。
一致性
- create/update
一旦close()文件流,其他的查看元数据,内容必须可以立即查看 - delete
一旦delete操作,所有操作要立马不可见 - rename
一旦完成rename,新名称操作必须成功,旧名称必须失败
并行性
独立访问数据时,一个客户机正在交互,另一个修改,修改不保证可见。
操作失败
- 操作必须是成功或者失败。
- 完成操作的时间未知
- IOException
网络或者远程或者高层的异常抛出IOException而不是RuntieException - RuntimeException
- 异常抛出
异常需要抛出,不能通过编码报出 - 如果操作没有定义在类中,抛出UnsupportOperationException
- 失败的操作可以重试,直到成功
未定义容量限制
- 最大文件数
- 最大目录数
- 最大文件名称长度
- 最大深度
- 单个文件最大大小
未定义超时
一些操作未定义超时
- blocking操作的最大阻塞时间
比如说s3 rename时间会影响S3FileSystem的rename时间。 - 读空闲超时时间
- 写空闲超时时间
在hdfs中,block操作超时的时间是可以通过参数调整的
Object store VS FileSystem
Hadoop提供了读写s3的客户端,提供了FileSystem类,但是不能直接用s3代替hdfs的原因是上述的底层文件系统的假设。
什么是对象存储
对象存储是一种数据存储服务,通过HTTP/HTTPS访问操作。
对象按照名称存储,可能包含“/”符号,没有目录概念,可以为对象分配任意名称。
对象存储对给定前缀检索效率较高。
HDFS FileSystem让存储假装他们是一个FileSystem,但是实际对象存储并不是。有时候这种错觉会失效。
从几个方面看他们的不同:
- 一致性
对象存储一般是最终一致性 - 原子性
s3关于rename和delete不是原子的。 - 持久化
HDFS和S3的写入不同,HDFS写入是通过flush写入,S3的话,是通过存储到本地文件和close时上传。 - 授权
FileSystem的授权和S3不同。FileStatus来进行目录,文件,用户,用户组,其他这样授权授权。s3不支持这种授权方式。
时间戳
FileStatus包含modify和access时间戳
- HDFS支持
- 其他文件系统如果底层的FS不支持access time,为了性能,通常禁用。
- S3的事件更加模糊
如果是需要用到时间戳的功能,比如说集中式缓存等,一定要进行这方面的测试