文章目录

  • 1. 祝大家中秋节快乐
  • 2. MapReduce进阶
    • 2.1 MapReduce类型
    • 2.2 MapReduce输入格式
      • 2.2.1 InputFormat接口
      • 2.2.2 InputFormat接口的实现类
    • 2.3 MapReduce输出格式
      • 2.3.1 OutputFormat接口
      • 2.3.2 OutputFormat接口的实现类
  • 3. 小结

1. 祝大家中秋节快乐

身在长安,心在泰安,又是一年中秋佳节,相思之情,溢于言表。现留杜甫一诗与大家共勉。
今夜鄜州月,闺中只独看。
遥怜小儿女,未解忆长安。
香雾云鬟湿,清辉玉臂寒。
何时倚虚幌,双照泪痕干。

2. MapReduce进阶

2.1 MapReduce类型

  1. 输入数据类型由输入格式(InputFormat)设置,比如:TextInputFormat的Key类型为LongWritable,Value的类型是Text。
  2. map函数输出的Key类型通过setMapOutputKeyClass设置,Value类型通过setMapOutputKeyClass设置。
  3. reduce的输出的Key类型通过setOutputKeyClass设置,Value类型通过setOutputValueClass设置。

2.2 MapReduce输入格式

2.2.1 InputFormat接口

InputFormat类定义了如何分割和读取输入文件,它提供了以下功能:

  1. 选择作为输入的文件或对象。
  2. 定义把文件划分到任务的InputSplits。
  3. 为RecordReader读取文件提供一个工厂方法。
    InputFormat接口包含了以下两种方法:
 public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException;public abstract RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context) throws IOException, InterruptedException;

方法说明

getSplits(JobContext context)方法负责将一个大数据逻辑分成许多片,比如数据库表有100条数据,按照主键ID升序存储,假设每20条分成一片,这个List的大小就是5,然后每个InputSplit记录两个参数,第一个为这个分片的起始ID,第二个为这个分片数据的大小,这里是20。很明显InputSplit并没有真正存储数据,只是提供了一个如何将数据分片的方法。

createRecordReader方法,根据定义,返回一个能够读取分片记录的RecordReader。getSplit用来获取由输入文件计算出来的InputSplit,后面计算InputSplit时,会考虑输入文件是否可分割、文件存储时分块的大小和文件大小等因素;而createRecordReader()方法提供了RecordReader的实现,将key-value对从InputSplit中正确读出来,比如LineRecordReader,它是以偏移值为Key,每行的数据为Value,这使所有createRecordReader()返回LineRecordReader的InputFormat都是以偏移值为Key、每行数据为Value的形式读取输入分片的。

2.2.2 InputFormat接口的实现类

InputFormat接口实现类有很多,其层次结构如下所示:

常用的实现类介绍:

  1. FileInputFormat
    FileInputFormat是所有使用文件作为其数据源的InputFormat实现的基类,它的主要作用是指出作业的输入文件位置。因为作业的输入被设定为一组路径,这对指定作业输入提供了很强的灵活性。FileInputFormat提供了四种静态方法来设定作业的输入路径:
public static void addInputPaths(Job job, String commaSeparatedPaths)
public static void addInputPath(Job job, Path path)
public static void setInputPaths(Job job, Path... inputPaths)
public static void setInputPaths(Job job, String commaSeparatedPaths)
  1. KeyValueTextInputFormat
    每一行均为一条记录,被分隔符(缺省是tab)分割为key(Text),value(Text),当然分隔符可以自己设定。
  2. TextInputFormat
    默认的输入格式是TextInputFormat,它把输入文件每一行作为单独的一个记录,但不做解析处理,这对那些没有被格式化的数据或是基于行的记录来说是很有用的,比如日志文件。

2.3 MapReduce输出格式

2.3.1 OutputFormat接口

OutputFormat接口主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。其功能与前面描述的InputFormat相似,Hadoop提供的OutputFormat实例会把文件写在本地磁盘或HDFS上。每一个reducer会把结果输出写在公共文件夹中一个单独的文件内。这些文件一般命名为:part-xxxxx,而xxxxx是关联到某个reduce任务的partition的id。

2.3.2 OutputFormat接口的实现类

下图为OutputFormat接口的实现类层次图:
常用的OutputFormat实现类的介绍:

  1. 文本输出
    默认的输出格式是TextOutputFormat,它把每条记录写为文本行。它的键和值可以实现Writable的任意类型,因为TextOutputFormat调用toString()方法把他们转换为字符串。每一个key/value键值对都以制表符为分隔符,当然也可以自行设定(mapreduce.output.textoutputfomat.separator),与FileOutputFormat对应的输入格式是KeyValueTextInputFormat,它可以通过配置分隔符将key/value进行文本分割。
    同时,可以使用NullWritable来省略输出的key或value,或者两个都省略,相当于NullOutputFormat的输出格式,这也会导致无分隔符的输出,以使输出适合用TextInputFormat读取。
  2. 二进制输出
    SequenceFileOutputFormat将它的输出写为一个顺序文件。如果输出需要作为后续的MapReduce任务的输入,这便是一种合适的输出格式,可以通过快速的序列化任意的数据类型到文件中,而对应SequenceFileInputFormat则会把文件反序列化为相同类型并提交到下一个Mapper的输入数据。

3. 小结

下期预告以及下下期预告:

  1. Combiner详细解析及操作
  2. Partitioner详细解析及操作
  3. RecordReader详细解析及操作

MapReduce之InputFormat、OutputFormat(三)相关推荐

  1. MapReduce之InputFormat理解

    一 InputFormat主要作用: #验证job的输入规范 #对输入的文件进行切分,形成多个InputSplit文件,每一个InputSplit对应着一个map任务 #创建RecordReader, ...

  2. Hadoop系列之InputFormat,OutputFormat用法

    首先看下InputFormat接口的代码 public interface InputFormat<K, V> {InputSplit[] getSplits(JobConf var1, ...

  3. 大数据基础之Hadoop(三)—— MapReduce

    作者:duktig 博客:https://duktig.cn (文章首发) 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本篇文章源码参看:https://github.com/duktig666/b ...

  4. mapreduce工作流程_详解MapReduce中的五大编程模型

    前言 我们上一节讲了关于 MapReduce 中的应用场景和架构分析,最后还使用了一个CountWord的Demo来进行演示,关于MapReduce的具体操作.如果还不了解的朋友可以看看上篇文章:[初 ...

  5. Hadoop集群搭建及MapReduce应用

    一.Hadoop集群的搭建与配置 1.节点准备 集群规划: 主机名 IP 安装的软件 运行的进程 weekend 01 192.168.1.60 jdk.hadoop NameNode.DFSZKFa ...

  6. 《OD大数据实战》MapReduce实战

    一.github使用手册 1. 我也用github(2)--关联本地工程到github 2. Git错误non-fast-forward后的冲突解决 3. Git中从远程的分支获取最新的版本到本地 4 ...

  7. hadoop之MapReduce学习教程

    hadoop之MapReduce学习 MapReduce概述 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发"基于Hadoop的数据分析应用" ...

  8. hadoop之mapreduce教程+案例学习(二)

    第3章 MapReduce框架原理 目录 第3章 MapReduce框架原理 3.1 InputFormat数据输入 3.1.1 切片与MapTask并行度决定机制 3.1.2 Job提交流程源码和切 ...

  9. Hadoop分布式计算框架MapReduce

    一.MapReduce概述 &源自于Google的MapReduce论文,论文发表于2004年12月 &Hadoop MapReduce是Google MapReduce的克隆版 &a ...

最新文章

  1. 您也使用托管C++吗?
  2. swift_015(Swift 的函数)
  3. mysql嵌套实战_艰难的mysql嵌套表结果挑战
  4. 读书越多会越孤独吗?
  5. Linux系统中df与du命令查看分区大小
  6. 她被“誉为”中科院最美女院士,52岁依然貌美如花?气质不输女星
  7. 常见特征检测算法介绍
  8. centos 删除crontab_Centos7 利用crontab定时执行任务及配置方法
  9. c#winform窗口页面一打开就加载的方法
  10. 终结篇—用BAT文件删除远程主机系统垃圾文件的方法
  11. 推荐16个国外的源码下载网站
  12. ligerui联动清空控件值
  13. 当年我们一起追过的Java,Java SE 个人笔记
  14. 圣诞节来了,用Python Turtle画棵圣诞树吧
  15. 惠普1005w打印机使用说明书_首款能充粉的打印机来了 惠普1005w一体机评测
  16. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
  17. MATLAB中的矩阵乘法与实际矩阵乘法的差异
  18. 谷歌浏览器计算机给我们的启示
  19. myeclipse 2017 ci 10 破解包+教程(亲测已成功)
  20. H5 通用收银台实战总结

热门文章

  1. catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
  2. 3D游戏建模新手入门到就业,高效学习的十二个步骤
  3. 英文字母字符简便替换法
  4. Python XML文件快速排版
  5. Kubernetes如何被应用在华为
  6. Android攻城狮OptionsMenu
  7. office2007word不能插入页码解决办法
  8. 污水处理设备:生物技术如何处理畜禽养殖污水?
  9. 如何让iPad浏览器不再拒绝访问请求
  10. 第三章 坐标系与投影转换之基准面和坐标系的分类基本知识