发布于2026-07-20 阅读(0)
扫一扫,手机访问
Hadoop本身是用Ja va写的,但别担心,它贴心地提供了一套叫Hadoop Streaming的API,让你能用几乎任何语言编写Map和Reduce函数——只要这门语言能处理标准输入输出流。核心原理很简单:把UNIX标准流当作程序与Hadoop之间的通信管道。换句话说,任何能从标准输入读数据、往标准输出写数据的程序,都可以用来写MapReduce的map和reduce函数。举个例子:
bin/hadoop jar contrib/streaming/hadoop-streaming-0.20.203.0.jar -mapper /usr/local/hadoop/mapper.php -reducer /usr/local/hadoop/reducer.php -input test/* -output out4
注意,Streaming需要的jar包是hadoop-streaming-0.20.203.0.jar,Hadoop根目录下默认没有这个包,它藏在contrib目录里。以Hadoop 0.20.2为例,路径类似:contrib/streaming/hadoop-streaming-0.20.203.0.jar。参数的含义也很直白:-input指定HDFS上的输入路径,-output指定输出路径,-mapper和-reducer分别指定map和reduce的程序。
先看mapper.php的实现。完整的代码如下:
#!/usr/local/php/bin/php
$count) {
// tab-delimited
echo $word, chr(9), $count, PHP_EOL;
}
?>
这段代码的作用很直观:把每行输入的文本拆成单词,统计每个单词在当前行出现的次数,然后以“单词\t次数”的格式输出。和平时写的PHP逻辑没太大区别,对吧?可能让你觉得有点陌生的地方只有两个:
PHP作为可执行程序——第一行的#!/usr/local/php/bin/php告诉Linux内核,用这个路径下的PHP解释器来执行后续代码。写过shell脚本的人肯定不陌生,shell脚本开头也是#!/bin/bash或#!/usr/bin/python。有了这一行,保存文件后就能像执行cat、grep一样直接运行./mapper.php。
使用stdin接收输入——大家最熟悉的PHP参数传入方式莫过于$_GET、$_POST(Web场景)或$_SERVER['argv'](命令行参数)。但这里用的是标准输入stdin。效果是:在终端输入./mapper.php,程序会等待键盘输入,直到你按下Ctrl+D结束输入,然后才开始处理并输出结果。至于stdout呢?其实print本身就已经是标准输出了,跟写Web程序或CLI脚本完全一样。
再来看reducer.php:
0) $word2count[$word] += $count;
}
// sort the words lexicographically
// this step is NOT required, we just do it so that our final output
// will look more like the official Hadoop word count examples
ksort($word2count);
// write the results to STDOUT (standard output)
foreach($word2count as $word => $count) {
echo $word, chr(9), $count, PHP_EOL;
}
?>
它的工作就是统计每个单词总共出现了多少次,输出格式依然是“单词\t次数”。这里特意做了词法排序(ksort),虽然Hadoop不强制要求,但为了让最终结果看起来更规范,加上了这一步。
把测试数据放进HDFS:
bin/hadoop dfs -put test.log test
然后以Streaming方式提交任务:
bin/hadoop jar contrib/streaming/hadoop-streaming-0.20.203.0.jar -mapper /usr/local/hadoop/mapper.php -reducer /usr/local/hadoop/reducer.php -input test/* -output out
这里有几个关键点需要留意:
任务完成后,用下面命令查看输出:
bin/hadoop dfs -cat /tmp/out/part-00000
你会看到类似这样的结果:
hello 2
world 1
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8