mapreduce 完整流程解析

1. 在客户端启动一个 job;

hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.6.5.jar -files tmp/example1/mapper.py,tmp/example1/reducer.py -mapper 'python mapper.py' -reducer 'python
reducer.py' -input /usr/mr/example1/input/* -output /usr/mr/example1/output10

2. 该 job 向 jobtrack 申请一个 job id;

3. 将运作该 job 所需的资源上传至 hdfs,包括:jar 文件、配置文件、客户端计算所得的计算划分信息;

  jobtrack 为这些文件创建一个 文件夹,名字为 job id;

  jar 文件默认为 10 个副本;                【由 mapred.submit.replication 属性控制】

  输入划分信息 告诉 jobtrack 应该为这个 job 启动 多少个 map 任务;

4. jobtrack 收到 job 后,将其放入一个 消息队列;

5. 该 job 被 get 时,jobtrack 根据 输入划分信息 为其创建对应个 map 任务,并将 map 任务 分发给 tasktrack;

  // 注意,在分发 map 任务时,需要把 map 任务 发送到 存有对应数据 block 的 tasktrack;

  // 同时发送过去的还有 jar 包等文件;

  // 这在 mr 中叫 运算移动,数据不移动;

6. tasktrack 定时向 jobtrack 发送心跳,证明自己还活着,并且告诉 jobtrack map进度 等多个信息;

7. jobtrack 收到 job 的 最后一个任务完成 信息时,将该作业标记为 完成,并给用户发送信息

map 流程解析

map 中有几个主要概念:

分区:partition,根据 key 进行分区,一般是 hash 方法

排序:sort,对 key 进行排序,排序在 hadoop 中起到核心作用

溢写:spill,把数据从内存写入磁盘

流程图-单个 map 任务

本次描述以 wordcount 为例进行阐述

1. input split 输入切片,其实就是一个 block,我们可以理解为一个 文件;

  一个 split 对应一个 map;

  默认情况下,一个 block  大小 为 64M,当然可以自定义;

aaa
bbb
aaa
aaa
ccc
aaa
ccc

2. map 的输出 存放在 缓存 中,                    【缓冲区 默认 大小为 100M,由 io.sort.mb 属性控制】

当缓存快要溢出时,                         【默认为 缓冲区 的 80%,由 io.sort.spill.percent 属性控制】

在本地创建一个临时文件,将 缓冲区的数据 写入 文件;

  map 就是 逐个处理,比如 work 为 key,value 为 1,直接扔到 标准输出;

3. 在 完成 spill 之前,需要 partition 和 sort,这是 核心,为什么呢,看下图

如果 设置了 Combiner,会将 sort 的结果 combiner 后再 spill 到磁盘,以节省磁盘空间;

分区的数目 等于 reducer 任务的个数;

4. 如果 block 很大,需要 溢写 多个 文件,就行 上图中第四列所示;

5. map 完毕 有多个 溢写文件时,需要将这些 文件 根据 key 进行合并为一个带分区的文件;

  合并的过程 也有 sort 和 combiner 操作;

  为了减少 网络传输,这里还可以将 合并后的文件 压缩;    【只要将 mapred.compress.map.out 设置为true就可以】

6. 将分区中的数据 拷贝到 对应的 renducer 任务;

reducer 流程解析

这里放一张 中文图,其实和上图一样

1. 将 多个 map 传过来的数据 进行 sort ,然后 合并;

2. reducer 处理;

3. 将结果输出到 hdfs;

最后再来几张图,再看已是一目了然

参考资料:

https://www.cnblogs.com/laowangc/p/8961946.html#top  

https://www.jianshu.com/p/461f86936972

https://www.cnblogs.com/52mm/p/p15.html

hadoop-mapreduce 详解的更多相关文章

  1. hadoop之mapreduce详解(进阶篇)

    上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述. 一.mapreduce ...

  2. Hadoop Pipeline详解[摘抄]

    最近使用公司内部的一个框架写map  reduce发现没有封装hadoop streaming这些东西,查了下pipeline相关的东西 Hadoop Pipeline详解 20. Aug / had ...

  3. Hadoop Streaming详解

    一: Hadoop Streaming详解 1.Streaming的作用 Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行:m ...

  4. hadoop框架详解

    Hadoop框架详解 Hadoop项目主要包括以下四个模块 ◆ Hadoop Common: 为其他Hadoop模块提供基础设施 ◆ Hadoop HDFS: 一个高可靠.高吞吐量的分布式文件系统 ◆ ...

  5. Python API 操作Hadoop hdfs详解

    1:安装 由于是windows环境(linux其实也一样),只要有pip或者setup_install安装起来都是很方便的 >pip install hdfs 2:Client——创建集群连接 ...

  6. hadoop之mapreduce详解(基础篇)

    本篇文章主要从mapreduce运行作业的过程,shuffle,以及mapreduce作业失败的容错几个方面进行详解. 一.mapreduce作业运行过程 1.1.mapreduce介绍 MapRed ...

  7. 大数据入门第八天——MapReduce详解(三)MR的shuffer、combiner与Yarn集群分析

    /mr的combiner /mr的排序 /mr的shuffle /mr与yarn /mr运行模式 /mr实现join /mr全局图 /mr的压缩 今日提纲 一.流量汇总排序的实现 1.需求 对日志数据 ...

  8. 大数据入门第七天——MapReduce详解(一)入门与简单示例

    一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...

  9. Hadoop基本命令详解

    调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat 说明:将路 ...

  10. 大数据入门第九天——MapReduce详解(六)MR其他补充

    一.自定义in/outputFormat 1.需求 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据 2. 根据日志中的一个URL字段到外部知识库中获取信息增强到原始日志 3 ...

随机推荐

  1. k8s删除节点后再重新添加进去(踩坑)

    开启本地集群,发现一台节点出问题了,想删除再换一台节点,结果就踩坑了,还好本地有好几套环境. 再master节点执行以下命令 [root@k8s-master ~]# kubectl drain k8 ...

  2. php的while函数

    PHP while 循环 PHP Switch PHP For 循环 PHP while 循环在指定条件为 true 时执行代码块. PHP 循环 在您编写代码时,经常需要反复运行同一代码块.我们可以 ...

  3. linux下面实时查看进程,内存以及cpu使用情况使用命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令查看整体情况,如图: 但是这样虽然看的东西多,但是闲的比较 ...

  4. C++入门经典-例6.20-修改string字符串的单个字符

    1:使用+可以将两个string 字符串连接起来.同时,string还支持标准输入输出函数.代码如下: // 6.20.cpp : 定义控制台应用程序的入口点. // #include "s ...

  5. maven打包加时间戳方法总结

    基于Maven的项目,发布时需要打包,如tar.gz.web项目打成war格式包.每次打包时希望自己加上时间戳,假如我的项目名是myproject,默认打包后名为myproject.war.而我希望的 ...

  6. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  7. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  8. maven仓库,snapshot快照仓库和release发布仓库的区别

    首先看下snapshot类型 建立一个maven-privider项目,版本定义为1.1-SNAPSHOT 创建一个privider类,写一个hello()方法,并推送maven私有仓库 然后再建立一 ...

  9. [Flask]常用过滤器-控制字符串

    truncate: 字符串截断 <p>{{ 'hello every one' | truncate(9)}}</p> length:获取列表长度 <p>{{ [, ...

  10. Python文件重命名代码

    import os def re_name(path): for file in os.listdir(path): file_path = os.path.join(path, file) # 判断 ...