Mapreduce概念及流程介绍
MapReduce过程
MapReduce是采用一种分而治之的思想设计出来的分布式计算框架,它由两个阶段组成:map阶段和reduce阶段。
在map阶段中:
- 首先读取HDFS中的文件,每个文件都以一个个block形式存在,block中的数据会被解析成多个kv对,然后调用map task的map方法;
- map方法对接收到的kv对进行分片处理,转换输出成新的kv对;
- 然后对kv对进行分区和排序压缩,中间会涉及到map的shuffle过程,最后存入本地磁盘,供后续reduce task作为输入参数使用。
在reduce阶段中:
- reduce方法将多个map task的输出,按照不同的分区传输到不同的reduce 上进行合并排序,这中间也涉及到reduce的shuffle过程(shuffle就像洗扑克牌一样)
- 然后reduce方法对输入的键值对汇总计算,输出计算结果
- 最后把reduce的输出保存在HDFS文件中。
Mapreduce概念
一、MapReduce编程模型
思想:分成两个阶段,map阶段和reduce阶段;
map阶段将大的任务,切分成小任务,分散到不同的服务器中,并行的执行(减少每个服务器的计算负载,同时减少整体的计算时间); reduce阶段,将map阶段的结果做汇总
map阶段的输入、输出都是以kv对的形式;输出结果写入map任务所在服务器的本地磁盘 reduce阶段的输入来自map阶段的输出;reduce的输出结果也是kv对,默认存储到HDFS中
二、MapReduce编程示例
1、写三个主要的代码 自定义的map类 在map方法中,编写业务代码 自定义的reduce类 在reduce方法中,编写业务代码 程序入口main 编写程序入口
2、可以本地运行
3、集群运行
三、combiner combiner的原理,map端本地聚合 其本质是一个reducer类
四、shuffle
shuffle主要指的map端的输出,然后如何传输到reduce task的过程
shuflle中的执行顺序是先分区,然后在溢写之前进行排序,最后溢出的多个磁盘文件会进行合并成一个大文件。
1.map端: 输出是kv对,先写入环形缓冲区(100M),当达到80%后,缓冲区中的数据开始溢出写磁盘文件; 溢出过程中,有以下几个操作: 1、根据reduce个数对kv对做分区;
2、每个分区中,根据kv对的key做排序;
3、若有map端本地聚合combine,则对每个分区中,同组数据(默认指key相同的kv对)的values做聚合 在溢出写的过程中,可以继续向环形缓冲区写入数据;但是若写入速度大于溢出写的速度,当100m占满后,暂停向环形缓冲区中写入的过程;只执行溢出写的过程;直到全部溢出写到磁盘,才恢复向缓冲区写入。
随着不断的溢出写磁盘文件,本地磁盘会生成多个溢出文件,在map task完成之前,溢出文件会被合并成一个已分区、已排序的输出文件
4.reduce端: reduce task会在每个map task运行完成后,获得map task输出中,属于自己的分区数据(许多kv对); 数据先在reduce的jvm内存中,如果数据占空间变大,则合并后溢出写磁盘文件;若指定了combine,在合并时,运行它,减少写入磁盘的数据量。随着溢出文件的增多,会合并文件 所有map task复制完成后,进入“合并阶段”;维持原顺序排序每组合并后的数据,调用一次reduce方法
Linux shell统计文章中出现频次最高的单词:
]# cat 文件名| grep -Eo --color '\w+' | sort | uniq -c | sort -k1 -nr | head -1解释:-e 使用正则 -o 只打出匹配到的字符 \w+ 匹配字母uniq 去重 ,uniq -c 打印频次,会显示两列 第一列 频次 ,第二列数据sort -k1 代表第一列 -n按数字排序 ,默认由小到大 -nr由大到小排序
MR编程
1.wordcount: 针对实际业务场景(一个用户(user_id)的评价量,点击量,收藏量等等)
#!/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)
#!/usr/bin/env python
from operator import itemgetter
import syscurrent_word = Nonecurrent_count = 0
word = None
for line in sys.stdin: line = line.strip() word, count = line.split('\t', 1) try: count = int(count) except ValueError: 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)
2.mr实现单词idf统计
map.pyimport sys
for line in sys.stdin: ss = line.strip().split('\t')
if len(ss) != 2:
continue
file_name, file_content = ss
word_list = file_content.strip().split(' ')
word_set = set(word_list)
for word in word_set:
print '\t'.join([word, '1'])red.py[root@master tfidf_test]# cat red.py
import sysimport math
current_word = Nonesum = 0
docs_cnt = 508
for line in sys.stdin: ss = line.strip().split('\t') if len(ss) != 2: continue word, val = ss if current_word == None: current_word = word if current_word != word: idf = math.log(float(docs_cnt) / (float(sum) + 1.0)) print '\t'.join([current_word, str(idf)]) current_word = word sum = 0 sum += int(val)idf = math.log(float(docs_cnt) / (float(sum) + 1.0))print '\t'.join([current_word, str(idf)])输出当前单词+idf分
Mapreduce概念及流程介绍相关推荐
- 什么是MapReduce,MapReduce的工作流程和原理是什么
一.MapReduce的概念 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和它 ...
- 从源码角度分析MapReduce的map-output流程
文章目录 前言 流程图 源码分析 1 runNewMapper方法 2.NewOutputCollector方法 2.1 createSortingCollector方法 2.1.1 collecto ...
- 机甲大师机器人控制(一):概念与流程
本文是机甲大师机器人控制的系列博客之一.本文主要介绍了机甲大师机器人以及博主在开发其控制策略时所采用的流程.本系列博客的模型和代码已经上传CSDN资源. 系列博客: 机甲大师机器人控制(一):概念与流 ...
- Druid基本概念及架构介绍
Druid基本概念及架构介绍 学习参考:https://www.apache-druid.cn/ Apache Druid是一个高性能的实时分析型数据库 作者:it_zzy 链接:https://ww ...
- 大数据——MapReduce基础(MapReduce概念)
MapReduce概念 Mapreduce是一个分布式运算程序的编程框架,是用户开发"基于hadoop的数据分析应用"的核心框架: Mapreduce核心功能是将用 ...
- sawtooth,井字棋演示和交易族开发流程介绍
1.实例演示 这里以官网的XO交易族为例演示,该交易族是一个井字棋游戏,在开始之前,我们需要搭建起来一个单节点的sawtooth环境,详情可以查看上一篇博客: Sawtooth,使用docker启动单 ...
- Java-互联网通信流程介绍【基础】
Java-互联网通信流程介绍 一.基本概念 1.什么是互联网通信? 2.互联网通信角色的分类? 3.互联网通信模型(重点) ①C/S通信模型 ①B/S通信模型(重点) 4.共享资源文件 5.开发人员在 ...
- 市场管理流程介绍(MM流程)
一.简介–上图上表会更好 市场管理流程是一套系统方法,是用严格.规范的方法对市场走势和客户需求进行系统分析,创建合理的市场细分规则,对要投资和取得领先地位的细分市场选择和优先级排序,制定可行的业务计划 ...
- Hadoop的概念及架构介绍
Hadoop的概念及架构介绍 Hadoop是大数据开发所使用的一个核心框架.使用Hadoop可以方便的管理分布式集群,将海量数据分布式的存储在集群中(hdfs),并使用分布式程序来处理这些数据.(Ma ...
最新文章
- 一个简单的例子,学习自定义注解和AOP
- 2019数据安装勾选_【安装部署】esweb服务器如何单独部署
- JavaScript 专题之函数柯里化
- linux下php支持mysql_linux下php扩展mysqli的支持 .
- wampserver橙色如何变成绿色_绿色配什么颜色好看 家居绿色配色小技巧-装修攻略...
- 数据库某些要注意的问题(转的,侵权删除)
- SpringMVC学习(三)RestFul风格
- winform通过restsharp调用api接口登录及其它接口
- 2016.4.5_基于nodejs的聊天室【笔记】
- 2021年T电梯修理考试报名及T电梯修理试题及解析
- ffmepg安装yasm之后还是出现nasm/yasm not found or too old. Use --disable-x86asm for
- nginxWebUI :nginx可视化配置工具---实践
- Kafka offset 偏移量详解
- node节点kubelet报错 node \“xxxxx“ not found
- Arthas监控学习与分享
- Web安全之文件上传漏洞
- 字符串格式化(format()使用)
- 2021高考珠海一中成绩查询,最新 | 珠海19所高中高考成绩单出炉,快来围观!
- 《她的声音,每一首歌都是一个驿站》
- 【MongoDB】从入门到精通mongdb系列学习宝典,想学mongodb小伙伴请进来
热门文章
- K-Fold Cross Validation
- 网站左侧悬浮框随着滚动条滚动代码
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
- [wbia 1.1] heritrix抓取网页信息
- 【链表递归构造二叉树】LeetCode 109. Convert Sorted List to Binary Search Tree
- Ubuntu系统各个版本的镜像下载地址
- java URI 编码解码
- Proxy SwitchyOmega 使用黑名单和白名单
- HTML5表单那些事
- 胜利大逃亡[HDU1253]