龙空技术网

都是10G的大数据计算,Python与PHP谁算的速度更快?正面PK硬刚

石哥话科技 3939

前言:

此时兄弟们对“计算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%

因为两个都是脚本语言,学习难度和开发难度都类似。但在进行大数据计算的时候,从结论上看还是各有优势的。

标签: #计算php运行时间 #php统计下载量