MapReduce 框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,如果有大量小文件,就会产生大量的 MapTask,处理小文件效率非常低。

CombineTextInputFormat:用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。

  1. CombineTextInputFormat 切片机制过程包括:虚拟存储过程和切片过程二部分
  2.  
  3. 假设 setMaxInputSplitSize 值为 4M,有如下四个文件
  4. a.txt 1.7M
  5. b.txt 5.1M
  6. c.txt 3.4M
  7. d.txt 6.8M
  8.  
  9. 1)虚拟存储过程
  10. 1.1)将输入目录下所有文件大小,依次和设置的 setMaxInputSplitSize 值比较,如果不大于设置的最大值,逻辑上划分一个块。
    1.2)如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块,当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
  11. 1.7M < 4M 划分一块
  12. 5.1M > 4M 但是小于 2*4M 划分二块:块1=2.55M,块2=2.55M
  13. 3.4M < 4M 划分一块
  14. 6.8M > 4M 但是小于 2*4M 划分二块:块1=3.4M,块2=3.4M
  15. 最终存储的文件:
  16. 1.7M
  17. 2.55M2.55M
  18. 3.4M
  19. 3.4M3.4M
  20.  
  21. 2)切片过程
  22. 2.1)判断虚拟存储的文件大小是否大于 setlMaxIputSplitSize 值,大于等于则单独形成一个切片。
  23. 2.2)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
  24. 最终会形成3个切片:
  25. 1.7+2.55M,(2.55+3.4M,(34+3.4M

测试读取数据的方式

控制台日志

可以看到读取方式与 TextInputFormat  一样,k 为偏移量,v 为一行的值,按行读取

以 WordCount 为例进行测试,测试切片数

测试数据

测试代码

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.Path;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Job;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. import org.apache.hadoop.mapreduce.Reducer;
  8. import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  10. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  11. import org.apache.log4j.BasicConfigurator;
  12.  
  13. import java.io.IOException;
  14. import java.util.StringTokenizer;
  15.  
  16. public class WordCount {
  17.  
  18. static {
  19. try {
  20. // 设置 HADOOP_HOME 环境变量
  21. System.setProperty("hadoop.home.dir", "D:/DevelopTools/hadoop-2.9.2/");
  22. // 日志初始化
  23. BasicConfigurator.configure();
  24. // 加载库文件
  25. System.load("D:/DevelopTools/hadoop-2.9.2/bin/hadoop.dll");
  26. } catch (UnsatisfiedLinkError e) {
  27. System.err.println("Native code library failed to load.\n" + e);
  28. System.exit(1);
  29. }
  30. }
  31.  
  32. public static void main(String[] args) throws Exception {
  33. args = new String[]{"D:\\tmp\\input", "D:\\tmp\\456"};
  34. Configuration conf = new Configuration();
  35. Job job = Job.getInstance(conf, "word count");
  36. job.setJarByClass(WordCount.class);
  37.  
  38. job.setMapperClass(TokenizerMapper.class);
  39. job.setCombinerClass(IntSumReducer.class);
  40. job.setReducerClass(IntSumReducer.class);
  41.  
  42. job.setOutputKeyClass(Text.class);
  43. job.setOutputValueClass(IntWritable.class);
  44.  
  45. // 设置 InputFormat,默认为 TextInputFormat.class
  46. job.setInputFormatClass(CombineTextInputFormat.class);
  47. // 设置最大值即可 128M
  48. CombineTextInputFormat.setMaxInputSplitSize(job, 1024 * 1024 * 128);
  49.  
  50. FileInputFormat.addInputPath(job, new Path(args[0]));
  51. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  52. System.exit(job.waitForCompletion(true) ? 0 : 1);
  53. }
  54.  
  55. public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
  56. private final static IntWritable one = new IntWritable(1);
  57. private Text word = new Text();
  58.  
  59. @Override
  60. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  61. // 查看 k-v
  62. // System.out.println(key + "\t" + value);
  63. StringTokenizer itr = new StringTokenizer(value.toString());
  64. while (itr.hasMoreTokens()) {
  65. word.set(itr.nextToken());
  66. context.write(word, one);
  67. }
  68. }
  69. }
  70.  
  71. public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  72. private IntWritable result = new IntWritable();
  73.  
  74. @Override
  75. public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  76. int sum = 0;
  77. for (IntWritable val : values) {
  78. sum += val.get();
  79. }
  80. result.set(sum);
  81. context.write(key, result);
  82. }
  83. }
  84. }

由于所有文件加起来大小都没有 128M,所以切片数为 1

MapReduce-CombineTextInputFormat 切片机制的更多相关文章

  1. Hadoop(14)-MapReduce框架原理-切片机制

    1.FileInputFormat切片机制 切片机制 比如一个文件夹下有5个小文件,切片时会切5个片,而不是一个片 案例分析 2.FileInputFormat切片大小的参数配置 源码中计算切片大小的 ...

  2. MapReduce-TextInputFormat 切片机制

    MapReduce 默认使用 TextInputFormat 进行切片,其机制如下 (1)简单地按照文件的内容长度进行切片 (2)切片大小,默认等于Block大小,可单独设置 (3)切片时不考虑数据集 ...

  3. 【大数据】MapTask并行度和切片机制

    一. MapTask并行度决定机制 maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度 那么,mapTask并行实例是否越多越好呢?其并行度又是如何决定呢? 1.1 ...

  4. MapReduce中作业调度机制

    MapReduce中作业调度机制主要有3种: 1.先入先出FIFO      Hadoop 中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业. 2.公平调度器(相当于时间 ...

  5. 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第十一讲Hadoop图文训练课程:MapReduce的原理机制和流程图剖析

    这一讲我们主要剖析MapReduce的原理机制和流程. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发 ...

  6. 经典MapReduce作业和Yarn上MapReduce作业运行机制

    一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...

  7. MapReduce 切片机制源码分析

    总体来说大概有以下2个大的步骤 1.连接集群(yarnrunner或者是localjobrunner) 2.submitter.submitJobInternal()在该方法中会创建提交路径,计算切片 ...

  8. Hadoop(17)-MapReduce框架原理-MapReduce流程,Shuffle机制,Partition分区

    MapReduce工作流程 1.准备待处理文件 2.job提交前生成一个处理规划 3.将切片信息job.split,配置信息job.xml和我们自己写的jar包交给yarn 4.yarn根据切片规划计 ...

  9. hadoop MapReduce Yarn运行机制

    原 Hadoop MapReduce 框架的问题 原hadoop的MapReduce框架图 从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路: 首先用户程序 (JobClient) ...

随机推荐

  1. 如何做好SQLite 使用质量检测,让事故消灭在摇篮里

    本文由云+社区发表 SQLite 在移动端开发中广泛使用,其使用质量直接影响到产品的体验. 常见的 SQLite 质量监控一般都是依赖上线后反馈的机制,比如耗时监控或者用户反馈.这种方式问题是: 事后 ...

  2. 原 js实现数据持久化

    在写js事件时,常常遇到点击一个事件,然后在若干时间以后需要知道最近一次点击的事件的结点.比如这里: 我点击树节点1,再点击tab2,然后我再来回切换tab,假如最后一次点击tab时在tab2上,这时 ...

  3. Git 密钥对处理

    生成密钥对: ssh-keygen -t rsa cd .ssh ls      id_rsa          私钥      id_rsa.pub   公钥

  4. liteos简介(一)

    LiteOS是在2015华为网络大会上华为发布的敏捷网络3.0中的一个轻量级的物联网操作系统,LiteOS体积只有10KB级. 在Hi3559A中,liteos是用于Cortex-A53,用于处理MP ...

  5. 随机IP

    function rand_ip(){ $ip_longs = array( array('607649792', '608174079'),        //36.56.0.0-36.63.255 ...

  6. url获取整理

    $_SERVER['DOCUMENT_ROOT'];   //网站的根目录 echo $_SERVER['SERVER_NAME']; //当前的服务器域名 echo $_SERVER['HTTP_H ...

  7. Webstorm 2018 激活破解

    本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...

  8. 【Linux基础】Linux命令date 日期时间

    1.显示到纳秒 date +%F.%H:%M:%S.%N --:38.740127086 date +%Y-%m-%d.%H:%M:%S.%N2019-04-25.00:28:24.060756673 ...

  9. git常用命令说明教程

    git常用命令说明教程 git介绍 是一个分布式的,版本控制软件.每台使用git的电脑都是一个分版本库.svn是集中管理的. 安装git 一 git相关操作 1.官网下载最新版安装https://gi ...

  10. Linux:Day17(下) openssl

    Linux Services and Security OpenSSL OpenSSH dns:bind web:http,httpd(apache),php,mariadb(mysql) lamp ...