原创,转发请注明出处。

  MapReduce是hadoop这只大象的核心,Hadoop 中,数据处理核心就是 MapReduce 程序设计模型。一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。因此,我们的编程中心主要是 mapper阶段和reducer阶段。

下面来从零开发一个MapReduce程序,并在hadoop集群上运行。
mapper代码 map.py:

 import sys

    for line in sys.stdin:
word_list = line.strip().split(' ')
for word in word_list:
print '\t'.join([word.strip(), str(1)])

reducer代码 reduce.py:

 import sys

    cur_word = None
sum = 0 for line in sys.stdin:
ss = line.strip().split('\t') if len(ss) < 2:
continue word = ss[0].strip()
count = ss[1].strip() if cur_word == None:
cur_word = word if cur_word != word:
print '\t'.join([cur_word, str(sum)])
cur_word = word
sum = 0 sum += int(count) print '\t'.join([cur_word, str(sum)])
sum = 0

资源文件 src.txt(测试用,在集群中跑时,记得上传到hdfs上):

hello
ni hao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni haoao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao
Dad would get out his mandolin and play for the family
Dad loved to play the mandolin for his family he knew we enjoyed singing
I had to mature into a man and have children of my own before I realized how much he had sacrificed
I had to,mature into a man and,have children of my own before.I realized how much he had sacrificed

首先本地调试查看结果是否正确,输入命令以下:

cat src.txt | python map.py | sort -k 1 | python reduce.py

命令行中输出的结果:

 a    2
and 2
and,have 1
ao 1
before 1
before.I 1
children 2
Dad 2
enjoyed 1
family 2
for 2
get 1
had 4
hao 33
haoao 1
haoni 3
have 1
he 3
hello 1
his 2
how 2
I 3
into 2
knew 1
loved 1
man 2
mandolin 2
mature 1
much 2
my 2
ni 34
of 2
out 1
own 2
play 2
realized 2
sacrificed 2
singing 1
the 2
to 2
to,mature 1
we 1
would 1

通过调试发现本地调试,代码是OK的。下面扔到集群上面跑。为了方便,专门写了一个脚本 run.sh,解放劳动力嘛。

   HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop"
STREAM_JAR_PATH="/home/hadoop/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar" INPUT_FILE_PATH="/home/input/src.txt"
OUTPUT_PATH="/home/output" $HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH \
-output $OUTPUT_PATH \
-mapper "python map.py" \
-reducer "python reduce.py" \
-file ./map.py \
-file ./reduce.py

下面解析下脚本:

   HADOOP_CMD: hadoop的bin的路径
STREAM_JAR_PATH:streaming jar包的路径
INPUT_FILE_PATH:hadoop集群上的资源输入路径
OUTPUT_PATH:hadoop集群上的结果输出路径。(注意:这个目录不应该存在的,因此在脚本加了先删除这个目录。**注意****注意****注意**:若是第一次执行,没有这个目录,会报错的。可以先手动新建一个新的output目录。)
$HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH \
-output $OUTPUT_PATH \
-mapper "python map.py" \
-reducer "python reduce.py" \
-file ./map.py \
-file ./reduce.py #这里固定格式,指定输入,输出的路径;指定mapper,reducer的文件;并分发mapper,reducer角色的我们用户写的代码文件,因为集群其他的节点还没有mapper、reducer的可执行文件。

输入以下命令查看经过reduce阶段后输出的记录:

cat src.txt | python map.py | sort -k 1 | python reduce.py | wc -l
命令行中输出:43

在浏览器输入:master:50030 查看任务的详细情况。

Kind    % Complete    Num Tasks    Pending    Running    Complete    Killed     Failed/Killed Task Attempts
map 100.00% 2 0 0 2 0 0 / 0
reduce 100.00% 1 0 0 1 0 0 / 0

Map-Reduce Framework中看到这个。

Counter                      Map    Reduce    Total
Reduce output records 0   0    43

证明整个过程成功。第一个hadoop程序开发结束。

Python开发MapReduce系列(一)WordCount Demo的更多相关文章

  1. Python开发MapReduce系列(二)Python实现MapReduce分桶

    版权声明:本文为博主原创文章,未经博主允许不得转载   首先,先引出两点来展开下面的话题. (1)map阶段的排序是在hash之后,写入磁盘之前进行.排序的两个关键字是partition(分区编号)和 ...

  2. 用python写MapReduce函数——以WordCount为例

    尽管Hadoop框架是用java写的,但是Hadoop程序不限于java,可以用python.C++.ruby等.本例子中直接用python写一个MapReduce实例,而不是用Jython把pyth ...

  3. Python开发—Ajax系列

    概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  4. Python开发实战教程(8)-向网页提交获取数据

    来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知 ...

  5. python - hadoop,mapreduce demo

    Hadoop,mapreduce 介绍 59888745@qq.com 大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽), 把用户的交易 ...

  6. Python实现MapReduce,wordcount实例,MapReduce实现两表的Join

    Python实现MapReduce 下面使用mapreduce模式实现了一个简单的统计日志中单词出现次数的程序: from functools import reduce from multiproc ...

  7. 测试开发系列之Python开发mock接口(一)

    什么是mock接口呢,举个栗子,你在一家电商公司,有查看商品.购物.支付.发 货.收获等等等一大堆功能,你是一个测试人员,测测测,测到支付功能的时候,你就要调用第三方支付接口了,真实支付,直接扣你支付 ...

  8. Qt混合Python开发技术:Python介绍、混合过程和Demo

    前言   Qt中混合Python开发,可调用Python命令与脚本.   Python   Python是一种跨平台的计算机程序设计语言. 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语 ...

  9. 开发快平台(M302I小e开发板系列教程)

    开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...

随机推荐

  1. wordpress 学习笔记

    (1) __()函数 function __( $text, $domain = 'default' ) { return translate( $text, $domain ); } 返回一个字符串 ...

  2. VS编译常见错误枚举01

    fatal error C1189: #error :  This file requires _WIN32_WINNT to be #defined at least to 0x0403. Valu ...

  3. easyui之datagrid之formatter(后台传递常量自动转换值)

    1,datagrid之formatter formatter格式化函数有三个参数: value:字段值(一般为后台传递给前台的值): row:当前行数据: index:当前行索引. return值是显 ...

  4. svn之merge

    [svn之merge] 1. merge SOURCE[@REV] [TARGET_WCPATH]  (the 'sync' merge) This form is called a 'sync' ( ...

  5. MyGeneration代码生成工具

    使用MyGeneration 生成代码:转自http://www.cnblogs.com/jack-liang/archive/2011/08/18/2144066.html 我们经常用数据访问层和业 ...

  6. intval()函数

    获取变量的整数值 1.转换前转化后 原因:

  7. 1.介绍templates

    我们现在要计算int和double类型数据的平方,我们就需要2个函数: #include <iostream> using namespace std; int square(int x) ...

  8. 关于"人工智能Python""系统环境变量设置步骤

    最近无论是JAVA的环境变量配置,还是Python环境变量配置都有学生问我,我在这里写一下回答,当然我以配置Python的环境变脸来举例.首先需要确定本机电脑上安装上了Python 首先解释一下为什么 ...

  9. atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.

    今天安装markdown-pdf之后运行的时候报错: AssertionError: html-pdf: Failed to load PhantomJS module. You have to se ...

  10. 构建使用 Azure 网站的云

    Apurva JoshiSunitha Muthukrishna 在设计云解决方案时,设计始终要为故障做好准备.这一点很重要,应牢记. 然而,许多应用程序并非按照这种方式构建. 出现这种情况的主要原因 ...