咱们的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%
由于两个都是脚本措辞,学习难度和开拓难度都类似。但在进行大数据打算的时候,从结论上看还是各有上风的。