前言:
此时兄弟们对“计算php运行时间”大体比较讲究,你们都需要学习一些“计算php运行时间”的相关资讯。那么小编在网上收集了一些对于“计算php运行时间””的相关文章,希望你们能喜欢,我们快快来学习一下吧!咱们的CentOS Linux 8采用的是最小化安装的方式,在这种方式下,系统默认是没有安装Python的。另外,由于咱们只是在系统上部署了Hadoop、Zookeeper等软件,另外也部署了PHP,并没有在系统上部署Python,所以咱们需要给它装一个。
安装Python
先看看都有那些Python的rpm包,运行以下命令:
dnf search python
执行安装Python,系统会提示没找到,也会提示系统中存在python2和python36:
dnf -y install python
我们安装一下python36,执行以下命令:
dnf -y install python36
运行一下python,什么?系统居然还是没有python命令。这两天刚看到一个CentOS Linux 8的命令alternatives,这个是用来控制一个系统里面多个软件版本的情况用的。我们设置python3作为我们的默认python命令,指定下列命令:
alternatives --config python
这样就安装Python3并设定它作为我们默认使用的Python程序成功。
写一个测试的Python程序运行一下试试,具体如下:
vi hello.py
将以下内容粘贴进去:
我们的第一个Python程序执行成功了。
下面咱们编写Python的MapReduce程序,网上找了一个示例,修改了一下,具体内容如下。
准备Python数据分析程序
因为咱们的服务器已经开始运行了,所以没有办法在一台VMWare虚拟服务器上安装好Python然后复制几份过去了。这样咱们就在另外7台服务器上,分别执行上述的安装命令。最后保证每台服务器上的Python都能顺利的执行那个测试程序即可。
根据咱们的集群规划,主Rsync位于Hadoop222服务器,所以以下的程序编写部分我们在Hadoop222(192.168.1.222)上面操作。
编写Mapper程序
用Hadoop用户执行以下命令:
su hadoop
mkdir -p /wwwroot/hadoop/python
cd /wwwroot/hadoop/python
我们先准备一个简单的数据文件:
vi data.txt
把下列内容粘贴进去:
Hello world , Hello python !
Python is a programming language that lets you work more quickly and integrate your systems more effectively.
保存退出后,开始编写mapper.py程序:
vi mapper.py
把下列内容粘贴进去:
#!/usr/bin/python
#导入sys和re库
import sys
import re
#初始化全局字典dict
word_count = {}
#一行一行的接收输入的文字并处理
for line in sys.stdin:
#将输入的字符串去掉两头的空格,转换成小写字符
#并用"非字母数字及下划线"分隔成列表
word_list = re.split('\W', line.strip().lower())
#遍历列表的每个单词
for word in word_list:
#不统计空字符
if word.strip()=='' :
continue
#将获取到的单词标记1次
if word not in word_count.keys():
word_count[word] = 1
else:
#将获取到的单词标记增加1次
word_count[word] += 1
#将获取到的字典排序(按照key排序,正序)
d = sorted(word_count.items(), key=lambda item:item[0], reverse=False)
#遍历输出
for k,v in d:
print(str(k) + '\t' + str(v))
#mapper.py内容结束
给mapper.py赋予可执行权限:
chmod +x /wwwroot/hadoop/python/mapper.py
注意:代码格式不能错,特别是段落前的空格,因为空格也是Python必备的格式。
以上代码会将输入的字符串解析,并输出如下形式内容(单词正序排序):
hello 1
world 5
zoo 2
解释:"world 5"的意思是world在文章中出现了5次
我们输入以下命令测试程序执行的效果:
cat data.txt | /wwwroot/hadoop/python/mapper.py
输出的内容与预期的结果一致。
编写Reducer程序
用Hadoop用户执行以下命令:
su hadoop
cd /wwwroot/hadoop/python
vi reducer.py
把下列内容粘贴进去:
#!/usr/bin/python
#导入sys和re库
import sys
#初始化全局字典dict
word_count = {}
#一行一行的接收输入的文字并处理
for line in sys.stdin:
#将输入的字符串用制表符(TAB)分隔成列表
ss = line.strip().split('\t')
#格式不对的不要(必须满足类似"hello 1"格式)
if len(ss) < 2:
continue
k = ss[0].strip()
v = int(ss[1].strip())
#将获取到的单词标记v次
if k not in word_count.keys():
word_count[k] = v
else:
#将获取到的单词标记增加v次
word_count[k] += v
#将获取到的字典排序(按照value排序,倒序)
d = sorted(word_count.items(), key=lambda item:item[1], reverse=True)
#遍历输出
for k,v in d:
print(str(k) + '\t' + str(v))
#reducer.py内容结束
给Reducer赋予可执行权限。
chmod +x /wwwroot/hadoop/python/reducer.py
注意:代码格式不能错,特别是段落前的空格,因为空格也是Python必备的格式。
这段代码的大意是汇总各Mapper的统计结果,最终得出每个单词出现了多少次数,按照出现次数倒序排序后以:
world 5
zoo 2
hello 1
这样的形式输出,接受的输入方式"hello 1",也就是mapper.php输出的方式。
我们输入以下命令测试程序执行的效果:
cat data.txt | /wwwroot/hadoop/python/mapper.py| /wwwroot/hadoop/python/reducer.py
输出符合预期,这样咱们就能放在Hadoop上运行了。
执行10G数据计算
1、所有的服务器上都安装好Python;
2、保证mapper.py和reducer.py同步到各服务器上了;
3、为了对比PHP的计算效率,数据文件咱们还是使用PHP用的那个10G的文件。
我们在每台服务器上都执行以下上边的python程序,都能出结果,说明程序同步完毕,可以进行下一步了。
为了防止计算的结果会覆盖掉上次的,所以Hadoop不允许把计算的结果存在与上次相同的目录里面。咱们先把output删掉。当然,使用另外的目录也可以,这里就是演示一下怎么在HDFS里面删除目录。
执行命令:
hdfs dfs -rm -r /output
这样,咱们就可以正式开始Python计算10G文本文件的程序了,参考一下PHP的,Python执行代码如下:
hadoop jar /home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.2.1.jar -mapper /wwwroot/hadoop/python/mapper.py -reducer /wwwroot/hadoop/python/reducer.py -input /input/* -output /output
我们可以看看系统资源占用情况,CPU不用说了一直持续100%的状态,内存占用一直在57.4左右徘徊,硬盘依然是轮流100%的占用。
程序执行完毕以后,下载执行的结果文件查看,结果符合预期。
最后再看看执行时间上与PHP的对比,下图上面是Python的数据,下图是PHP的数据。
总结
从最终的结果上看,可以得出结论如下:
1、程序的执行效率PHP更胜一筹,比Python少用了将近50%;
2、内存占用上Python比PHP少使用了将近6G的内存,资源占用少了10%
因为两个都是脚本语言,学习难度和开发难度都类似。但在进行大数据计算的时候,从结论上看还是各有优势的。