尝试着用3台虚拟机搭建了伪分布式系统,完整的搭建步骤等熟悉了整个分布式框架之后再写,今天写一下用python写wordcount程序(MapReduce任务)的具体步骤。

MapReduce任务以来HDFS存储和Yarn资源调度,所以执行MapReduce之前要先启动HDFS和Yarn。我们都知道MapReduce分Map阶段和Reduce阶段,这就需要我们 自己写Map阶段的处理方法和Reduce阶段的处理方法。

MapReduce也支持除Java之外的其他语言,但要依赖流处理包(hadoop-streaming-2.7.4.jar),处理包不需要自己下载,hadoop本身带的就有,hadoop2.7的在hadoop-2.7.4/share/hadoop/tools/lib目录下,知道它所在的目录是因为只执行MapReduce命令的时候要指定hadoop-streaming-2.7.4.jar的位置。

接下来就是用python写Map的处理逻辑和Reduce的处理逻辑。wordcount是词频统计,要处理的原文本文件要上传到HDFS上,流程是原文本以流式方式传到Map函数,Map函数处理之后把结果传到Reduce函数,整个处理完后结果会保存在HDFS上,流式处理可以理解成文本一行一行的在原文件、Map函数、Reduce函数、结果文件之间流动处理。

原文本:

hello world
hello hadoop hadoop
nihao world
hello mapreduce

  

Map方法代码:

#!/usr/bin/python
import sys
for line in sys.stdin:
line = line.strip()
words = line.split(' ')
for word in words:
print('%s\t%s'%(word,1))

Reduce方法代码:

#!/usr/bin/python
import sys current_count = 0
current_word = None for line in sys.stdin:
line = line.strip()
word, count = line.split('\t', 1)
count = int(count)
if current_word == word:
current_count += count
else:
if current_word:
print "%s\t%s" % (current_word, current_count) current_count = count
current_word = word

代码的逻辑都很简单,从标准输入按行读取处理数据,每行处理完print打印。

先在shell上测试一下:

#cat word.txt | ./mapper.py | sort

hadoop	1
hadoop 1
hello 1
hello 1
hello 1
mapreduce 1
nihao 1
world 1
world 1

sort是行之间按单词首字母排序,在MapReduce上sort过程hadoop会处理。

如果没有sort,结果是这样的:

#cat word.txt | ./mapper.py

hello	1
world 1
hello 1
hadoop 1
hadoop 1
nihao 1
world 1
hello 1
mapreduce 1

#cat word.txt | ./mapper.py | sort |./reducer.py

hadoop	2
hello 3
mapreduce 1
nihao 1

测试完没问题后就可以用MapReduce来执行了。

输入命令:

hadoop jar hadoop-streaming-2.7.4.jar \

-input /wordcount/word.txt \

-output /wordcount/out \

-mapper /home/hadoop/apps/hadoop-2.7.4/file/wordcount_python/mapper.py \

-reducer /home/hadoop/apps/hadoop-2.7.4/file/wordcount_python/reducer.py

命令解释:

第一行是指明用到的streaming包的位置,第二行指明原文件在HDFS上的路径,第三行是输出结果在HDFS上的路径,输出路径原来不能存在,已存在的话会报错,第四行和第五行指明Map方法和Reduce方法程序路径。

mapper.py和reduce.py需要加上执行权限,chmod +x mapper.py,它们两个py文件不用放在HDFS上,放在本地即可。

执行后就会开启MapReduce任务,配置没问题的话就不会报错,执行完成后会在MapReduce上生成/wordcount/out目录里面有两个文件:

第二个是结果文件,第一个文件可以看到所占空间为0,cat一下什么也没有,只是一个处理成功的标识。

以上就是python写wordcount的具体步骤,如有错误 欢迎指正!

hadoop学习笔记——用python写wordcount程序的更多相关文章

  1. Hadoop学习笔记(1):WordCount程序的实现与总结

    开篇语: 这几天开始学习Hadoop,花费了整整一天终于把伪分布式给搭好了,激动之情无法言表······ 搭好环境之后,按着书本的代码,实现了这个被誉为Hadoop中的HelloWorld的程序--W ...

  2. 20180821 Python学习笔记:如何获取当前程序路径

    20180821 Python学习笔记:如何获取当前程序路径 启动的脚本的路径为:D:\WORK\gitbase\ShenzhenHouseInfoCrawler\main.py 当前脚本的路径为:D ...

  3. Hadoop学习笔记(6) ——重新认识Hadoop

    Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功 ...

  4. Hadoop学习笔记(2)

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  5. Hadoop学习笔记(5) ——编写HelloWorld(2)

    Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...

  6. Hadoop学习笔记(2) ——解读Hello World

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  7. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  8. Hadoop学习笔记(1)(转)

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  9. Hadoop学习笔记(4) ——搭建开发环境及编写Hello World

    Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclip ...

随机推荐

  1. HTML 折行br

    HTML 折行 如果您希望在不产生一个新段落的情况下进行换行(新行),请使用 <br /> 标签: <p>This is<br />a para<br /&g ...

  2. PHP | 别家网站都有的登录功能,你的网站也可以有!

    如果说一个网站是一个独立的王国,那登录功能就相当于这个[王国]的大门.进出往来的人必须要通过这道[门]才能进出这个[王国],这样才能有效的达到对人流量和用户的有效监管,也可以进一步了解每个用户的喜好, ...

  3. Java程序中解决数据库超时与死锁

    Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T   Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况 ...

  4. python+selenium之框架设计

    一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本, ...

  5. 线程 Z

    原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...

  6. DB TABLE实践

    我的数据库设计实践(一)   兜兜转转,突然发现我现在已经是一个老司机了,一直写代码都很忙,没有把很多点点滴滴的记录下来,今天开始就开始一个系列,分析当年我接触或者我设计过的表结构,有好有坏,有欢喜也 ...

  7. mac git 命令自动补全

    步骤如下: 1.下载Git-completion.bash 或者直接使用SourceTree去clone到本地. 下载地址:https://github.com/markgandolfo/git-ba ...

  8. JDBC(3)ResultSet

    ResultSet 在执行查询(select)时候使用 这是一个结果对象,该对象包含结果的方法但指针定位到一行时 调用Statement 对象的 executeQuery(sql)可以得到结果集 可以 ...

  9. 删除oracle实例

    1.在开始菜单中,点击ORAHOME目录下的"Configuration and Migration Tools"下的"Database Configuration As ...

  10. 下载安装Redis+使用

    Window 下安装 第一步:安装 下载地址:https://github.com/MSOpenTech/redis/releases 第二步:解压(盘符) 第三步:打开一个 cmd 窗口 使用 cd ...