因近期业务需求,需要调用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(ST
ERR
, "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