3.4.3 两个例子

从上面的内容可以知道,Hadoop流的API是一个扩展性非常强的框架,它与程序相连的部分只有数据,因此可以接受任何适用于UNIX标准输入/输出的脚本语言,比如Bash、PHP、Ruby、Python等。

下面举两个非常简单的例子来进一步说明它的特性。

1.Bash

MapReduce框架是一个非常适合在大规模的非结构化数据中查找数据的编程模型,grep就是这种类型的一个例子。

在Linux中,grep命令用来在一个或多个文件中查找某个字符模式(这个字符模式可以代表字符串,多用正则表达式表示)。

下面尝试在如下的数据中查找带有Hadoop字符串的行,如下所示。

输入文件为:


file01:

hello world bye world

file02:

hello hadoop bye hadoop


reduce文件为:


reduce.sh:

grep hadoop

输入命令为:

bin/hadoop jar contrib/streaming/hadoop-0.20.2-streaming.jar-input input-output

output-mapper/bin/cat-reducer~/Desktop/test/reducer.sh-file~/Desktop/test/

reducer.sh

结果为:

hello hadoop bye hadoop


显然,这个结果是正确的。

2.Python

对于Python来说,情况有些特殊。因为Python是可以编译为JAR包的,如果将程序编译为JAR包,那么就可以采用运行JAR包的方式来运行了。

不过,同样也可以用流的方式运行Python程序。请看如下代码:


Reduce.py

!/usr/bin/python

import sys;

def generateLongCountToken(id):

return"LongValueSum:"+id+"\t"+"1"

def main(argv):

line=sys.stdin.readline();

try:

while line:

line=line[:-1];

fields=line.split("\t");

print generateLongCountToken(fields[0]);

line=sys.stdin.readline();

except"end of file":

return None

ifname=="main":

main(sys.argv)


使用如下命令来运行:


bin/hadoop jar contrib/streaming/hadoop-0.20.2-streaming.jar-input input-output

pyoutput-mapper reduce.py-reducer aggregate-file reduce.py


注意其中的aggregate是Hadoop提供的一个包,它提供一个Reduce函数和一个combine函数。这个函数实现一些简单的类似求和、取最大值最小值等的功能。