让python在hadoop上跑起来


Posted in Python onJanuary 27, 2016

本文实例讲解的是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频数。

注意:关于数据的输入输出是通过sys.stdin(系统标准输入)和sys.stdout(系统标准输出)来控制数据的读入与输出。所有的脚本执行之前都需要修改权限,否则没有执行权限,例如下面的脚本创建之前使用“chmod +x mapper.py”

1.mapper.py

#!/usr/bin/env python
import sys

for line in sys.stdin: # 遍历读入数据的每一行
  
  line = line.strip() # 将行尾行首的空格去除
  words = line.split() #按空格将句子分割成单个单词
  for word in words:
    print '%s\t%s' %(word, 1)

2.reducer.py

#!/usr/bin/env python

from operator import itemgetter
import sys

current_word = None # 为当前单词
current_count = 0 # 当前单词频数
word = None

for line in sys.stdin:
  words = line.strip() # 去除字符串首尾的空白字符
  word, count = words.split('\t') # 按照制表符分隔单词和数量
  
  try:
    count = int(count) # 将字符串类型的‘1'转换为整型1
  except ValueError:
    continue

  if current_word == word: # 如果当前的单词等于读入的单词
    current_count += count # 单词频数加1
  else:
    if current_word: # 如果当前的单词不为空则打印其单词和频数
      print '%s\t%s' %(current_word, current_count) 
    current_count = count # 否则将读入的单词赋值给当前单词,且更新频数
    current_word = word

if current_word == word:
  print '%s\t%s' %(current_word, current_count)

在shell中运行以下脚本,查看输出结果:

echo "foo foo quux labs foo bar zoo zoo hying" | /home/wuying/mapper.py | sort -k 1,1 | /home/wuying/reducer.py

# echo是将后面“foo ****”字符串输出,并利用管道符“|”将输出数据作为mapper.py这个脚本的输入数据,并将mapper.py的数据输入到reducer.py中,其中参数sort -k 1,1是将reducer的输出内容按照第一列的第一个字母的ASCII码值进行升序排序

其实,我觉得后面这个reducer.py处理单词频数有点麻烦,将单词存储在字典里面,单词作为‘key',每一个单词出现的频数作为'value',进而进行频数统计感觉会更加高效一点。因此,改进脚本如下:

mapper_1.py

让python在hadoop上跑起来

但是,貌似写着写着用了两个循环,反而效率低了。关键是不太明白这里的current_word和current_count的作用,如果从字面上老看是当前存在的单词,那么怎么和遍历读取的word和count相区别?

下面看一些脚本的输出结果:

让python在hadoop上跑起来

我们可以看到,上面同样的输入数据,同样的shell换了不同的reducer,结果后者并没有对数据进行排序,实在是费解~

让Python代码在hadoop上跑起来!

一、准备输入数据

接下来,先下载三本书:

$ mkdir -p tmp/gutenberg
$ cd tmp/gutenberg
$ wget http://www.gutenberg.org/ebooks/20417.txt.utf-8
$ wget http://www.gutenberg.org/files/5000/5000-8.txt
$ wget http://www.gutenberg.org/ebooks/4300.txt.utf-8

 然后把这三本书上传到hdfs文件系统上:

$ hdfs dfs -mkdir /user/${whoami}/input # 在hdfs上的该用户目录下创建一个输入文件的文件夹
 $ hdfs dfs -put /home/wuying/tmp/gutenberg/*.txt /user/${whoami}/input # 上传文档到hdfs上的输入文件夹中

寻找你的streaming的jar文件存放地址,注意2.6的版本放到share目录下了,可以进入hadoop安装目录寻找该文件:

$ cd $HADOOP_HOME
$ find ./ -name "*streaming*"

然后就会找到我们的share文件夹中的hadoop-straming*.jar文件:

让python在hadoop上跑起来

寻找速度可能有点慢,因此你最好是根据自己的版本号到对应的目录下去寻找这个streaming文件,由于这个文件的路径比较长,因此我们可以将它写入到环境变量:

$ vi ~/.bashrc # 打开环境变量配置文件
# 在里面写入streaming路径
export STREAM=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar

由于通过streaming接口运行的脚本太长了,因此直接建立一个shell名称为run.sh来运行:

hadoop jar $STREAM \
-files ./mapper.py,./reducer.py \
-mapper ./mapper.py \
-reducer ./reducer.py \
-input /user/$(whoami)/input/*.txt \
-output /user/$(whoami)/output

然后"source run.sh"来执行mapreduce。结果就响当当的出来啦。这里特别要提醒一下:

1、一定要把本地的输入文件转移到hdfs系统上面,否则无法识别你的input内容;

2、一定要有权限,一定要在你的hdfs系统下面建立你的个人文件夹否则就会被denied,是的,就是这两个错误搞得我在服务器上面痛不欲生,四处问人的感觉真心不如自己清醒对待来的好;

3、如果你是第一次在服务器上面玩hadoop,建议在这之前请在自己的虚拟机或者linux系统上面配置好伪分布式然后入门hadoop来的比较不那么头疼,之前我并不知道我在服务器上面运维没有给我运行的权限,后来在自己的虚拟机里面运行一下example实例以及wordcount才找到自己的错误。

好啦,然后不出意外,就会complete啦,你就可以通过如下方式查看计数结果:

让python在hadoop上跑起来

以上就是本文的全部内容,希望对大家学习python软件编程有所帮助。

Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
django 删除数据库表后重新同步的方法
May 27 Python
python3判断url链接是否为404的方法
Aug 10 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
对python:threading.Thread类的使用方法详解
Jan 31 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
CentOS安装pillow报错的解决方法
Jan 27 #Python
python实现文本去重且不打乱原本顺序
Jan 26 #Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 #Python
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 #Python
python中的编码知识整理汇总
Jan 26 #Python
在MAC上搭建python数据分析开发环境
Jan 26 #Python
python黑魔法之编码转换
Jan 25 #Python
You might like
短波问题解答
2021/02/28 无线电
网络资源
2006/10/09 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
原生js开发的日历插件
2017/02/04 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python subprocess库的使用详解
2018/10/26 Python
python使用udp实现聊天器功能
2018/12/10 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
python中turtle库的简单使用教程
2020/11/11 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
买房子个人收入证明
2014/01/16 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
教师节领导致辞
2015/07/29 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书