图解大数据 | 应用Map-Reduce进行大数据统计@实操案例

图解大数据技术:从入门到精通系列教程 本篇内容是ShowMeAI组织的「图解大数据处理与开发」系列教程入口,本教程以大数据技术为根基,给大家讲解大数据开发与数据处理分析的相关知识与技能,并配以相关的实战案例帮助大家学习理解。... 阅读详情

作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/170
声明:版权所有,转载请联系平台与作者并注明出处

收藏ShowMeAI查看更多精彩内容


1.引言

本教程ShowMeAI详细给大家讲解Hadoop使用Map-Reduce进行数据统计的方法,关于Hadoop与map-reduce的基础知识,大家可以回顾ShowMeAI的基础知识讲解篇分布式平台Hadoop与Map-reduce详解。

尽管大部分人使用Hadoop都是用java完成,但是Hadoop程序可以用python、C++、ruby等完成。本示例教大家用python完成MapReduce实例统计输入文件的单词的词频。

  • 输入:文本文件
  • 输出:单词和词频信息,用 \t 隔开

2.Python实现 MapReduce 代码

使用python完成MapReduce需要利用Hadoop流的API,通过STDIN(标准输入)、STDOUT(标准输出)在Map函数和Reduce函数之间传递数据。

我们会利用Python的sys.stdin读取输入数据,并把我们的输出传送给 sys.stdout。Hadoop流将会完成其他的工作。

一个抽象的Hadoop大数据处理流程如下图所示:

实操案例; 应用map-reduce进行大数据统计; Map-Reduce; Hadoop大数据处理流程; 4-1

对于本文提到的任务,我们做一个更详细的拆解,整个Hadoop Map-Reduce过程如下图所示:

实操案例; 应用map-reduce进行大数据统计; Map-Reduce; Hadoop; Map-Reduce过程; 4-2

从上图,我们可以看到,我们在当前任务中,需要核心通过代码完成的步骤是:

  • Map:产生词与次数标记键值对
  • Reduce:聚合同一个词(key)的值,完成统计

下面我们来看看,通过python如何完成这里的 Map 和 Reduce 阶段。

2.1 Map阶段:mapper.py

在这里,我们假设map阶段使用到的python脚本存放地址为 ShowMeAI/hadoop/code/mapper.py

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

解释一下上述代码:

  • 文件从STDIN读取文件。
  • 把单词切开,并把单词和词频输出STDOUT。
  • Map脚本不会计算单词的总数,而是直接输出 1(Reduce阶段会完成统计工作)。

为了使脚本可执行,增加 mapper.py 的可执行权限:

chmod +x ShowMeAI/hadoop/code/mapper.py

2.2 Reduce阶段:reducer.py

在这里,我们假设reduce阶段使用到的python脚本存放地址为 ShowMeAI/hadoop/code/reducer.py :

#!/usr/bin/env python
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)

文件会读取 mapper.py 的结果作为 reducer.py 的输入,并统计每个单词出现的总的次数,把最终的结果输出到STDOUT。

为了是脚本可执行,增加 reducer.py 的可执行权限

chmod +x ShowMeAI/hadoop/code/reducer.py

3.本地测试MapReduce流程

通常我们在把数据处理流程提交到集群进行运行之前,会本地做一个简单测试,我们会借助linux的管道命令 (cat data | map | sort | reduce) 对数据流进行串接,验证我们写的 mapper.py 和 reducer.py脚本功能是否正常。这种测试方式,能保证输出的最终结果是我们期望的。

测试的命令如下:

cd ShowMeAI/hadoop/code/
echo "foo foo quux labs foo bar quux" | python mapper.py
echo ``"foo foo quux labs foo bar quux"` `| python mapper.py | sort -k1, 1  | python reducer.py

其中的sort过程主要是完成以key为基准的排序,方便reduce阶段进行聚合统计。

4.Hadoop集群运行python代码

4.1 数据准备

我们对以下三个文件进行词频统计,先根据下述路径下载:

将文件放置到 ShowMeAI/hadoop/datas/ 目录下。

4.2 执行程序

把本地的数据文件拷贝到分布式文件系统HDFS中。

bin/hadoop dfs -copyFromLocal ShowMeAI/hadoop/datas  hdfs_in

查看:

bin/hadoop dfs -ls

查看具体的文件:

bin/hadoop dfs -ls /user/showmeai/hdfs_in

执行MapReduce job:

bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar \
-file ShowMeAI/hadoop/code/mapper.py     -mapper ShowMeAI/hadoop/code/mapper.py \
-file ShowMeAI/hadoop/code/reducer.py    -reducer ShowMeAI/hadoop/code/reducer.py \
-input /user/showmeai/hdfs_in/*    -output /user/showmeai/hdfs_out

实例输出:

实操案例; 应用map-reduce进行大数据统计; Map-Reduce; 运行结果; 4-3

查看输出结果是否在目标目录 /user/showmeai/hdfs_out:

bin/hadoop dfs -ls /user/showmeai/hdfs_out

查看结果:

bin/hadoop dfs -cat /user/showmeai/hdfs_out2/part-00000

输出:

实操案例; 应用map-reduce进行大数据统计; Map-Reduce; 运行结果; 4-4

5.Mapper 和 Reducer代码优化

5.1 python中的迭代器和生成器

我们这里对Map-Reduce的代码优化主要基于迭代器和生成器,对这个部分不熟悉的同学可以参考ShowMeAI的python部分内容 → 《图解python | 迭代器与生成器》 。

5.2 优化Mapper 和 Reducer代码

mapper.py
#!/usr/bin/env python
import sys
def read_input(file):
    for line in file:
        yield line.split()

def main(separator='\t'):
    data = read_input(sys.stdin)
    for words in data:
        for word in words:
            print "%s%s%d" % (word, separator, 1)

if __name__ == "__main__":
    main()

reducer.py
#!/usr/bin/env python
from operator import itemgetter
from itertools import groupby
import sys

def read_mapper_output(file, separator = '\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main(separator = '\t'):
    data = read_mapper_output(sys.stdin, separator = separator)
    for current_word, group in groupby(data, itemgetter(0)):
        try:
            total_count = sum(int(count) for current_word, count in group)
            print "%s%s%d" % (current_word, separator, total_count)
        except valueError:
            pass

if __name__ == "__main__":
    main()

我们对代码中的groupby做一个简单代码功能演示讲解,如下:

from itertools import groupby
from operator import itemgetter

things = [('2009-09-02', 11),
          ('2009-09-02', 3),
          ('2009-09-03', 10),
          ('2009-09-03', 4),
          ('2009-09-03', 22),
          ('2009-09-06', 33)]

sss = groupby(things, itemgetter(0))
for key, items in sss:
    print key
    for subitem in items:
        print subitem
    print '-' * 20

结果:

2009-09-02
('2009-09-02', 11)
('2009-09-02', 3)
--------------------
2009-09-03
('2009-09-03', 10)
('2009-09-03', 4)
('2009-09-03', 22)
--------------------
2009-09-06
('2009-09-06', 33)
--------------------

代码中:

  • groupby(things, itemgetter(0)) 以第0列为排序目标
  • groupby(things, itemgetter(1)) 以第1列为排序目标
  • groupby(things) 以整行为排序目标

6.参考资料

【大数据技术与处理】推荐阅读

ShowMeAI 系列教程推荐

showmeai.tech

【大数据】图解MapReduce计算平均分的流程 源代码请参照课本P196 阅读详情

相关推荐

深入解析Map集合的使用及其在大数据中的应用

总结:Map集合是Java中一种常用的数据结构,它提供了键值对的存储方式,适用于需要频繁查找和更新的场景。通过本文的讲解和示例代码,希望读者能够更深入地理解Map集合的使用方法及其在大数据中的应用。和Collection不同的是,Map中的每个元素都包含两部分,即键和值。以上代码使用HashMap来统计文本文件中每个单词的出现次数,通过遍历文本中的单词,并使用Map的键值对特性来进行统计。方法可以向Map集合中添加键值对,如果已存在相同的键,则会覆盖原有的值。方法可以判断指定的键是否存在于Map中,通过。

2301_79367634的博客 273

Hadoop MapReduce 统计汽车销售信息

本文将讨论如何使用Hadoop MapReduce来统计汽车销售信息。

wux_labs的博客 3774

【大数据之路4】分布式计算模型 MapReduce

map 并发 reduce 汇总MapReduce 是一个分布式的计算编程框架(或编程模型),属于一个半成品,并行计算框架。在一个完整的分布式计算任务代码编写过程中,对程序员来说,除了业务之外的所有代码都不写最好。封装通用代码,对业务代码提供编写规范。MapReduce 核心功能】:将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。增加了计算任务调度的复杂性求和求最值都可以,但求平均值不能用。

程序员五哥 1005

MapReduce对环境大数据进行统计分析

要求每位学生编写MapReduce程序,分别从气温和空气质量这2个维度分析天气情况,从北京2016年1月到6月这半年间的历史天气和空气质量数据文件中分析出的环境统计结果,并在已搭建好的伪分布式集群或完全分布式集群的master服务器上运行,最后输出程序运行结果。如果每小时记录一次城市的天气实况和空气质量实况信息,则每个城市每天都会产生24条环境数据,全国所有2500多个城市如果均如此进行记录,那每天产生的数据量将达到6万多条,每年则会产生2190万条记录,已经可以称得上环境大数据。

m0_58540923的博客 784

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

避坑指南:vue-print-nb打印隐藏元素与空白页的那些事儿

本文深入解析了使用vue-print-nb插件时,打印出现空白页及隐藏元素问题的根本原因与解决方案。核心在于理解浏览器打印原理,并通过CSS媒体查询精准控制样式。文章提供了从重置根元素高度、处理隐藏元素到控制分页的完整避坑指南,帮助开发者彻底解决打印样式难题。

weixin_29008691的博客 437

【手把手 脑把脑】教会你使用idea基于MapReduce的统计数据分析(从问题分析到代码编写)

MapReduce是一种简化的并行计算编程模型框架,主要解决了分布式计算的相关问题。所谓的分布式计算就是将一个文件里的数据内容,一行行的发送给mapper,mapper接收到一行数据使用split分割后接收,并按key分组后传给reducer,reducer将接收到的一组数据进行处理后输出,当所有的组都处理完成结束一个MapReduce。参考sql语句的分组查询,mapper功能就相当于按课程和成绩两个字段值对数据进行分组并查询学生姓名。mapper里的最后一句context.write(key,v

扎哇太枣糕的笔记博客 9899

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇) 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了修改环节和相应参数。 垂直起降固定翼 中文教程-参数设置 垂直起降固定翼是由 多轴+...

u011322358的博客 2万+

【Python】手动实现MapReduce编码统计销售数量

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。 ...

少年休闲海 2018

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

相关性分析:求解相关系数并绘制热力图进行对比

weixin_67565775的博客 8万+

Homebrew国内镜像自动安装全攻略:从零到精通

本文提供了一份详尽的Homebrew国内镜像自动安装指南,旨在帮助Mac用户,特别是国内开发者,快速、无痛地部署这一强大的包管理器。通过使用优化的国内镜像脚本,实现一键自动安装,有效解决官方源访问缓慢或失败的问题。文章从安装前准备、脚本执行步骤、原理讲解到日常使用命令和常见问题排查,提供了从零到精通的完整路径,让用户在短时间内掌握Homebrew的核心用法,提升开发与工作效率。

a0b1c2d3的专栏 969

图解大数据 | 分布式平台Hadoop与Map-Reduce详解

Hadoop是最基础和场景的开源分布式计算平台,ShowMeAI在本节内容中给大家讲解Hadoop相关知识。

ShowMeAI研究中心 1万+

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

226

MapReduce--Shuffle图解详解

0、前言 早期的大数据主要应用在统计分析:分组和排序 数据量非常大,即使我们做分布式,可以处理大数据,但是排序这种无法做到跨机器的整体有序,每台机器处理一部分数据的排序 大量数据需要进行排序 每台机器对一部分数据进行排序 将每台机器排序的结果写入磁盘 通过插入排序这种基于磁盘排序 的算法来实现排序 Shuffle过程必用磁盘:非常慢 能避免不产生shuffle就不产生shuffle 1、功能 分区:决定了Map输出的数据会被哪个Reduce 进行处理 默认规则:按照key的hash值

qq_46893497的博客 2006

华为OD机试双机位C卷:挑选宝石 (C/C++/Python/JAVA/JS/GO)

华为OD机试双机位C卷 挑选宝石,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-挑选宝石,华为OD机考-挑选宝石。

qq_45776114的博客 1503

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

这篇文章教你如何对接金蝶API并且使用JAVA调用金蝶云星空的即时库存查询API

实用的博客 2609

分布式计算框架Map/Reduce

等用空格字符分隔的字符串,通过使用MapReduce计算框架来统计以空格分隔的每个单词出现的频率,输出结果如,,形式的结果到HDFS目录中。分布可靠,对数据集的操作分发给集群中的多个节点实现可靠性,每个节点周期性返回它完成的任务和最新状态。5)master调度worker执行reduce任务,reduceworker读取map任务的输出文件。通常我们把从Mapper阶段输出数据到Reduce阶段的reduce计算之间的过程称之为shuffle。提供跨语言编程的能力。...

weixin_52464817的博客 417

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大数据(十二) --使用MapReduce和SparkCore技术实现单词统计(WorldCount)案例

WorldCount案例示例数据需求分析计算分析MapReduce实现SparkCore实现 示例数据 需求分析 计算分析 MapReduce实现 SparkCore实现

七宝.博客 1810

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Big Data - Hadoop - MapReduce】初学Hadoop之图解MapReduce与WordCount示例分析

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算。 HDFS是Google File System(GFS)的开源实现。 MapReduce是Google MapReduce的开源实现。 HDFS和MapReduce实现是完全分离的,并不是没有HDFS就不能MapReduce运算。 本文主要参考了以...

weixin_34409822的博客 287

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

5分钟掌握大数据:MapReduce

5分钟掌握大数据:MapReduce 在使用java编写MaReduce程序之前,先让我们解决一个基本问题——MapReduce是什么?它的运行机制是怎么样的? 能够打开这篇文章的读者,应该或多或少都有一些技术基础。但是为了使得下面的解说更加清楚明白,这里还是要简单描述一下。 MapReduce是什么 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Ma...

yayaqwl的博客 269

Hive从入门到放弃——Hive SQL执行原理图解(九)

背 景    select语句执行图解    group by语句执行图解    join语句执行图解   

LXWalaz1s1s的博客 1334

图解MapReduceMapReduce整体流程图

1.图解MapReduceMapReduce整体流程图 并行读取文本中的内容,然后进行MapReduce操作 Map过程:并行读取三行,对读取的单词进行map操作,每个词都以<key,value>形式生成 reduce操作是对map的结果进行排序,合并,最后得出词频。 2.简单过程: Input: Hello World Bye World Hello H...

weixin_34290631的博客 604

hive调优:案例详解(第16天)

本文主要论述工作中常用的Hive调优和面试常考的Hadoop原理。

syhiiu的博客 2105

大数据技术Hadoop之分布式计算框架MapReduce

MapReduce是一种分布式计算框架,它可以将大规模的数据集分成许多小的数据块,然后在分布式计算集群中进行并行处理。MapReduce的核心思想是将数据处理过程分为两个阶段:Map和Reduce。Map阶段将输入数据映射为一系列的键值对,Reduce阶段将Map阶段输出的键值对进行合并和归约。Map阶段的输入数据可以是任意格式的数据,例如文本、图片、音频等。Map阶段的处理过程可以是任意的计算过程,例如数据清洗、数据过滤、数据转换等。

m0_57254949的博客 1011
上一篇: 图解大数据 | Hadoop系统搭建与环境配置@实操案例
下一篇: 图解大数据 | Hive搭建与应用@实操案例
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值