18.3.2 Hadoop Streaming的使用举例

Hadoop Streaming插件是Hadoop安装包当中的一个JAR文件,具体位置在……\Hadoop-1.0.1\contrib\streaming目录下,所以Hadoop Streaming插件是直接使用的,只需要在执行Hadoop程序时输入命令Hadoop Streaming就可以了,无须安装,在编写MapReduce程序时,只要按照整个框架要求并根据自己的需要编写出符合对应语言格式的程序,然后用下面的命令格式将程序提交给Hadoop就可以了:


$HADOOP_HOME/bin/hadoop jar$HADOOP_HOME/hadoop-streaming.jar\

-input myInputDirs\

-output myOutputDir\

-mapper/bin/cat\

-reducer/bin/wc


需要注意的是,程序执行所需要的支持文件也要在提交程序的同时提交到Hadoop集群,这在前面已有说明,不再赘述。下面以一个用PHP语言编写的WordCount使用Hadoop Streaming提交的程序为例,来说明此插件使用方法(Linux系统下需要安装PHP环境,命令为sudo apt-get install php5-client)。

程序代码举例如下所示。

(1)Mapper. php


!/usr/bin/php

<?php

$word2count=array();

//标准输入STDIN(standard input)

while(($line=fgets(STDIN))!==false){

//移除小写与空格

$line=strtolower(trim($line));

//切词

$words=preg_split('/\W/',$line,0,PREG_SPLIT_NO_EMPTY);

//将字+1

foreach($words as$word){

$word2count[$word]+=1;

}

}

//结果写到STDOUT(standard output)

foreach($word2count as$word=>$count){

echo$word, chr(9),$count, PHP_EOL;

}

?>


(2)Reduce.php


!/usr/bin/php

<?php

$word2count=array();

//输入为STDIN

while(($line=fgets(STDIN))!==false){

//移除多余的空白

$line=trim($line);

//每一行的格式为(字"tab"数字),记录到($word,$count)

list($word,$count)=explode(chr(9),$line);

//转换格式string->int

$count=intval($count);

//求总的频数

if($count>0)$word2count[$word]+=$count;

}

//此行非必要内容,但可让output排列更完整

ksort($word2count);

//将结果写到STDOUT(standard output)

foreach($word2count as$word=>$count){

echo$word, chr(9),$count, PHP_EOL;

}

?>


执行情况如下:


$bin/Hadoop jar contrib/streaming/Hadoop-0.20.2-streaming.jar\

-mapper/opt/Hadoop/mapper.php-reducer/opt/Hadoop/reducer.php-input lab4_input

-output stream_out2


下面来查看一下结果:


$bin/Hadoop dfs-cat stream_out2/part-00000