用PHP写Hadoop的MapReduce程序

一、准备好相关环境
参考《Nginx 1.4.3.6 + PHP 5.4.22(FastCGI)在CentOS 6.4下的编译安装》来搭建Linux下的PHP开发环境。
参考《CentOS Linux下Hadoop2.2.0集群的搭建》来搭建Hadoop集群。

二、在hadoop1上编写mapper程序和recuder程序
mapper程序

su - hadoop
vi mapper.php

代码如下:

<?php
    $in = fopen("php://stdin", "r");
    $results = array();
    while ( $line = fgets($in, 4096) ){
        $words = preg_split('/\W/', $line, 0, PREG_SPLIT_NO_EMPTY);
        foreach ($words as $word)
            $results[] = $word;
    }
    fclose($in);
    foreach ($results as $key => $value){
        print "$value\t1\n";
    }
?>

recuder程序

vi reducer.php

代码如下:

<?php
    $in = fopen("php://stdin", "r");
    $results = array();
    while ( $line = fgets($in, 4096) ){
        list($key, $value) = preg_split("/\t/", trim($line), 2);
        $results[$key] += $value;
    }
    fclose($in);
    ksort($results);
    foreach ($results as $key => $value){
        print "$key\t$value\n";
    }
?>

同步mapper.php和reducer.php到其他节点。注意,所有节点php文件存放的目录必须保持一致。

scp *.php hadoop@hadoop2:/home/hadoop/

三、执行程序,注意必须使用绝对路径。
在/home/hadoop/下建test.txt文件,输入一下文字

asf
asfadfsaf
asd
asf
asf
hadoop fs -copyFromLocal /home/hadoop/test.txt /input
hadoop jar /usr/local/hadoop-2.2.0/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar -mapper '/usr/local/webserver/php/bin/php /home/hadoop/mapper.php' -reducer '/usr/local/webserver/php/bin/php /home/hadoop/reducer.php' -input /input/test.txt -output /out5

如果执行没报错,执行之后可以看到执行结果。

hadoop fs -cat /out6/part-00000

结果如下:

asd     1
asf     3
asfadfsaf       1

除非注明,本博客文章均为原创,转载请以链接形式标明本文地址
本文地址: http://blog.cnwyhx.com/php-hadoop-mapreduce

Leave a Reply