1. TextInputFortmat

TextInputFormat是默认的InputFormat。每条记录是一行输入。Key是LongWritable类型,存储该行在整个文件中的字节偏移量(不是行数),值是这行的内容,为一个Text对象。

例如输入文件为:

grunt> cat test2

12,e21,ddwq,dqw,dwqw

sfd,cda,cdsz,cdwq,qwe

12,cds,fwa,feacd,cadfa

21ede,cdsf,ca,fa,dcac

caewf,ea,cdadc,acds,acsd

12e,afs,afesd,caefd,cawc

cax,cafe,caefe,fea,ceaef

在使用默认的 Map处理后输出:

grunt> cat out

0   12,e21,ddwq,dqw,dwqw

21  sfd,cda,cdsz,cdwq,qwe

43  12,cds,fwa,feacd,cadfa

66  21ede,cdsf,ca,fa,dcac

88  caewf,ea,cdadc,acds,acsd

113 12e,afs,afesd,caefd,cawc

138  cax,cafe,caefe,fea,ceaef

可以看到Key的值并不是行数,而是字节在文件中的偏移量。一般情况下,很难获取到文件的行号,因为文件是按字节切分为分片,而不是按行切分。

在按行读文本的情况下,可能会存在超长行的情况。超长行会导致内存溢出,可以通过设置 mapreduce.input.linerecordreader.line.maxlength,指定一个最长行的字节数(在内存范围内),可以确保 recordreader 跳过超长行。

2. KeyValueTextInputFormat

TextInputFormat 将文件中的行作为Key,每行对应的文本作为Value。但是对于某些文件内容已经是 Key-Value 形式的话,使用 TextInputFormat 会显得多次一举。在这种情况下,我们可以使用KeyValueTextInputFormat,它以某个分隔符进行分割(默认为制表符):

public KeyValueLineRecordReader(Configuration conf) throws IOException {
    String sepStr = conf.get("mapreduce.input.keyvaluelinerecordreader.key.value.separator", "\t");
    this.separator = (byte)sepStr.charAt(0);
}

一个范例如下,使用逗号为分隔符:

grunt> cat test2

12,e21,ddwq,dqw,dwqw

sfd,cda,cdsz,cdwq,qwe

12,cds,fwa,feacd,cadfa

21ede,cdsf,ca,fa,dcac

输出为:

grunt> cat out

12  cds,fwa,feacd,cadfa

12  e21,ddwq,dqw,dwqw

12e afs,afesd,caefd,cawc

21ede   cdsf,ca,fa,dcac

在任务设置中需要做的配置如下:

Configuration conf = new Configuration();
conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ",");
job.setInputFormatClass(org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat.class);

3. NLineInputFormat

在使用TextInputFormat和KeyValueInputFormat 时,每个mapper 收到的行数取决于输入的分片大小以及行的长度。如果希望 mapper 收到固定行的输入,则需要使用 NLineInputFormat。与 TextInputFormat一样,key是文件中的字节偏移量,值是行本身。

N是每个mapper收到的输入行数。N设置为1时(默认),每个mapper正好收到一行输入。同样使用之前的一共7行输入,使用NLineInputFormat:

job.setInputFormatClass(org.apache.hadoop.mapreduce.lib.input.NLineInputFormat.class);

grunt> cat out

0   12,e21,ddwq,dqw,dwqw

21  sfd,cda,cdsz,cdwq,qwe

43   12,cds,fwa,feacd,cadfa

查看此任务的相关指标,可以看到:

Job Counters

Launched map tasks=7

Launched reduce tasks=1

Other local map tasks=7

Mapper数一共有7个,也就是每行均生成了一个Map。可以通过设置以下参数指定NLine为多少行:

mapreduce.input.lineinputformat.linespermap

References: Hadoop权威指南第四版

Hadoop TextInputFormat的更多相关文章

  1. Hadoop TextInputFormat源码分析

    from:http://blog.csdn.net/lzm1340458776/article/details/42707047 InputFormat主要用于描述输入数据的格式(我们只分析新API, ...

  2. hadoop可能遇到的问题

    1.hadoop运行的原理? 2.mapreduce的原理? 3.HDFS存储的机制? 4.举一个简单的例子说明mapreduce是怎么来运行的 ? 5.面试的人给你出一些问题,让你用mapreduc ...

  3. hadoop面试时可能遇到的问题

    面试hadoop可能被问到的问题,你能回答出几个 ? 1.hadoop运行的原理? 2.mapreduce的原理? 3.HDFS存储的机制? 4.举一个简单的例子说明mapreduce是怎么来运行的 ...

  4. hadoop+海量数据面试题汇总(一)

    hadoop面试题 Q1. Name the most common InputFormats defined in Hadoop? Which one is default ? Following  ...

  5. Hadoop就业面试题

    ----------------------------------------------------------------------------- [申明:资料来源于互联网] 本文链接:htt ...

  6. Tachyon在Spark中的作用(Tachyon: Reliable, Memory Speed Storage for Cluster Computing Frameworks 论文阅读翻译)

    摘要:         Tachyon是一种分布式文件系统,能够借助集群计算框架使得数据以内存的速度进行共享.当今的缓存技术优化了read过程,可是,write过程由于须要容错机制,就须要通过网络或者 ...

  7. Hadoop源码解析之: TextInputFormat如何处理跨split的行

    我们知道hadoop将数据给到map进行处理前会使用InputFormat对数据进行两方面的预处理: 对输入数据进行切分,生成一组split,一个split会分发给一个mapper进行处理. 针对每个 ...

  8. Hadoop学习之TextInputFormat分片逻辑探究

    期望 顺着上一篇文章<Hadoop学习之第一个MapReduce程序>中遗留的分片疑惑,探究TextInputFormat的分片逻辑. 第一步 上Apache官网下载实验所使用的Hadoo ...

  9. [Hadoop in Action] 第7章 细则手册

    向任务传递定制参数 获取任务待定的信息 生成多个输出 与关系数据库交互 让输出做全局排序   1.向任务传递作业定制的参数        在编写Mapper和Reducer时,通常会想让一些地方可以配 ...

随机推荐

  1. openlayers按坐标点播放

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. RocketMQ解决幂等性问题

    一.造成重复消费的原因 在于回馈机制.正常情况下,消费者在消费消息时候,消费完毕后,会发送一个ACK确认信息给消息队列(broker),消息队列(broker)就知道该消息被消费了,就会将该消息从消息 ...

  3. GaussDB T 单机模式手工建库

    目录 你需要知道的 创建文件夹 编辑参数文件 将数据库启动到 NOMOUNT 状态 连接实例查询状态 创建数据库PROD1 如何连接原来 GAUSS 数据库 相关文章 GaussDB T 单机搭建 G ...

  4. 1级搭建类106-Oracle 19c 单实例 FS(华为云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  5. set类型的应用场景 —— Redis实战经验

    set类型是string类型的集合,其特点是集合元素无序且不重复,每个集合最多可以存储 232 - 1 个元素(40多亿),set类型主要有以下应用场景. 1. 好友/关注/粉丝/感兴趣的人集合 se ...

  6. Typecho的卡哇伊小猫咪小插件(Live2D猫咪插件)

    之前看到一个博客,被它博客上的动态小猫咪给吸引了,这个纯粹就是一个在线撸猫的神器啊.但是在网上寻找一番,并没有找到合适的插件,或者说没有找到合适的模型,因此无奈之后,只能向该博主请教,在它写的博客上, ...

  7. BZOJ 2467: [中山市选2010]生成树

    有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的 ...

  8. 重新机兵回归(MMR)

    重新机兵回归记录 S/L法 Save / Load 法 . 在关键战斗前,先save一把 , 在结算奖励后如果奖励不好 , 再重新load再来过 . 比如说拿红牡丹等 . 还可以在逃跑时用此法 . 随 ...

  9. python开发第二篇 :python基础

    python基础a.Python基础      -基础1. 第一句python       -python后缀名可以任意?     -导入模块时如果不是.py文件,以后的文件后缀名是.py.2.两种 ...

  10. Linux下用Bash语言实现输出最大值的功能

    题目链接: 题目描述 编写一个程序,输入a.b.c三个值,输出其中最大值. 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 30 复习下Linux ...