一个mapreduce程序大致分成三个部分,第一部分是mapper文件,第二个就是reducer文件,第三部分就是使用hadoop command 执行程序。

在这个过程中,困惑我最久的一个问题就是在hadoop command中hadoop-streaming 也就是streaming jar包的路径。

路径大概是这样的:

  1. cd ~
  2. cd /usr/local/hadoop-2.7.3/share/hadoop/tools/lib
  3. #在这个文件下,我们可以找到你 hadoop-streaming-2.7.3.jar

这个路径是参考的这里

这个最基本的mapreduce程序我主要参考了三个博客:

第一个-主要是参考这个博客的mapper和reducer的写法-在这个博客中它在练习中给出了只写mapper执行文件的一个例子

第二个博客-主要参考的这个博客的runsh的写法

第三个博客-主要是参考这个博客的将本地文件上传到hdfs文件系统中

首先对于mapper文件

mapper.py

  1. #!/usr/bin/env python
  2. import sys
  3. # input comes from STDIN (standard input)
  4. for line in sys.stdin:
  5. # remove leading and trailing whitespace
  6. line = line.strip()
  7. # split the line into words
  8. words = line.split()
  9. # increase counters
  10. for word in words:
  11. # write the results to STDOUT (standard output);
  12. # what we output here will be the input for the
  13. # Reduce step, i.e. the input for reducer.py
  14. #
  15. # tab-delimited; the trivial word count is 1
  16. print '%s\t%s' % (word, 1)
  17. #上面这个文件我们得到的结果大概是每个单词对应一个数字1

对于reducer文件:reducer.py

  1. #!/usr/bin/env python
  2. from operator import itemgetter
  3. import sys
  4. current_word = None
  5. current_count = 0
  6. word = None
  7. # input comes from STDIN
  8. for line in sys.stdin:
  9. # remove leading and trailing whitespace
  10. line = line.strip()
  11. # parse the input we got from mapper.py
  12. word, count = line.split('\t', 1)
  13. # convert count (currently a string) to int
  14. try:
  15. count = int(count)
  16. except ValueError:
  17. # count was not a number, so silently
  18. # ignore/discard this line
  19. continue
  20. # this IF-switch only works because Hadoop sorts map output
  21. # by key (here: word) before it is passed to the reducer
  22. if current_word == word:
  23. current_count += count
  24. else:
  25. if current_word:
  26. # write result to STDOUT
  27. print '%s\t%s' % (current_word, current_count)
  28. current_count = count
  29. current_word = word
  30. # do not forget to output the last word if needed!
  31. if current_word == word:
  32. print '%s\t%s' % (current_word, current_count)

对上面两个代码先进行一个本地的检测

  1. vim test.txt
  2. foo foo quux labs foo bar quux
  1. cat test.txt|python mapper.py
  2. cat test.txt|python mapper.py|sort|python reducer.py
  3. ##注意在这里我们执行万mapper之后我们进行了一个排序,所以对于相同单词是处于相邻位置的,这样在执行reducer文件的时候代码可以写的比较简单一点

然后在hadoop集群中跑这个代码

首先讲这个test.txt 上传到相应的hdfs文件系统中,使用的命令模式如下:

  1. hadoop fs -put ./test.txt /dw_ext/weibo_bigdata_ugrowth/mds/

然后写一个run.sh


  1. HADOOP_CMD="/usr/local/hadoop-2.7.3/bin/hadoop" # hadoop的bin的路径
  2. STREAM_JAR_PATH="/usr/local/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar" ## streaming jar包的路径
  3. INPUT_FILE_PATH="/dw_ext/weibo_bigdata_ugrowth/mds/src.txt" #hadoop集群上的资源输入路径
  4. #需要注意的是intput文件必须是在hadooop集群上的hdfs文件中的,所以必须将本地文件上传到集群上
  5. OUTPUT_PATH="/dw_ext/weibo_bigdata_ugrowth/mds/output"
  6. #需要注意的是这output文件必须是不存在的目录,因为我已经执行过一次了,所以这里我把这个目录通过下面的代码删掉
  7. $HADOOP_CMD fs -rmr $OUTPUT_PATH
  8. $HADOOP_CMD jar $STREAM_JAR_PATH \
  9. -input $INPUT_FILE_PATH \
  10. -output $OUTPUT_PATH \
  11. -mapper "python mapper.py" \
  12. -reducer "python reducer.py" \
  13. -file ./mapper.py \
  14. -file ./reducer.py
  15. # -mapper:用户自己写的mapper程序,可以是可执行文件或者脚本
  16. # -reducer:用户自己写的reducer程序,可以是可执行文件或者脚本
  17. # -file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。

明天看这个

https://www.cnblogs.com/shay-zhangjin/p/7714868.html

https://www.cnblogs.com/kaituorensheng/p/3826114.html

使用python写一个最基本的mapreduce程序的更多相关文章

  1. 任务备忘(已经完成):用python写一个格式化xml字符串的程序

    功能: 1.将xml中多余的空格,换行符去掉,让xml字符串变成一行. 2.将xml中添加缩进,使用print能正确打印添加缩进后的字符串. 思路: 采用正则表达式来判断xml中字符串的类型: 1.文 ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  4. [py]python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...

  5. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  6. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  7. 用python写一个自动化盲注脚本

    前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...

  8. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  9. 使用Python写的第一个网络爬虫程序

    今天尝试使用python写一个网络爬虫代码,主要是想訪问某个站点,从中选取感兴趣的信息,并将信息依照一定的格式保存早Excel中. 此代码中主要使用到了python的以下几个功能,因为对python不 ...

随机推荐

  1. Redis数据类型(字符串)

    Redis存放的字符串为二进制是安全的.字符串长度支持到512M. incr 递增数字INCR key 当存储的字符串是整数时,redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递 ...

  2. vue复习

    vue 复习   options的根属性 el:目的地(srting || DOM元素) template 模板 data 是一个函数 , return一个对象   对象中的key, 可以直接在页面中 ...

  3. 移动端纯CSS3制作圆形进度条所遇到的问题

    近日在开发的页面中,需要制作一个动态的圆形进度条,首先想到的是利用两个矩形,宽等于直径的一半,高等于直径,两个矩形利用浮动贴在一起,设置overflow:hidden属性,作为盒子,内部有一个与其宽高 ...

  4. [SVN]TortoiseSVN工具培训3─使用基本流程和图标说明

    1.SVN的使用基本流程 注意:对于文件编辑方面,上图的编辑副本操作前建议进行Get lock操作,以防出现后续的冲突等异常报错. 2.SVN的基本图标说明

  5. sqlalchemy的cascades

    http://docs.sqlalchemy.org/en/latest/orm/cascades.html class Order(Base): __tablename__ = 'order' it ...

  6. js报变量 is not a function

    是变量名和函数名相同导致的 比如: function a(){} var a = a();

  7. 正则表达式转换python2的print为python3风格

    直接查找 print ([^\n\(]*)替换为 print($1)

  8. MySQL入门很简单: 9 插入 更新与删除数据

    1. 插入数据:INSERT 1)为表的所有字段插入数据 第一种: 不指定具体的字段名 INSERT INTO 表名 VALUES(值1,值2,...,值n): 第二种:INSERT语句中列出所有字段 ...

  9. Centos 5.5 编译安装mysql 5.5.9

    下载mysql wget  http://mysql.mirrors.pair.com/Downloads/MySQL-5.5/mysql-5.5.9.tar.gz 创建mysql用户 [root@x ...

  10. 2017.9.18 HTMl学习总结----input标签的额type

    2.1.3  HTML表单标签与表单设计 (1)表单的组成:文本框(text),密码框(password),多行文本框(Multiline text box).  单选按钮框(Single - rad ...