Python初次实现MapReduce——WordCount

2023-05-16

前言

Hadoop 本身是用 Java 开发的,所以之前的MapReduce代码小练都是由Java代码编写,但是通过Hadoop Streaming,我们可以使用任意语言来编写程序,让Hadoop 运行。

本文用Python语言实现了词频统计功能,最后通过Hadoop Streaming使其运行在Hadoop上。

Python写MapReduce代码

使用Python写MapReduce的“诀窍”是利用Hadoop流的API,通过STDIN(标准输入)、STDOUT(标准输出)在Map函数和Reduce函数之间传递数据。

我们唯一需要做的是利用Python的sys.stdin读取输入数据,并把我们的输出传送给sys.stdout。Hadoop流将会帮助我们处理别的任何事情。

Map阶段:mapper.py

1

2

3

4

5

6

7

#!/usr/bin/env python3

import sys

for line in sys.stdin:

    line = line.strip()

    words = line.split()

    for word in words:

        print("%s\t%s" % (word, 1))

Reducer阶段:reducer.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#!/usr/bin/env python3

from operator import itemgetter

import sys

current_word = None

current_count = 0

word = None

for line in sys.stdin:

    line = line.strip()

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

    try:

        count = int(count)

    except ValueError:  #count如果不是数字的话,直接忽略掉

        continue

    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

if word == current_word:  #最后一个单词

    print("%s\t%s" % (current_word, current_count))

python代码放在本地即可,不需上传到HDFS。由于后面需要执行这两段代码,所以为它们增加可执行权限,即:


chmod +x mapper.py
  

chmod +x reducer.py
  

本地测试

用Hadoop Streaming的好处之一就是因为代码没有库的依赖,调试方便,可以脱离Hadoop先在本地用管道模拟调试,所以我们先在本地进行测试。

mapper.py

reducer.py

Hadoop运行

数据准备

测试文件in.txt文件内容为:

需要将其上传至HDFS,上传命令为:


bin/hadoop -copyFromLocal in.txt in.txt
  

Hadoop Streaming简介

Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行,map/reduce程序只要遵循从标准输入stdin读,写出到标准输出stdout即可。

它通过将其他语言编写的 mapper 和 reducer 通过参数传给一个事先写好的 Java 程序(Hadoop 自带的 *-streaming.jar),这个 Java 程序会负责创建 MR 作业,另开一个进程来运行 mapper,将得到的输入通过 stdin 传给它,再将 mapper 处理后输出到 stdout 的数据交给 Hadoop,经过 partition 和 sort 之后,再另开进程运行 reducer,同样通过 stdin/stdout 得到最终结果。因此,我们只需要在其他语言编写的程序中,通过 stdin 接收数据,再将处理过的数据输出到 stdout,Hadoop Streaming 就能通过这个 Java 的 wrapper 帮我们解决中间繁琐的步骤,运行分布式程序。

优点:

1. 可以使用自己喜欢的语言来编写 MapReduce 程序(不必非得使用 Java)

2. 不需要像写 Java 的 MR 程序那样 import 一大堆库,在代码里做很多配置,很多东西都抽象到了 stdio 上,代码量显著减少。

3. 因为没有库的依赖,调试方便,并且可以脱离 Hadoop 先在本地用管道模拟调试。

缺点:

1. 只能通过命令行参数来控制 MapReduce 框架,不像 Java 的程序那样可以在代码里使用 API,控制力比较弱。

2. 因为中间隔着一层处理,效率会比较慢。

3. 所以 Hadoop Streaming 比较适合做一些简单的任务,比如用 Python 写只有一两百行的脚本。如果项目比较复杂,或者需要进行比较细致的优化,使用 Streaming 就容易出现一些束手束脚的地方。

Hadoop Streaming运行

首先需要找到hadoop-streaming的位置,我的hadoop是2.x版本的,该包的位置在:

在执行的过程中遇到了权限不够的问题:

解决办法是扩大权限:

为了方便起见,接下来我就把hadoop-streaming-2.9.2.jar放在了/usr/local/hadoop目录下,所以在下面的命令中大家注意一下。

最后输入如下命令:

1

2

3

4

5

6

7

bin/hadoop jar /usr/local/hadoop/hadoop-streaming-2.9.2.jar\

-mapper /usr/local/hadoop/mapper.py\

-file /usr/local/hadoop/mapper.py\

-reducer /usr/local/hadoop/reducer.py\

-file /usr/local/hadoop/reducer.py\

-input in.txt\

-output out

第一行是告诉Hadoop运行Streaming的Jav 程序,后面的mapper.py 和 reducer.py 是 mapper 所对应 Python 程序的路径。为了让Hadoop 将程序分发给其他机器,需要再加一个 -file 参数用于指明要分发的程序放在哪里。

Python代码优化

 使用 Python 编写 Hadoop Streaming 时,在能使用 iterator 的情况下,尽量使用 iterator,避免将 stdin 的输入大量储存在内存里,否则会严重降低性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python初次实现MapReduce——WordCount 的相关文章

  • Java的lambda表达式

    1 Java的lambda表达式 Java小案例 xff1a 原始写法 span class token keyword package span span class token namespace com span class toke
  • equals方法和hashcode方法

    一 Object都有哪些方法 xff1f 1 xff0e clone方法 保护方法 xff0c 实现对象的浅复制 xff0c 只有实现了Cloneable接口才可以调用该方法 xff0c 否则抛出CloneNotSupportedExcep
  • podman容器开机自启

    podman容器开机自启 管理员开机自启 拉取busybox镜像作测试 root 64 localhost podman pull busybox Resolved 34 busybox 34 as an alias etc contain
  • Hadoop基础操作--查询集群的存储系统信息

    通过HDFS监控服务可以查询到大量相关信息 xff0c HDFS的监控服务是通过节点 xff08 NameNode xff09 的端口50070来进行访问 例 xff1a 在浏览器地址栏输入 http master 50070 来展现当前H
  • MapReduce编程入门--用eclipse创建MapReduce工程

    这里我用的事eclipse对MapReduce进行编程 xff0c 首先需要下载相关的eclipse xff0c eclipse可以用于多种语言的开发 xff0c 这里我们需要用到的是Eclipse IDE for Java EE Deve
  • Mac使用VMware Fusion安装OpenWRT

    需要在Mac电脑上安装VMware Fusion xff0c 准备OpenWRT镜像 vmdk版本 xff08 img转vmdx方法可在我的csdn文章中找到 xff09 安装步骤 1 打开VMware Fusion点击左上角 43 打开
  • [网络工程师]-路由配置-BGP配置

    组建BGP网络是为了实现网络中不同AS之间的通信 配置BGP基本功能是组建BGP网络的最基本要求 xff0c 主要包括一下三部分 xff1a xff08 1 xff09 启动BGP进程 xff1a 只有先启动BGP进程 xff0c 才能开始
  • Linux--bash、fork、exec、进程替换相关命令

    目录 1 bash 2 fork 43 exec 例1 xff1a 3 fork 43 exec 例子2 1 bash linux bash是一个命令处理器 xff0c 通常运行于文本窗口中 xff0c 并能执行用户直接输入的命令 xff1
  • js,定时器,计时器

    let a 61 settimeout 61 gt console log 1 1000 1 xff0c 返回值是一个number标识 2 xff0c cleartimeout xff0c 和clearintenval都可以消除settim
  • commonjs模块和es6模块的区别

    es6模块在浏览器端和服务器端都可用 xff0c commonjs只适用于服务端 1 xff0c es6是编译时输出接口 xff08 接口在代码在解析阶段就已经生成 xff09 xff0c commonjs是运行时加载 xff0c 在脚本完
  • uboot的命令体系-2.8.uboot源码分析4-朱有鹏-专题视频课程

    uboot的命令体系 2 8 uboot源码分析4 3793人已学习 课程介绍 本课程为uboot学习的第8部分 xff0c 主要讲解uboot的命令体系 分析了uboot的命令定义和实现的方法 xff0c 教大家自己向uboot中添加自定
  • 浪潮服务器忘记管理口地址,远程配置raid,远程安装系统。

    如果浪潮服务器忘记了管理口地址 xff0c 可以通过设置临时IP地址进行服务器管理 xff08 必须保证服务器之前IPV4的获取方式为DHCP xff09 使用工具 xff1a tftpd32 xff08 网上可直接搜索下载 xff09 x
  • linux命令行——linux快速搜索历史命令

    一 需求描述 在执行命令时 xff0c 对于已经输入的历史命令 xff0c 可以通过关上下键进行翻找 xff0c 如果是最近几条 xff0c 很容易找到 xff0c 如果是很久之前的命令 xff0c 依旧使用上下键查找就会力不从心 二 解决
  • 如何用六步教会你使用python爬虫爬取数据

    前言 xff1a 用python的爬虫爬取数据真的很简单 xff0c 只要掌握这六步就好 xff0c 也不复杂 以前还以为爬虫很难 xff0c 结果一上手 xff0c 从初学到把东西爬下来 xff0c 一个小时都不到就解决了 python爬
  • react实现点击复制

    1 使用浏览器提供的document execCommand 39 copy 39 2 使用copy to clipboard库 document execCommand 34 copy 34 1 document execCommand封
  • zustand

    最近工作中需要用到zustand xff0c 先记录一下学到的demo 安装 xff1a npm install zustand 公共文件store引入 import create from 39 zustand 39 const useS
  • antd获取表单的所有数据

    当我们使用antd的组件的form 表单时 xff0c 数据一般在form中的onFinish 61 onFinish 方法上可以拿到 const Demo 61 61 gt const onFinish 61 values any 61
  • antd使用阿里巴巴矢量图标

    最近需要在antd引入中阿里矢量图标 xff0c 看到几个关于antd使用iconfont的回答 xff0c 其中关于Icon的引入 xff0c 都是写的从antd引入 xff08 不可用 xff09 旧版本 xff1a import Ic
  • antd表单赋值,回显表格数据

    使用 antd 做表格回显数据时 xff0c 会看到文档有写 xff1a 所以我们可以 1 定义hooks const form 61 Form useForm 2 在触发事件中使用 xff0c 以打开模态框赋值为例 const showM
  • react反向代理配置

    官网 xff1a https create react app dev docs proxying api requests in development 安装 npm install http proxy middleware save

随机推荐