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
遂尝试使用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
相关文章推荐
- windows 服务器提示curl_init() not function
- php日期转时间戳,指定日期转换成时间戳
- PHP字符串、数组函数
- 用php实现xml与json之间的相互转换
- php设计模式:简单工程模式
- PHP递归删除文件和文件夹
- PHP获取客户端IP地址
- 使用php扩展mcrypt实现AES加密
- PHP截取指定长度的字符串,超出部分用 ..替换
- PHP的UTF-8中文转拼音处理类
- PHP转换字符串编码
- PHP判断是否为手持设备的函数
- PHP连接MYSQL数据库
- PHP魔术方法的使用
- Laravel5.1框架下有关路由的一种解决办法
- Laravel throttle中间件失效问题
- php的核心10个问题
- php中判断某个IP地址是否存在范围内
- thinkphp 后台权限列表
- PHP 遍历对象