MapReduce Map数 reduce数设置
JobConf.setNumMapTasks(n)是有意义的,结合block size会具体影响到map任务的个数,详见FileInputFormat.getSplits源码。假设没有设置mapred.min.split.size,缺省为1的情况下,针对每个文件会按照min (totalsize[所有文件总大小]/mapnum[jobconf设置的mapnum], blocksize)为大小来拆分,并不是说文件小于block size就不去拆分。
2.http://hadoop.hadoopor.com/thread-238-1-1.html
不知道你是要提高整个集群的map/reduce任务数,还是单个节点可并行运行的map/reduce任务数?对于前者是一般只设置reduce任务数,而map任务数是由Splits个数决定的; 对于后者,是可以在配置中设置的,分别为:mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.reduce.tasks.maximum
另外,还有个参数mapred.jobtracker.taskScheduler.maxRunningTasksPerJob,用来控制一个job最大并行tasks数,这个是指在集群最大并行数。
3.我的理解:具体看FileInputFormat.java的代码
map tasks的个数只要是看splitSize,一个文件根据splitSize分成多少份就有多少个map tasks。而splitSize的计算(看FileInputFormat的源码):splitSize = Math.max(minSize, Math.min(maxSize, blockSize));而
minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));即是某种格式的文件的最小分割size(如看源码sequenceFile是2000)和整个job配置的最小分割size(即mapred-default.xml中mapred.min.split.size的值)之间的较大的那个
maxSize是mapred.max.split.size(mapred-default.xml中竟然没有,我试了一下,在mapred-site.xml中配置覆盖也没有用,具体用法参照http://osdir.com/ml/mahout-user.lucene.apache.org/2010-01/msg00231.html用参数配置: hadoop jar /root/mahout-core-0.2.job org.apache.mahout.clustering.lda.LDADriver -Dmapred.max.split.size=900...),如果不配置,默认值是long类型的最大值。(mapred.max.split.size不推荐配置(试))
blockSize是即hdfs-default.xml中dfs.block.size的值,可在hdf-site.xml中覆盖.这个值必须是512的倍数,如果想要数量更多的map的tasks的个数,可以把dfs.block.size设得小一点,512,1024等等,反正上面的公式保证了即使你这个blocksize设得比某种格式的文件的最小分割size要小,最后还是选者这种格式的最小分割size,如果blocksize比它大,则选用blocksize作为splitSize的大小.
总结:如果想要多一点的map tasks,(1)可以设置dfs.block.size小一点,sequenceFile推荐2048。。。(试)在eclipse运行时,dfs.block.size是由eclipse中mapreduce的设置(dfs.block.size)生效的,而不是hadoop的conf中的配置文件,但是如果用终端hadoop jar命令跑的话,应该是由hadoop的conf中的配置文件决定生效的
(2)推荐: 可以分成多个sequenceFile来作为输入(把上层目录作为输入路径即可,上层目录下包括的必为清一色的sequenceFile),输入路径 "./"或指定上层目录文件名
reduce task的个数:
可通过job.setNumReduceTasks(n);设定。多个reduce task的话就会有多个reduce结果,part-r-00000, part-r-00001, ...part-r-0000n
- 增加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任务,从而提高负载均衡
由Hive来执行相关的查询
hadoop中默认的mapred.tasktracker.map.tasks.maximum设置是2
也即:每一个tasktracker同时运行的map任务数为2
照此默认设置,查询80天某用户的操作日志,耗时5mins, 45sec
经过测试,发现将mapred.tasktracker.map.tasks.maximum设置为节点的cpu cores数目或者数目减1比较合适
此时的运行效率最高,大概花费3mins, 25sec
我们现在的机器都是8核的,所以最终配置如下:
mapred.tasktracker.map.tasks.maximum
8
The maximum number of map tasks that will be run
simultaneously by a task tracker.
而对于mapred.map.tasks(每个job的map任务数)值,hadoop默认值也为2
可以在执行hive前,通过set mapred.map.tasks=24来设定
但由于使用hive,会操作多个input文件,所以hive默认会把map的任务数设置成输入的文件数目
即使你通过set设置了数目,也不起作用…
MapReduce Map数 reduce数设置的更多相关文章
- Hadoop 中关于 map,reduce 数量设置
map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务 ...
- Hadoop MapReduce概念学习系列之map并发任务数和reduce并发任务数的原理和代码实现(十八)
首先,来说的是,reduce并发任务数,默认是1. 即,在jps后,出现一个yarnchild.之后又消失. 这里,我控制reduce并发任务数6 有多少个reduce的并发任务数可以控制,但有多少个 ...
- Hadoop如何计算map数和reduce数
阅读本文可以带着下面问题: 1.map和reduce的数量过多会导致什么情况? 2.Reduce可以通过什么设置来增加任务个数? 3.一个task的map数量由谁来决定? 4.一个task的reduc ...
- 【转】hive优化之--控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...
- hive优化之------控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的 ...
- hive优化之——控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...
- Hive性能优化--map数和reduce数
转自http://superlxw1234.iteye.com/blog/1582880 一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多 ...
- Hive任务优化--控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
随机推荐
- C#_02.13_基础四_.NET方法
C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头 AND 方法 ...
- 【模拟】[NOIP2014]螺旋矩阵[c++]
题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
- c++中transform()函数和find()函数的使用方法。
1.transform函数的使用 transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内.transform函数包含在<algorithm>头文件中. 以下是s ...
- JavaAes加密操作工具类
package com.king.weixin.util;import java.io.UnsupportedEncodingException;import java.security.Algori ...
- CentOS7 使用yum命令安装Java SDK(openjdk)
CentOS 6.X 和 7.X 自带有OpenJDK runtime environment (openjdk).它是一个在linux上实现开源的java 平台. 安装方式: 1.输入以下命令,以 ...
- [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...
- gmock
https://www.cnblogs.com/welkinwalker/archive/2011/11/29/2267225.html http://www.cnblogs.com/jycboy/p ...
- linux性能压测工具
http://benjr.tw/532 http://blog.yufeng.info/archives/2023 https://www.cnblogs.com/zhoujinyi/archive/ ...
- PL/SQL学习笔记之事务
一:事务自动提交的开启与关闭 1)开启事务自动提交:则每一个INSERT,UPDATE或DELETE命令执行时,都提交一次事务. SET AUTOCOMMIT ON; 2)关闭事务自动提交:则执行到C ...
- NBU将RAC数据库恢复到单机
恢复的过程和(https://www.cnblogs.com/abclife/p/5687993.html)差不多.但是,具体过程有些不同.如果按照之前的恢复方式,在run语句中同时运行restore ...