咱们的CentOS Linux 8采取的是最小化安装的办法,在这种办法下,系统默认是没有安装Python的。
其余,由于咱们只是在系统上支配了Hadoop、Zookeeper等软件,其余也支配了PHP,并没有在系统上支配Python,以是咱们须要给它装一个。

安装Python

先看看都有那些Python的rpm包,运行以下命令:

计算php都是10G的年夜数据盘算Python与PHP谁算的速度更快正面PK硬刚 Ruby

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%

由于两个都是脚本措辞,学习难度和开拓难度都类似。
但在进行大数据打算的时候,从结论上看还是各有上风的。