Hadoop的MapReduce实例讲解—Python写的wordcount Demo

MapReduce是hadoop这只大象的核心,Hadoop 中,数据处理核心就是 MapReduce 程序设计模型。一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。因此,我们的编程中心主要是 mapper阶段和reducer阶段。
本文将通过 MapReduce中最为经典并简单的WordCount实例来展示MapReduce工作原理。官网和各类博客均有相关教程,内容大同小异,但在实际操作过程中还是会遇到一些未被提到的坑,最后发现能够顺利跑完这个MapReduce的简单实例还是真的不容易的,特地将操作过程复现一遍,供大家参考。
1.前提(环境)
搭建好Hadoop的分布式集群,并开启Hadoop相关进程,已经启动了必需的各项进程:namenode、datanode、resourcemanager、nodemanager、JobHistoryServer 等。并拥有Python2.7版本。Python3版本的话需要修改程序。
2.代码和数据集准备
1)编写Map代码
这里我们创建一个map.py脚本,从标准输入(stdin)读取数据,默认以空格分隔单词,然后按行输出单词机器词频到标准输出(stdout),整个Map处理过程不会统计每个单词出现的总次数,而是直接输出“word 1”,以便作为Reduce的输入进行统计。

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

2)编写Reduce代码
这里我们创建一个reduce.py脚本,从标准输入(stdin)读取mapper.py的结果,然后统计每个单词出现的总次数并输出到标准输出(stdout)。

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

3)写数据集。随便写一个src.txt的测试数据。

3.在Hadoop本地调试
将三个文件放在Hadoop服务器的一个喜欢的位置,比如放在新建的test文件夹下,并通过以下命令在本地测试。

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

运行结果如下,成功地显示了每个词出现的次数。
在这里插入图片描述
4.在Hadoop集群上运行
1)集群上运行第一步就是把测试数据上传到HDFS,我的上传路径是“/”,也就是当前用户的根目录。

$ hadoop fs -put src.txt /

查看上传结果如下
在这里插入图片描述2)接下来把我们的代码放到Hadoop上运行,由于Hadoop是java编写的,运行时需要导入程序的jar包才行,正常情况下,可以用eclipse自带的打包工具打包写好的java代码。然而,我们是用python编写的,怎么办呢?这个时候就需要用到Hadoop自带的工具streaming了,它可以自动帮我们将标准输入输出流串起来。且streaming.jar是Hadoop可运行的。首先cd到Hadoop-streaming-2.7.4.jar所在目录。然后运行以下指令(注意其中的程序路径需要根据自己情况修改):

$ hadoop jar hadoop-streaming-2.7.5.jar -input ./src.txt -output ./testout3 -mapper "python map.py" -reducer "python reduce.py" -file ~/test/map -file ~/test/reduce.py

下图为我的hadoop-streaming-2.7.5.jar路径
在这里插入图片描述执行hadoop jar 命令并配置相关参数,运行结果如下面两张截图所示。
在这里插入图片描述在这里插入图片描述运行成功后通过 hdfs 的cat指令查看输出结果,结果输出目录为上面指定的/test_out3,输出结果自动命名为part-00000.
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值