当前位置: 首页 > news >正文

Hadoop如何计算map数和reduce数

Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数。首先分析一下job的maptask数,当一个job提交时,jobclient首先分析job被拆分的split数量,然后吧job.split文件放置在HDFS中,一个job的MapTask数量就等于split的个数。

job.split中包含split的个数由FileInputFormat.getSplits计算出,方法的逻辑如下:

1.  读取参数mapred.map.tasks,这个参数默认设置为0,生产系统中很少修改。

2.  计算input文件的总字节数,总字节数/(mapred.map.tasks==0 ? 1: mapred.map.tasks )=goalsize

3.  每个split的最小值minSize由mapred.min.split.size参数设置,这个参数默认设置为0,生产系统中很少修改。

4.  调用computeSplitSize方法,计算出splitsize= Math.max(minSize, Math.min(goalSize, blockSize)),通常这个值=blockSize,输入的文件较小,文件字节数之和小于blocksize时,splitsize=输入文件字节数之和。

5.  对于input的每个文件,计算split的个数。

a)  文件大小/splitsize>1.1,创建一个split,这个split的字节数=splitsize,文件剩余字节数=文件大小-splitsize

b)  文件剩余字节数/splitsize<1.1,剩余的部分作为一个split

举例说明:

1.  input只有一个文件,大小为100M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为36M

2.  input只有一个文件,大小为65M,splitsize=blocksize,则split数为1,split大小为65M

3.  input只有一个文件,大小为129M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为65M(最后一个split的大小可能超过splitsize)

4.  input只有一个文件,大小为20M ,splitsize=blocksize,则split数为1,split大小为20M

5.  input有两个文件,大小为100M和20M,splitsize=blocksize,则split数为3,第一个文件分为两个split,第一个split为64M,第二个为36M,第二个文件为一个split,大小为20M

6.  input有两个文件,大小为25M和20M,splitsize=blocksize,则split数为2,第一个文件为一个split,大小为25M,第二个文件为一个split,大小为20M

假设一个job的input大小固定为100M,当只包含一个文件时,split个数为2,maptask数为2,但当包含10个10M的文件时,maptask数为10。


下面来分析reducetask,纯粹的mapreduce task的reduce task数很简单,就是参数mapred.reduce.tasks的值,hadoop-site.xml文件中和mapreduce job运行时不设置的话默认为1。

在HIVE中运行sql的情况又不同,hive会估算reduce task的数量,估算方法如下:

通常是ceil(input文件大小/1024*1024*1024),每1GB大小的输入文件对应一个reduce task。

特殊的情况是当sql只查询count(*)时,reduce task数被设置成1。


总结:通过map和reducetask数量的分析可以看出,hadoop/hive估算的map和reduce task数可能和实际情况相差甚远。假定某个job的input数据量庞大,reduce task数量也会随之变大,而通过join和group by,实际output的数据可能不多,但reduce会输出大量的小文件,这个job的下游任务将会启动同样多的map来处理前面reduce产生的大量文件。在生产环境中每个user group有一个map task数的限额,一个job启动大量的map task很显然会造成其他job等待释放资源。

Hive对于上面描述的情况有一种补救措施,参数hive.merge.smallfiles.avgsize控制hive对output小文件的合并,当hiveoutput的文件的平均大小小于hive.merge.smallfiles.avgsize-默认为16MB左右,hive启动一个附加的mapreducejob合并小文件,合并后文件大小不超过hive.merge.size.per.task-默认为256MB。

尽管Hive可以启动小文件合并的过程,但会消耗掉额外的计算资源,控制单个reduce task的输出大小>64MB才是最好的解决办法。

map数据计算示例:

hive> set dfs.block.size;
dfs.block.size=268435456
hive> set mapred.map.tasks;
mapred.map.tasks=2

文件块大小为256MB,map.tasks为2

查看文件大小和文件数:
[dwapp@dw-yuntigw-63 hadoop]$ hadoop dfs -ls /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25;
Found 18 items
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290700555 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000000_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290695945 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000001_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290182606 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000002_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  271979933 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000003_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258448208 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000004_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258440338 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000005_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258419852 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000006_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258347423 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000007_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258349480 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000008_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258301657 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000009_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258270954 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000010_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258266805 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000011_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258253133 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000012_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258236047 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000013_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258239072 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000014_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258170671 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000015_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258160711 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000016_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258085783 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000017_0

文件:大小Bytes大小MB splitsize(MB)每个文件需要的map数量
文件1290700555277.2336531 2561.082943957
文件2290695945277.2292566 2561.082926784
文件3290182606276.7396984 2561.081014447
文件4271979933259.3802767 2561.013204206
文件5258448208246.4754181 2560.962794602
文件6258440338246.4679127 2560.962765284
文件7258419852246.4483757 2560.962688968
文件8258347423246.379302 2560.962419149
文件9258349480246.3812637 2560.962426811
文件10258301657246.3356562 2560.962248657
文件11258270954246.3063755 2560.962134279
文件12258266805246.3024187 2560.962118823
文件13258253133246.2893801 2560.962067891
文件14258236047246.2730856 2560.962004241
文件15258239072246.2759705 2560.96201551
文件16258170671246.2107382 2560.961760696
文件17258160711246.2012396 2560.961723592
文件18258085783246.1297827 2560.961444464
总文件大小:47595491734539.059804   


goalSize = 4539.059804 (文件总大小)/ mapred.map.tasks(2) = 2269.529902MB

因此splitsize取值为256MB,所以一共分配18个map。

修改map.tasks参数为32
set mapred.map.tasks = 32;

文件:大小Bytes大小MB splitsize(MB)每个文件需要的map数量
文件1290700555277.2336531 141.81.955103336
文件2290695945277.2292566 141.81.955072332
文件3290182606276.7396984 141.81.951619876
文件4271979933259.3802767 141.81.829198002
文件5258448208246.4754181 141.81.738190537
文件6258440338246.4679127 141.81.738137607
文件7258419852246.4483757 141.81.737999829
文件8258347423246.379302 141.81.737512708
文件9258349480246.3812637 141.81.737526543
文件10258301657246.3356562 141.81.737204909
文件11258270954246.3063755 141.81.736998417
文件12258266805246.3024187 141.81.736970513
文件13258253133246.2893801 141.81.736878562
文件14258236047246.2730856 141.81.73676365
文件15258239072246.2759705 141.81.736783995
文件16258170671246.2107382 141.81.736323965
文件17258160711246.2012396 141.81.736256979
文件18258085783246.1297827 141.81.735753051
总文件大小:47595491734539.059804   


goalSize = 4539.059804 / mapred.map.tasks(32)  = 141.8456189

因此splitsize取值为141.8MB,所以一共分配36个map。


相关文章:

  • hive源码解析(1)之hive执行过程
  • java面试(五)
  • hive源码解析(2)之编译前序
  • eCharts.js使用心得
  • ABAP POH和POV事件中 获得屏幕字段的值
  • Hive优化(2)之系统评估reduce数为1的MR Job优化
  • RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载
  • hive中间接实现不等值连接
  • python之字符编码
  • Hadoop计算文件大小
  • 在Oracle中利用SQL_TRACE跟踪SQL的执行
  • Linux添加/删除用户和用户组
  • Hive优化(3)之随机数避免数据倾斜
  • Angular2学习(一)
  • hive优化(4)之mapjoin和union all避免数据倾斜
  • Apache的基本使用
  • Debian下无root权限使用Python访问Oracle
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • leetcode98. Validate Binary Search Tree
  • Swift 中的尾递归和蹦床
  • ------- 计算机网络基础
  • 今年的LC3大会没了?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 聊一聊前端的监控
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端攻城师
  • 使用SAX解析XML
  • 新书推荐|Windows黑客编程技术详解
  • 再谈express与koa的对比
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #vue3 实现前端下载excel文件模板功能
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C)一些题4
  • (Python第六天)文件处理
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (九)c52学习之旅-定时器
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (五)Python 垃圾回收机制
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)平衡树
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET的数据绑定
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .stream().map与.stream().flatMap的使用
  • @RequestBody与@ModelAttribute
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [Android Studio 权威教程]断点调试和高级调试
  • [android学习笔记]学习jni编程
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法