商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > php hdfs,PHP对Hadoop的操作

php hdfs,PHP对Hadoop的操作

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

Hadoop流

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函数

先看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函数

再来看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不强制要求,但为了让最终结果看起来更规范,加上了这一步。

用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

这里有几个关键点需要留意:

  • input和output目录都是HDFS上的路径,不是本地路径。
  • mapper和reducer指向的是本地机器的绝对路径,千万别用相对路径,否则Hadoop会报找不到程序。
  • mapper.php和reducer.php必须复制到所有DataNode服务器的相同路径下,并且所有服务器都必须安装PHP,且安装路径保持一致。

查看结果

任务完成后,用下面命令查看输出:

bin/hadoop dfs -cat /tmp/out/part-00000

你会看到类似这样的结果:

hello    2
world    1
本文转载于:https://blog.csdn.net/weixin_31021619/article/details/115230205 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注