MapReduce学习(3)

map函数的参数
  Mapper接口是一个泛型类型,它有四个形参类型,分别指定map函数的输入键,输入值,输出键和输出值得类型。
  输入键是一个长整型偏移量(文件中的行偏移量,该行起始位置相对于文件起始位置的偏移量),输入值则是读取的数据,输出键和输出值和reduce函数的输入相对应。

reduce函数的参数
  Reduce函数也有四个形式参数类型用于指定其输入和输出类型。reduce函数的输入类型必须与map函数的输出类型相匹配。

InputSplit
  一个输入分片(split)就是由单个map处理的输入块。每一个map操作只处理一个输入分片。每个分片被划分为若干个记录,每条记录就是一个键/值对,map一个接一个处理每条记录。
  输入分片和记录都是逻辑的,不必将它们对应到文件,虽然常见的形式都是文件。在数据库场景中,一个输入分片可以对应于一个表上的若干行,而一条记录对应到一行(DBInputFormat正是这么做的,它这种输入格式用于从关系数据库读取数据)
  输入分片在Java中被表示为InputSplit接口。

  InputSplit包含一个以字节为单位的长度和一组存储位置(即一组主机名)。注意,一个分片并不包含数据本身,而是指向数据的引用(reference)。存储位置共MapReduce系统使用以便将map任务尽量放在分片数据附近,而长度用来排序分片,以便优先处理最大的分片,从而最小化作业运行时间(这也是贪婪近似算法的一个实例)
  MapReduce应用开发人员并不需要直接处理InputSplit,因为它是由InputFormat创建的。InputFormat负责产生输入分片并将它们分割成记录。

输入分片传递给map函数的过程
  jobClient调用getSplits()方法,以期望的map任务数numSplits作为参数传入,这个参数将作为一个参考值,因为InputFormat实现可以自由地返回另一个不同于numSplits指定值的分片数。在计算好分片数后,客户端将它们发送到jobtracker,jobtracker便使用其存储位置信息来调度map任务从而在tasktracker上处理这些分片数据。在tasktrack上,map任务把输入分片传给InputFormat的getRecordReader()方法来获得这个分片的RecordReader。RecordReader基本就是记录上的迭代器,map任务用一个RecordReader来生成记录的键/值对,然后再传递给map函数。

FileInputFormat类
  FileInputFormat是所有使用文件作为其数据源的InputFormat实现的基类。它提供了两个功能:一个定义哪些文件包含在一个作业的输入中;一个为输入文件生成分片的实现。把分片分割成记录的作业由其子类来完成。
  作业的输入被设定为一组路径,这对限定作业输入提供了极大的灵活性。FileInputFormat提供了四种静态方法来设定JobConf的输入路径。

  其中,addInputPath()和addInputPaths()方法可以将一个或多个路径加入路径列表。这两个方法可以重复调用来建立路径列表。setInputPaths()方法一次设定完整的路径列表(替换前面调用所设置的任意路径)

InputFormat类的层次结构:

OutputFormat类的层次结构:

参考文献:Hadoop权威指南(第2版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值