基本概念

map-reduce1.0

例子:

hadoop streaming

  1. 用语言驱动map-reduce的话,使用的hadoop streaming命令,可以通过python,php,java来驱动;
  2. 命令参数列表如下:

-input <path>

输入数据路径

-output <path>

输出数据路径

-mapper <cmd|JavaClassName>

mapper可执行程序或Java类

-reducer <cmd|JavaClassName>

reducer可执行程序或Java类

-file <file> Optional

分发本地文件

-cacheFile <file> Optional

分发HDFS文件

-cacheArchive <file> Optional

分发HDFS压缩文件

-numReduceTasks <num> Optional

reduce任务个数

-jobconf | -D NAME=VALUE Optional

作业配置参数

-combiner <JavaClassName>Optional

Combiner Java类

-partitioner <JavaClassName>Optional

Partitioner Java类

-inputformat <JavaClassName> Optional

InputFormat Java类

-outputformat <JavaClassName> Optional

OutputFormat Java类

-inputreader <spec> Optional

InputReader配置

-cmdenv <n>=<v> Optional

传给mapper和reducer的环境变量

-mapdebug <path> Optional

mapper失败时运行的debug程序

-reducedebug <path> Optional

reducer失败时运行的debug程序

-verbose Optional

详细输出模式

map和 reduce task的个数设置问题

参考资料: https://www.cnblogs.com/xiangyangzhu/p/5278328.html

reduce task的个数 决定 map task的个数,reduce task的个数是人为指定的(??存疑,还有一种说法是文件大小和block的关系决定map task的个数)

MapReduce作业中Map Task数目的确定:

1)MapReduce从HDFS中分割读取Split文件,通过Inputformat交给Mapper来处理。Split是MapReduce中最小的计算单元,一个Split文件对应一个Map Task

2)默认情况下HDFS种的一个block,对应一个Split。

3)当执行Wordcount时:

(1)一个输入文件小雨64MB,默认情况下则保存在hdfs上的一个block中,对应一个Split文件,所以将产生一个Map Task。

(2)如果输入一个文件为150MB,默认情况下保存在HDFS上的三个block中,对应三个Split文件,所以将产生三个Map Task。

(3)如果有输入三个文件都小于64MB,默认情况下会保存在三个不同的block中,也将产生三个Map Task。

4)用户可自行指定block与split的关系,HDSF中的一个block,一个Split也可以对应多个block。Split与block的关系都是一对多的关系。

5)总结MapReduce作业中的Map Task数目是由:

(1)输入文件的个数与大小

(2)hadoop设置split与block的关系来决定。

MapReduce作业中Reduce Task数目的指定:

1)JobClient类中submitJobInternal方法中指定:int reduces=jobCopy.getNumReduceTasks();

2)而JobConf类中,public int getNumReduceTasks(){return geInt("mapred.reduce.tasks",1)}

因此,Reduce Task数目是由mapred.reduce.tasks指定,如果不指定则默认为1.

这就很好解释了wordcount程序中的reduce数量为1的问题,这时候map阶段的partition(分区)就为1了。

other说法

参考资料: https://blog.csdn.net/wf1982/article/details/6672607

增加task的数量,一方面增加了系统的开销,另一方面增加了负载平衡和减小了任务失败的代价;

map task的数量即mapred.map.tasks的参数值,用户不能直接设置这个参数。Input Split的大小,决定了一个Job拥有多少个map。默认input split的大小是64M(与dfs.block.size的默认值相同)。然而,如果输入的数据量巨大,那么默认的64M的block会有几万甚至几十万的Map Task,集群的网络传输会很大,最严重的是给Job Tracker的调度、队列、内存都会带来很大压力。mapred.min.split.size这个配置项决定了每个 Input Split的最小值,用户可以修改这个参数,从而改变map task的数量。

一个恰当的map并行度是大约每个节点10-100个map,且最好每个map的执行时间至少一分钟。

reduce task的数量由mapred.reduce.tasks这个参数设定,默认值是1。

合适的reduce task数量是0.95或者0.75*( nodes * mapred.tasktracker.reduce.tasks.maximum), 其中,mapred.tasktracker.tasks.reduce.maximum的数量一般设置为各节点cpu core数量,即能同时计算的slot数量。对于0.95,当map结束时,所有的reduce能够立即启动;对于1.75,较快的节点结束第一轮reduce后,可以开始第二轮的reduce任务,从而提高负载均衡

性能优化

参考资料: http://www.mamicode.com/info-detail-1357816.html

Reducers数过多的情况:

生成了很多个小文件(最终输出文件由reducer决定,一个reducer输出一个文件),那么如果这些小文件作为下一个Job输入,则会出现小文件过多需要进行合并的问题。而且启动和初始化reducer需要耗费时间和资源。

Reducers数过少:

执行耗时,并且可能出现数据倾斜

Reducer个数的决定:

默认情况下,Hive分配reducer个数由下列参数决定:

参数1:hive.exec.reducers.bytes.per.reducer(默认为1G)

参数2:hive.exec.reducers.max(默认为999)

计算reducer数的公式:

N=min(参数2,总输入数据量/参数1)

即默认一个reduce处理1G数据量。

注意:与mapred.map.tasks参数不同,如果设置了setmapred.reduce.tasks参数的数值,忽略上述计算,reducer个数可以由mapred.reduce.tasks直接指定。

认识map-reduce的更多相关文章

  1. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  2. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  3. 记一次MongoDB Map&Reduce入门操作

    需求说明 用Map&Reduce计算几个班级中,每个班级10岁和20岁之间学生的数量: 需求分析 学生表的字段: db.students.insert({classid:1, age:14, ...

  4. filter,map,reduce,lambda(python3)

    1.filter filter(function,sequence) 对sequence中的item依次执行function(item),将执行的结果为True(符合函数判断)的item组成一个lis ...

  5. map reduce

    作者:Coldwings链接:https://www.zhihu.com/question/29936822/answer/48586327来源:知乎著作权归作者所有,转载请联系作者获得授权. 简单的 ...

  6. python基础——map/reduce

    python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...

  7. Map/Reduce 工作机制分析 --- 作业的执行流程

    前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易& ...

  8. Map/Reduce个人实战--生成数据测试集

    背景: 在大数据领域, 由于各方面的原因. 有时需要自己来生成测试数据集, 由于测试数据集较大, 因此采用Map/Reduce的方式去生成. 在这小编(mumuxinfei)结合自身的一些实战经历, ...

  9. 用通俗易懂的大白话讲解Map/Reduce原理

    Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...

  10. map/reduce of python

    [map/reduce of python] 参考: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac92 ...

随机推荐

  1. 电商项目搜寻功能(分页,高亮,solr,规格过滤,价格的排序)

    package cn.wangju.core.service; import cn.wangju.core.pojo.item.Item; import cn.wangju.core.util.Con ...

  2. 【前端知识体系-NodeJS相关】NodeJS高频前端面试题整理

    1. 为什么JavaScript是单线程? 防止DOM渲染冲突的问题: Html5中的Web Worker可以实现多线程 2.什么是任务队列? 任务队列"是一个先进先出的数据结构,排在前面的 ...

  3. centos6 cgroup及cgred简介和简单使用

    一.cgroup简介 Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项 ...

  4. RESTful服务最佳实践(转)

    原文:https://www.cnblogs.com/jaxu/p/7908111.html 译文作者:Jaxu 英文原文:https://files-cdn.cnblogs.com/files/ja ...

  5. Thread 另类用法,如何执行一段可能死锁/卡死/死循环的代码

    场景与需求 需要执行一段第三方的代码,这段代码可能死锁/卡死/死循环,在超时之后,如果没有结束,则认为任务执行失败,退出执行. 实现方案1:使用 Task 超时 实现方法参考: https://www ...

  6. Python - 常规操作Excel - 第二十六天

    前言 作为一名资深程序员,通过代码熟练操作Excel是必不可少的技能,本章主要讲解Python通过openpyxl第三方库(官方文件说明)对Excel进行操作,使Excel程序化操作更为简单快捷. o ...

  7. python3之利用字典和列表实现城市多级菜单

    利用字典和列表实现城市多级菜单 #coding:utf-8 #利用字典和列表实现城市多级菜单 addrIndex = {":"福建"} addrDict = {" ...

  8. IO流总结---- 字节流 ,字符流, 序列化 ,数据操作流,打印流 , Properties 集合

    笔记内容: 什么是流 字节流 字符流 序列化 数据操作流(操作基本数据类型的流)DataInputStream 打印流 Properties 集合 什么是流: 流是个抽象的概念,是对输入输出设备的抽象 ...

  9. 关于git回退版本的一点心得

    我由于开发中不小心在master分支上开发,忘记了切换分支,最后我直接在master分支上提交,push,在开发分支上merge了master分支. 然后,同事告诉我他的代码要准备上线了,然而我的代码 ...

  10. loadView的原理

    其他的小记: 1.控制器的view是怎么创建的 当外界第一次使用当前控制器的view时,会调用当前一个方法loadView,创建控制器的view: 控制器的view是懒加载的,什么时候使用,什么时候才 ...