KFS(kosmosfs)的编译和安装部署 (step by step)

来源:互联网 发布:监控qq软件 重装系统 编辑:程序博客网 时间:2024/04/30 15:13

1. 简介

KFS是基于GFS(The Google File System)用C++实现的分布式文件系统,是GFS的两个实现之一(另一个是HDFS,在HADOOP开源项目中,用JAVA编写)。

2. 参考

http://code.google.com/p/kosmosfs/
http://sourceforge.net/projects/kosmosfs/
http://sourceforge.net/apps/trac/kosmosfs/wiki/UsingWithFUSE

3. 系统环境

OS: Ubuntu 10.0.4

KFS版本: kfs-0.5

4. 编译KFS

下载KFS源码包kfs-0.5.tar.gz,并解压,进入解压后的目录。
http://code.google.com/p/kosmosfs/wiki/HowToCompile

4.1. 编译C++模块

因系统环境不同,可能需要安装相关的软件包。

安装xfs

$ git clone git://oss.sgi.com/xfs/cmds/xfsprogs
$ make (./configure)
$ sudo make install
$ sudo make install-dev   # 注意这一步
(出现以下错误时安装相应的开发包)
FATAL ERROR: could not find a valid UUID header.
Install the Universally Unique Identifiers development package.

--->
sudo apt-get install uuid-dev

FATAL ERROR: msgfmt does not seem to be installed.
xfsprogs cannot be built without a working gettext installation.
-->
sudo apt-get install gettext

make: aclocal: Command not found
-->
sudo apt-get install automake


编译kfs-0.5


如果需要使KFS支持FUSE(先安装Fuse),需要先在CMakeList.txt中作如下设置:

SET(Fuse_LIBRARY_DIR "/usr/local/lib")
SET(Fuse_INCLUDE_DIR "/usr/local/include")

也有可能需要设置如下变量(可以先跳过):
SET(JAVA_INCLUDE_PATH "/usr/lib/jvm/java-6-openjdk/include")
SET(JAVA_INCLUDE_PATH2 "/usr/lib/jvm/java-6-openjdk/include/linux")

使用CMake进行编译, 并生成安装文件:
kfs-0.5$ mkdir build
kfs-0.5$ cd build
kfs-0.5$ cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo ../
kfs-0.5$ make
kfs-0.5$ make install
生成文件: build/lib, bin, include

(出现以下错误时安装相应的开发包)
error: openssl/rand.h: No such file or directory
-->
sudo apt-get install libssl-dev

4.2. 编译Java模块

kfs-0.5$ ant jar

4.3. 编译Python模块

配置 (确保boost c++已经安装,例如 <path to boost>='/usr/include')
kfs-0.5/src/cc/access$ vi kfs_setup.py
kfsext = Extension('kfs', include_dirs ['kfs/src/cc/', '<path to boost>'])
编译
kfs-0.5/src/cc/access$ python kfs_setup.py ../../../build/lib/ build
生成 .../access/build/lib.linux-x86_64-2.6/kfs.so
安装

src/cc/access$ sudo python kfs_setup.py ../../../build/lib/ install

5. 安装部署KFS


http://code.google.com/p/kosmosfs/wiki/HowToDeploy
kfs-0.5/doc/DEPLOYING.txt

5.1. 前提条件

跟HADOOP一样,KFS的MetaServer(Master)通过无需密码的SSH访问ChunkServer(DataServer),因此,需要先在MetaServer所在机器生成无密码的SSH公钥,并追加到ChunkServer所在机器的SSH已授权密钥文件中。

------
安装:
$ sudo apt-get install openssh-server openssh-client
------

生成公钥:
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
将~/.ssh/id_dsa.pub文件中的内容追加到目标机器的authorized_keys文件中:
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

5.2. 单节点部署示例

1. 配置文件
kfs-0.5/scripts$ vi machines.cfg

---------------
[metaserver]
node: localhost
rundir: /home/username/kfsRun/meta
baseport: 20000
clusterkey: test-cluster
[chunkserver1]
node: localhost
rundir: /home/username/kfsRun/chunk1
baseport: 30000
space: 10 G
[chunkserver2]
node: localhost
rundir: /home/username/kfsRun/chunk2
baseport: 40000
space: 10000 M
---------------

如果需要使用WebUI查看的监控简单信息:

kfs-0.5/webui$ vi all-machines.txt
------------
localhost
-----------

2. 安装

* KFS在安装时的便利之处在于,只需要在配置文件指定MetaServer和ChunkServer的机器地址和目录,通过一次安装命令即可完成所有节点的安装,而不需要手动部署各个节点,这在多结点部署时比较方便。 可以注意到,KFS在编译时,可执行文件是通过静态链接所需的库。

单节点部署安装

scripts$ python kfssetup.py -f machines.cfg -b ../build -w ../webui -s

3. 启动

scripts$ python kfslaunch.py -f machines.cfg --start

4. 查看状态

build/bin/tools$ ./kfsping -c -s localhost -p 30000

Meta-server: localhost 20100
Total-space: 2048 (MB)
Used-space: 0 (MB)
build/bin/tools$ ./kfsping -c -s localhost -p 40000
Meta-server: localhost 20100
Total-space: 2000 (MB)
Used-space: 0 (MB)
build/bin/tools$ ./kfsping -m -s localhost -p 20000
Up servers: 2
s=127.0.1.1, p=40000, rack=0, used=0(GB), free=1.95312(GB), util=0%, nblocks=0, lastheard=15 (sec), ncorrupt=0, nchunksToMove=0, numDrives=1
s=127.0.1.1, p=30000, rack=0, used=0(GB), free=2(GB), util=0%, nblocks=0, lastheard=15 (sec), ncorrupt=0, nchunksToMove=0, numDrives=1

Web UI
http://localhost:20050/

5. 停止 server
scripts$ python kfslaunch.py -f machines.cfg--stop

6. 卸载KFS
scripts$ python kfssetup.py -f machines.cfg -b ../build/bin -U

7. shell client for KFS
build/bin/tools$ ./kfsshell -s localhost -p 20000   # -s [ip地址] -p [端口]
可以通过shell进行允许的文件操作

5.3. 多结点部署示例

* 需要注意的是,KFS多结点部署时,不同节点机器需要使用相同的用户名(username)登录、部署。

配置文件

scripts$ vi machines_distributed.cfg
------------------
[metaserver]
node: 172.16.0.163
rundir: /home/username/kfsRun/meta
baseport: 20000
clusterkey: test-cluster
[chunkserver1]
node: 172.16.0.161
rundir: /home/username/kfsRun/chunk
baseport: 30000
space: 10 G
[chunkserver2]
node: 172.16.0.163
rundir: /home/username/kfsRun/chunk
baseport: 30000
space: 10 G
----------------

安装

$ python kfssetup.py -f machines_distributed.cfg -b ../build -w ../webui

其他步骤和命名跟单节点部署一样。

6. 通过FUSE将KFS挂载到本地文件系统 (Mounting KFS via FUSE)

编译

前面在编译时,已经在CMakeLists.txt中设置了以下变量:
SET(Fuse_LIBRARY_DIR "/usr/local/lib")
SET(Fuse_INCLUDE_DIR "/usr/local/include")

配置

在build/bin中已经生成可执行文件kfs_fuse,在kfs_fuse所在目录创建文件kfs.prp:

--------
metaServer.name = localhost
metaServer.port = 20000
--------

* 注意,如果按KFS的wiki上写的metaServer.host(上面被替换为metaServer.name),mount时会出现下面的错误:

-----------
kfs_fuse: /usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = KFS::KfsClient]: Assertion `px != 0' failed.
Aborted
-----------

查看KFS代码可知,配置已经更新为metaServer.name,但是wiki还未更新。

挂载

build/bin$ mkdir /tmp/kfs-fuse

build/bin$ ./kfs_fuse /tmp/kfs-fuse -f

之后就可以像操作本地文件系统一样操作KFS,但是KFS目前对FUSE的支持比较简单,不能满足实用要求,有待改进。

卸载

build/bin$  sudo umount /tmp/kfs-fuse



原创粉丝点击