当前位置:首页 > Windows程序 > 正文

5.hadoop流原理、实例和新旧API下Wordcount详解

2021-03-29 Windows程序

前四篇文章讲了Hadoop的配置和测试以及eclipse下的使用,有兴趣的可以先看下。

1.Hadoop流简介

用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出。

当一个可执行文件作为Mapper时,每一个Map任务会以一个独立的进程启动这个可执行文件,然后在Map任务运行时,会把输入切分成行提供给可 执行文件,并作为它的标准输入(stdin)内容。当可执行文件运行出结果时,Map从标准输出(stdout)中收集数据,并将其转化 为<key, value>对,作为Map的输出。

Reduce与Map相同,如果可执行文件做Reducer时,Reduce任务会启动这个可执行文件,并且将<key, value>对转化为行作为这个可执行文件的标准输入(stdin)。然后Reduce会收集这个可执行文件的标准输出(stdout)的内容。并 把每一行转化为<key, value>对,作为Reduce的输出。

Map与Reduce将输出转化为<key , value>对的默认方法是:将每行的第一个tab符号(制表符)之前的内容作为key,之后的内容作为value。如果没有tab符号,那么这一 行的所有内容会作为key,而value值为null。当然这是可以更改的。

值得一提的是,可以使用Java类作为Map,而用一个可执行程序作为Reduce;或使用Java类作为Reduce,而用可执行程序作为Map。

下面先看一个简单例子,用/bin/cat作Mapper,用/usr/bin/wc作Reducer

/input下两个文件为:

hello world bye world

hello hadoop bye hadoop

我在root账户/usr/local/hadoop/hadoop-2.2.0/bin目录(和安装路径有关)下运行此代码,可以统计文件中的行数,单词数和字节数。

root@master:/usr/local/hadoop/hadoop-2.2.0/bin# hadoop jar /usr/local/hadoop/hadoop-2.2.0/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar -input /input -output /output/stream -mapper /bin/cat -reducer /usr/bin/wc

运行结果为:  2  8  46

wc命令用来统计文件中的行数、单词数与字节数,可以看到,这个结果是正确的。

2.1 Hadoop流命令


参数         可选/必选 参数         可选/必选
-input      必选   -cmdenv       可选
-output     必选   -inputreader      可选
-mapper    必选   -verbose       可选
-reducer    必选   -lazyOutput       可选
-file       可选   -numReduce tasks 可选
-inputformat  可选   -mapdebug      可选
-outputformat 可选   -reducedebug     可选
-partitioner    可选   -io           可选
-combiner    可选 

Hadoop流命令中,必选的4个很好理解,分别用于指定输入/输出文件的位置及Map/Reduce函数。在其他的可选命令中,这里我们只解释常用的几个。

-file

这个指令用于将文件加入到Hadoop的Job中。上面的例子中,cat和wc都是Linux系统中的命令,而在Hadoop流的使用中,往往需要使用自己写的文件(作为Map函数或Reduce函数)。一般而言,这些文件是Hadoop集群中的机器上没有的,这时就需要使用Hadoop流中的-file命令将这个可执行文件加入到Hadoop的Job中。

-combiner

这个命令用来加入combiner程序。

-inputformat和-outputformat

这两个命令用来设置输入输出文件的处理方法,这两个命令后面的参数必须是Java类。

2.2  Hadoop流通用的命令选项

Hadoop流的通用命令用来配置Hadoop流的Job。需要注意的是,如果使用这部分配置,就必须将其置于流命令配置之前,否则命令会失败。这里简要列出命令列表,供大家参考。

Hadoop流的Job设置命令
参数   可选/必选  参数   可选/必选
-conf  可选   -files       可选
-D      可选   -libjars    可选
-fs     可选   -archives  可选
-jt      可选

  从上面的内容可以知道,Hadoop流的API是一个扩展性非常强的框架,它与程序相连的部分只有数据,因此可以接受任何适用于UNIX标准输入/输出的脚本语言,比如Bash、PHP、Ruby、Python等。下面举两个非常简单的例子来进一步说明它的特性。(来源:《Hadoop实战》-陆嘉恒,中国人民大学)

3. 1 Bash

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

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

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

输入文件为:
file01:
hello world bye world
file02:
hello hadoop bye hadoop

reduce文件为:
reduce.sh:
grep hadoop

把reduce.sh放到/hadoop/bin下

输入命令为:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69597.html