1. public List<InputSplit> getSplits(JobContext job) throws IOException {
  2. long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
  3. long maxSize = getMaxSplitSize(job);
  4.  
  5. List splits = new ArrayList();
  6. List files = listStatus(job);
  7. for (FileStatus file : files) {
  8. Path path = file.getPath();
  9. long length = file.getLen();
  10. if (length != 0L) {
  11. FileSystem fs = path.getFileSystem(job.getConfiguration());
  12. BlockLocation[] blkLocations = fs.getFileBlockLocations(file,
  13. 0L, length);
  14. if (isSplitable(job, path)) {
  15. long blockSize = file.getBlockSize();
  16. long splitSize = computeSplitSize(blockSize, minSize,
  17. maxSize);
  18.  
  19. long bytesRemaining = length;
  20. while (bytesRemaining / splitSize > 1.1D) {
  21. int blkIndex = getBlockIndex(blkLocations, length
  22. - bytesRemaining);
  23. splits.add(makeSplit(path, length - bytesRemaining,
  24. splitSize, blkLocations[blkIndex].getHosts()));
  25.  
  26. bytesRemaining -= splitSize;
  27. }
  28.  
  29. if (bytesRemaining != 0L) {
  30. int blkIndex = getBlockIndex(blkLocations, length
  31. - bytesRemaining);
  32. splits.add(makeSplit(path, length - bytesRemaining,
  33. bytesRemaining,
  34. blkLocations[blkIndex].getHosts()));
  35. }
  36. } else {
  37. splits.add(makeSplit(path, 0L, length,
  38. blkLocations[0].getHosts()));
  39. }
  40. } else {
  41. splits.add(makeSplit(path, 0L, length, new String[0]));
  42. }
  43. }
  44.  
  45. job.getConfiguration().setLong(
  46. "mapreduce.input.fileinputformat.numinputfiles", files.size());
  47. LOG.debug("Total # of splits: " + splits.size());
  48. return splits;
  49. }

Yarn 下好像没了1*下的由用户设置预期的Map数

  1. 核心代码
  2.  
  3. long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
  4.  
  5. getFormatMinSplitSize 默认返回1getMinSplitSize 为用户设置的最小分片数, 如果用户设置的大于1,则为用户设置的最小分片数
  6. long maxSize = getMaxSplitSize(job);
  7.  
  8. getMaxSplitSize为用户设置的最大分片数,默认最大为9223372036854775807L
  9.  
  10. long splitSize = computeSplitSize(blockSize, minSize,
  11. maxSize);
  12.  
  13. protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
  14. return Math.max(minSize, Math.min(maxSize, blockSize));
  15. }

测试 文件大小 297M(311349250)

块大小128M

测试代码

测试1

FileInputFormat.setMinInputSplitSize(job, 301349250);
   FileInputFormat.setMaxInputSplitSize(job, 10000);

测试后Map个数为1,由上面分片公式算出分片大小为301349250, 比 311349250小, 理论应该为两个map,  再看分片函数

while (bytesRemaining / splitSize > 1.1D) {
                        int blkIndex = getBlockIndex(blkLocations, length
                                - bytesRemaining);
                        splits.add(makeSplit(path, length - bytesRemaining,
                                splitSize, blkLocations[blkIndex].getHosts()));

bytesRemaining -= splitSize;
                    }

只要剩余的文件大小不超过分片大小的1.1倍, 则会分到一个分片中,避免开两个MAP, 其中一个运行数据太小,浪费资源。

测试2

FileInputFormat.setMinInputSplitSize(job, 150*1024*1024);

FileInputFormat.setMaxInputSplitSize(job, 10000);

MAP 数为2

测试3

在原有的输入目录下,添加一个很小的文件,几K,测试是否会合并

FileInputFormat.setMinInputSplitSize(job, 150*1024*1024);
FileInputFormat.setMaxInputSplitSize(job, 10000);

Map数变为了3

看源代码

for (FileStatus file : files) {

..

}

原来输入是按照文件名来分片的,这个按照常理也能知道, 不同的文件内容格式不同

总结,分片过程大概为,先遍历目标文件,过滤部分不符合要求的文件, 然后添加到列表,然后按照文件名来切分分片 (大小为前面计算分片大小的公式, 最后有个文件尾可能合并,其实常写网络程序的都知道), 然后添加到分片列表,然后每个分片读取自身对应的部分给MAP处理

Yarn下Map数控制的更多相关文章

  1. 【转】hive优化之--控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...

  2. hive优化之------控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的 ...

  3. hive优化之——控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  4. Hive任务优化--控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  5. hive 的map数和reduce如何确定(转)

    转自博客:https://blog.csdn.net/u013385925/article/details/78245011(没找到原创者,该博客也是转发)   一.    控制hive任务中的map ...

  6. Hive性能优化--map数和reduce数

    转自http://superlxw1234.iteye.com/blog/1582880 一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多 ...

  7. Linux Shell多进程并发以及并发数控制

    1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...

  8. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  9. hive 处理小文件,减少map数

    1.hive.merge.mapfiles,True时会合并map输出.2.hive.merge.mapredfiles,True时会合并reduce输出.3.hive.merge.size.per. ...

随机推荐

  1. 转 使用utl_http获取某个http页面内容

    #########1.ACL详细解释: 11g 对于XDB  UTL_HTTP or others package 的权限管控进一步加强,如果需要使用到XDB 以下包 UTL_TCP, UTL_SMT ...

  2. JVM发展史和Java运行时内存区域

    目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...

  3. 数据库版本管理工具flyway

    引入flyway_core  jar包 java 代码实现 public class FlywayMigration { @Resource private DataSource dataSource ...

  4. SSM-@Transactional 注释不生效

    1.在applicationConext.xml 中配置事务注解驱动 <!-- 事务注解驱动 --> <tx:annotation-driven /> <!-- 配置事务 ...

  5. 你会用setTimeout吗

    定义很简单 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 广泛应用场景 定时器,轮播图,动画效果,自动滚动等等 上面一些应该是setTimeout在大家心中的样子,因为我们 ...

  6. SEO--HTML meta标签总结

    <!DOCTYPE html> <!-- 使用html5 doctype,不区分大小写--> <html lang="zh-CN"> <h ...

  7. JavaFX--第3天窗口布局

    1.windows之间的交互 2.关闭程序 3.布局镶嵌 1.windows之间的交互 我们要实现“确定”.“取消”之类的功能:就像我们平时使用Word的时候要关闭会提示要不要保存的信息. 步骤如下: ...

  8. 【转】js弹出框、对话框、提示框、弹窗总结

    js弹出框.对话框.提示框.弹窗总结 一.js的三种最常见的对话框 //====================== JS最常用三种弹出对话框 ======================== //弹 ...

  9. grep和管道

    1.管道命令: 可以连接多个Linux命令 命令1 | 命令2 | 命令3 2.grep  正则表达式  从文件或者字符串中搜索字符串 格式:grep  ‘’  file 返回符合规则的行 需求:查询 ...

  10. springboot整合mybatis+oracle

    第一步 认识springboot :springboot是为了解决配置文件多,各个组件不统一的问题,它省去了很多配置文件,同时实现了spring产品的整合. 创建springboot项目:通过选择sp ...