您的位置:首页 > 编程语言 > PHP开发

Hadoop Straming 调用PHP

2016-06-23 16:52 471 查看
因近期业务需求,需要调用MR作业校验一部分数据,因Java对于AES 256位秘钥(32长度的字符串)加解密受JDK环境限制,需要下载软件出口限制版本jar包,因涉及更新hadoop集群JDK环境 ,故放弃。
遂尝试使用PHP来解决该问题,通过hadoop Straming 调用PHP,具体需要注意的细节如下:
1.因为PHP版本众多,以及所依赖库参差不齐,在运行hadoop Straming调用PHP时,最好是自己带一份PHP环境上去,具体如何操作呢,下面娓娓道来:
①首先,在你保证当前PHP程序能正常运行的情况下(非hadoop MR环境),即本地测试通过,可以进入当前php环境下,将其打个包,例如:
一般php环境路径是:/usr/local/php,进入该路径之后,将所有文件直接打个tar.gz即可,tar -czf /tmp/php.tar.gz *
②将php.tar.gz copy到自己php程序所在路径,并解压,调用的时候使用解压后的php来执行,php/bin/php
xx.php
③将其scp至MR环境的一台客户端机器上,重复第二步操作,如不能正常运行,需查看php.ini中引用了哪些不必要的库,可以尝试去掉,如果必须依赖,则给它添加进去(此时可能会出现所引用库的路径为绝对路径,改为相对路径即可)
④确定该php环境可用,即能运行当前php程序的时候,可以将该php环境重新打包为php.tar.gz,并推到hadoop上某个路径,hadoop fs -put php.tar.gz /home/xitong/lib
⑤在你的hadoop Straming中添加参数
-cacheArchive  'hdfs:///home/xitong/lib/php.tar.gz#php' \    //此处需注意,hdfs://此处可指定具体的hadoop集群(NameNode),#php,此处会将home/xitong/lib/php.tar.gz解压,并创建链接为php
⑥当你需要使用该环境时,只需要php/bin/php -c php/etc/php.ini
xx.php调用即可,此处一定要注意自己打的tar.gz包解压后的路径是否对,如果还有一层文件夹,需添加进路径
⑦上传自己的PHP程序,利用该参数即可,-file "./xx.php" \

2.解决了PHP环境的问题,接下来需要了解一下在PHP程序中,如何获取MR输入的数据(默认按行读取),以及如何输出,自定义计数器等问题
①获取MR输入的数据
$data_source = fopen("php://stdin", "r");//即可获取当前按行读入的数据

while ($data = fgets($data_source))
{
        //处理逻辑
}

②如何输出

fwrite(STDOUT, "I`m output str \n");

③自定义计数器

fwrite(STERR, "reporter:counter:MapCounter,自定义计数器名称,1\n"); //注意:STERR才能将计数器打印在job页面上

3.OK,剩下的就是如何启动hadoop Straming了,后面的
" \" 不能少

hadoop streaming
-input  输入路径 \
-output 输出路径 \
-mapper "php/bin/php -c php/etc/php.ini xx.php" \
-cacheArchive  'hdfs:///home/xitong/lib/php.tar.gz#php' \
-reducer "NONE" \
-file "./xx.php" \
-jobconf mapred.map.tasks=100 \
-jobconf mapred.map.tasks.speculative.execution=false \
-jobconf mapred.job.name=lalala
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: