用Python来写MapReduce之Wordcount

栏目: Python · 发布时间: 7年前

内容简介:虽然Hadoop是用Java编写的一个框架, 但是并不意味着他只能使用Java语言来操作, 在Hadoop-0.14.1版本后, Hadoop支持了Python和C++语言, 在它的语法是指定输入输出文件和mapper, reducer即可.

前言

虽然Hadoop是用 Java 编写的一个框架, 但是并不意味着他只能使用Java语言来操作, 在Hadoop-0.14.1版本后, Hadoop支持了 Python 和C++语言, 在 Hadoop的文档 中也表示可以使用Python进行开发, 通常来说都会考虑将源码打包成jar包再运行, 例子: PythonWordCount 这明显不方便. 在Hadoop的文档中提到了 Hadoop Streaming , 我们可以使用流的方式来操作它.

它的语法是

hadoop jar hadoop-streaming-2.9.2.jar \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /usr/bin/wc

指定输入输出文件和mapper, reducer即可.

在Python中的sys包中存在, stdin和stdout,输入输出流, 我们可以利用这个方式来进行MapReduce的编写. 本文以WordCount进行举例

Coding

我们在工程目录下创建两个文件,分别是mapper.py和reducer.py, 之后使用命令 chmod +x mapper.py 来给他们赋予执行权限.

Mapper

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
-------------------------------
FileName: mapper
Author: ying
Date: 18-12-6
-------------------------------
Change Activity: 18-12-6
"""
import sys

__author__ = "YingJoy"

for line in sys.stdin:
    # 捕获输入流
    line = line.strip()
    words = line.split()

    for word in words:
        # 注意这里哦
        print("%s\t%s" % (word, 1))

Reducer

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
-------------------------------
FileName: reducer
Author: ying
Date: 18-12-6
-------------------------------
Change Activity: 18-12-6
"""
import sys

__author__ = "YingJoy"

word_dict = {}

for line in sys.stdin:

    line = line.strip()
    word, count = line.split('\t')

    try:
        count = int(count)
    except ValueError:
        continue

    if word in word_dict:
        word_dict[word] += 1
    else:
        word_dict.setdefault(word, 1)

for k, v in word_dict.items():
    print('%s\t%s' % (k, v))

测试代码

这里使用 Linux 的管道来进行测试, 将前一项的输出作为后一项的输入

echo "foo foo quux labs foo bar quux" | ./mapper.py

`
foo     1
foo     1
quux    1
labs    1
foo     1
bar     1
quux    1
`

echo "foo foo quux labs foo bar quux" | ./mapper.py | sort -k1,1 | ./reducer.py

`
bar     1
foo     3
labs    1
quux    2
`

在Hadoop上运行代码

准备

首先我们在 http://www.gutenberg.org/ 这个网站上随便下基本电子书(选择Plain Text UTF-8)

然后使用命令将文本上传到HDFS中

# 创建文件夹, 否则出错
hdfs dfs -mkdir gutenberg 
hdfs dfs -put *.txt gutenberg
hdfs dfs -ls gutenberg

这里说明一下, HDFS的相对目录, 是相对于当前用户的目录, 如我的用户是 ying , 它默认的位置就是 /user/ying
然后你就可以在HDFS看到刚刚上传的文件了

用Python来写MapReduce之Wordcount

启动MapReduce任务

运行下面的命令

hadoop jar /opt/hadoop-2.9.2/share/hadoop/tools/lib/hadoop-streaming-2.9.2.jar -file ./mapper.py -mapper ./mapper.py -file ./reducer.py -reducer ./reducer.py -input /user/ying/gutenberg/* -output /user/ying/output

注意,这里使用的hadoop命令, 如果你使用hdfs命令会报错误: 找不到主类

运行之后你可以在本地: localhost:8088 看到你的任务, 如图

用Python来写MapReduce之Wordcount 用Python来写MapReduce之Wordcount

等待任务完成即可在输出目录下看到结果,注意这里的output目录运行之前不能存在,否则报错

用Python来写MapReduce之Wordcount

以上所述就是小编给大家介绍的《用Python来写MapReduce之Wordcount》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从规范出发的程序设计

从规范出发的程序设计

[美] Carroll Morgan / 裘宗燕 / 机械工业出版社 / 2002-8 / 45.00元

本书详细论述了有关规范程序设计的内容,包括:程序和精化、谓词演算、选择、迭代、构造类型、模块和封装等,最后几章还包含了大量的实例研究和一些更高级的程序设计技术。本书提倡一种严格的程序开发方法,分析问题要用严格方式写出程序的规范,而后通过一系列具有严格理论基础的推导,最终得到可以运行的程序。 本书是被世界上许多重要大学采用的教材,适于计算机及相关专业的本科生和研究生使用。一起来看看 《从规范出发的程序设计》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具