Disco是一套轻量的Map-Reduce系统,其核心部分由并行性能很高的Erlang语言开发,其外部编程接口为易于编程的Python语言。Disco可以实现在集群和多核计算机上的部属,并可以部署在Amazon EC2上。下面我们将介绍一下如何在Ubuntu系统上配置Disco系统。
1.安装必要的软件包
2.编译和安装Disco
编译Disco很简单,只需要将Disco解压后在目录中直接 make 就可以,如果需要指定一个安装路径,可以用make install DESTDIR=***,将安装路径指定到***所代替的地址。如果需要在集群上来运行Disco,那么需要在集群的每一台机器上都配置好Disco。
3.配置Disco的运行环境
我们首先完成Disco在单机上的配置。
1)
我们需要让disco用户在SSH时可以不需要密码登录
假设节点上没有有效的ssh-key,可以通过下面的命令创建一个:
ssh-keygen -N '' -f ~/.ssh/id_dsa
在单机上或者共享存储的机群上,可以通过下面的命令配置:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
配置完成后,可以通过下面的命令进行测试,如果不需要登录密码说明配置成功:
2)
我们把Disco的安装路径称作$DISCOHOME$。
然后,我们需要在PYTHONPATH中增加$DISCOHOME$/pydisco,$DISCOHOME$/pydisco/disco,$DISCOHOME$/util,$DISCOHOME$/node/disconode等路径。
3)
启动Disco。
我们通过下面的方法分别在单机上启动master和node节点的disco进程。
conf/start-master
conf/start-node
需要注意的是,最好在执行这两个命令关闭之前启动的beam和lighttpd进程:
sudo killall -9 beam
sudo killall -9 lighttpd
4)
在浏览器中打开 http://localhost:7000 并且configure中增加可用的节点数(比如设定Nodes为localhost,Max Workers为2),并保存。
5)
通过以上的步骤,对于Disco设置基本完成,我们可以编写一个程序来测试Disco,比如网站上的统计词频的范例wordcount.py,其代码如下:
from disco.core import Disco, result_iterator
import disco
import sys
def fun_map(e, params):
return [(w, 1) for w in e.split()]
def fun_reduce(iter, out, params):
s = {}
for w, f in iter:
s[w] = s.get(w, 0) + int(f)
for w, f in s.iteritems():
out.add(w, f)
inputAddress = ["http://discoproject.org/chekhov.txt"]
results = disco.job(sys.argv[1], name = "wordcount",
input = inputAddress,
map = fun_map,
reduce = fun_reduce,
nr_reduces = 1,
sort = False)
for word, frequency in result_iterator(results):
print word,frequency
然后,运行python wordcount.py http://localhost:7000运行程序就可以,可以从http://localhost:7000来查看程序的运行状况。