QFS文件系统-学习记录

#总览
Quantcast File System (QFS) 是高性能,且具有故障容错能力的分布式文件系统。它可以支持MapReduce处理,以及其他应用程序的大文件的I/O操作。本文将会介绍QFS,它的相关配置等等。更详细的介绍,请参见QFS官方wiki

如果你有什么未解决的问题,可发送邮件到
qfs-devel@googlegroups.com 或者搜索论坛
QFS Developer Mailing List. 你也可以通过JIRA issue tracker来问问题,报告bugs以及关于QFS功能更新的请求.

更进一步查看QFS内部如何工作的,请参见论文
QFS paper presented at VLDB.

#简介
Hadoop和其他的批处理框架在具有顺序读顺序写(例如MB或者GB级别)的访问模式的文件系统下具有较高的性能。 Quantcast File System (QFS)正是基于这种需求出发开发的分布式文件系统。 它在KFS的基础上演化而来的。 在2011年,QFS开发团队不再使用HDFS作为后端存储,转向使用QFS。 同时,他们将源代码开源在https://github.com/quantcast/qfs

QFS架构
QFS包含3个模块:

  1. Metaserver: 中心元数据服务器,用来管理文件系统目录结构以及文件到数据块的映射关系
  2. Chunk Server: 分布式组件。 存储数据块以及管理对数据块的I/O访问。
  3. Client Library: 此库提供文件系统API来允许应用程序与QFS交互。 应用程序需要连接QFS客户端库以访问QFS

QFS基于C++实现,使用TCP sockets, STL以及boost库。 它已经被部署到运行centos5或6的x86-64架构的生产环境中。 客户端库也已经在CentOS 5 and 6, OSX 10.X, Cygwin, and Debian/Ubuntu进行了测试。

##QFS特性

  1. 增量扩容: Chunk server能在运行时候加入到系统中。它在与metaserver建立连接后,就成为系统的一部分。
  2. 均衡: 在数据放置过程汇总,metaserver尽力使数据均衡分布到系统的所有节点。
  3. 再均衡: metaserver在检测到系统节点的负载不均衡后会对系统数据进行再均衡。 例如有些节点利用率过低(低于20%),有些节点利用率过高(高于80%)
  4. 故障容错: 数据块支持副本以及Reed-solomn 6+3编码
  5. 细粒度的副本,条纹以及恢复模式: 文件级别的配置模式
  6. 再副本: 当文件的数据块副本低于预设值后,metaserver在后台启动自动复制操作。
  7. 数据完整性: 为了处理磁盘故障引起的数据块故障,对数据块生成校验信息。 当客户端读取数据块,会启动数据块校验。如果校验不匹配,会执行再副本操作。
  8. 客户端侧的元数据缓存: QFS客户端库缓存相关的metadata数据来避免重复的metaserver查询以及路径转换。metadata缓存超时30s
  9. 文件写: QFS客户端库使用write-back的cache。 当cahce满了后,客户端将数据flush到chunk server。 应用程序也可以主动调用sync()刷新数据。
  10. 租约: QFS客户端库使用cache来提高性能。 使用租约支持cache一致性
  11. 版本: 数据块具有版本,用来检测旧的数据块,例如考虑如下的场景:
    1. 有3个chunk server s1 s2和s3,存储具有版本号为v的chunk c
    2. 假设s1故障,并且在s1故障期间,客户端写入chunk c
    3. 写操作会在s2和s3中成功,并生成新的版本号v’
    4. 当s1重启,它上报自己的chunks到metaserver
    5. metaserver收到s1上报的版本号v的chunk c, 它发现最新的版本号是v’,于是metaserver通知s1,它的chunk c是旧的
    6. s1删除chunk c
  12. 客户端侧的转移故障: 客户端库在读取数据时候,发现相应的chunk server故障,会转向其他的chunk server读取,这对外部应用透明
  13. 语言支持: 客户端库支持c++,java和实验性的python
  14. 工具: 命令行工具位于…/bin/tools/qfs目录, 它与hadoop fs相似,但是它需要加入JVM虚拟机,将stat命令的执行时间从hadoop的700ms降低到10ms。 它也支持额外的上传和下载命令。
  15. linux下的FUSE支持: 通过FUSE挂载QFS, 支持类linux命令行工具操纵QFS
  16. Unix风格的权限支持

###两个问题:

  1. 租约解决cache一致性:
  2. FUSE支持:
    Linux用于支持用户空间文件系统的内核模块名叫FUSE,FUSE一词有时特指Linux下的用户空间文件系统。
    将QFS挂载为FUSE,可以使用普通的linux命令访问QFS文件系统目录。 简单说来,就是将网络的文件系统挂载到本地,如本地访问一样访问远端。

#编译
1,在https://github.com/quantcast/qfs下载zip压缩包源代码,自动命名为qfs-master.zip
2,解压缩源代码,unzip qfs-master.zip
3,进入qfs-master目录,打开README.md
4,从链接地址https://github.com/quantcast/qfs/wiki/Developer-Documentation进行编译
##具体编译过程:
1,在源代码最顶层目录make命令
2,等待直到编译成功
用户应用程序与qfs client的lib连接,然后client lib连接metaserver或者chunk server进行文件操作

编译模式设定
1,默认debug模式编译,可选用release模式
BUILD_TYPE=release make
生成的内容在build/release/bin目录中
2,启用verbose输出
VERBOSE=true make
3,编译test
make test
这会在本地创建metaserver和chunkserver,并进行一系列测试,这可能会耗费几分钟时间。
4,编写测试程序

#include <gtest/gtest.h>
#include "tests/integtest.h"

class FooTest : public QFSTest {
public:
    virtual void SetUp() { ... }
    virtual void TearDown() { ... }
};

TEST_F(FooTest, TestBar) {
    ...
}

5,编写c++客户端
例子代码在 examples/cc/qfssample_main.cc file.
QFS客户端接口在 src/cc/libclient/KfsClient.h.
客户端链接的库有 libqfs_client library 和其他的 libqfs_ dependencies
6,编写java客户端
java通过jni调用相应接口
例子代码在 examples/java/QfsSample.java.
java客户端相关接口在 src/java/qfs-access/src/main/java/com/quantcast/qfs/access/KfsAccess.java.

java额外的jar包路径: build/java/qfs-access/qfs-access-.jar in the CLASSPATH. 执行客户端需要 build/release/lib should be in the LD_LIBRARY_PATH (or DYLD_LIBRARY_PATH, if it is Mac OS X). To build,

$ cd ~/code/qfs/examples/java
$ qfsjar=`echo ../../build/qfs-access/qfs-access*.jar`
$ javac -classpath "$qfsjar" QfsSample.java
To execute,

$ libdir="`cd ../../build/release/lib && pwd`"
$ export LD_
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值