| 关键词: Python Hadoop 程序 命令 Mapper word wwwroot 以下 Reducer 内容 |
咱们的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% 因为两个都是脚本语言,学习难度和开发难度都类似。但在进行大数据计算的时候,从结论上看还是各有优势的。 |
| 本文出处: https://www.toutiao.com/a6782235375231304204/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|