解读:标准输入/输出格式

输入格式类InputFormat

用于描述MR作业的输入规范,主要功能:输入规范检查(比如输入文件目录的检查)、对数据文件进行输入切分和从输入分块中将数据记录逐一读取出来、并转化为Map输入的键值对。

  • getSplits()方法返回List<InputSplit>集合,作用是将输入文件在逻辑上划分为多个输入分片。
  • createRecordReader()方法返回一个RecordReader对象,该对象用来将InputSplit解析成若干个key/value对。MR框架在Map Task执行过程中,会不断调用RecordReader对象中的方法,迭代获取key/value对并交给map()函数处理。【此方法在更为具体的子类中实现,如TextInputFormat】

FileInputFormat类

主要功能是为子类提供统一的getSplits()方法实现。其中最核心的两个算法是:

1).文件切分算法. 主要用于确定InputSplit的个数以及每个InputSplit对应的数据段。FileInputFormat以文件为单位切分生成各个InputSplit,对于每个文件,由三个属性值确定其对应的InputSplit的个数。详见Job流程:决定map个数的因素

2).host选择算法. 待InputSplit切分方案确定后,下一步确定每个InputSplit的元数据信息。这通常由四部分组成:<file,start,length,hosts>,分别表示InputSplit所在的文件、起始位置、字节长度以及所在的host(节点)列表。其中,前三项很容易确定,难点在于host列表的选择方法。

  虽然InputSplit对应的block可能位于多个节点上,但考虑到任务调度的效率,通常不会把所有节点加到InputSplit的host列表中,而是选择包含该InputSplit数据总量最大的前几个节点(默认是10个,多余的过滤掉),以作为任务调度时判断任务是否具有本地性的主要凭证。为此,FileInputFormat设计了一个简单有效的启发式算法:

  1. 按照rack包含的数据量对rack进行排序
  2. 在rack内部按照每个node包含的数据量对node排序
  3. 取前N个node的host作为InputSplit的host列表,这里的N为block副本数

例子:某个Hadoop集群的网络拓扑图如图所示,HDFS中block副本数为3,某个InputSplit包含3个block,大小依次是100、150和75,很容易计算,4个rack包含的(该InputSplit的)数据量分别是175、250、150和75。rack2中的node3和node4,rack1中的node1将被添加到该InputSplit的host列表中。

host选择算法过程:对4个rock包含(该InputSplit的)数据量的大小进行排序:rock2 > rock1 > rock3 > rock4,所以选择 rock2 中node3和node4的file1和file2,rack1中node1的file3加载到该InputSplit的host列表中。

  从以上host选择算法可知,当InputSplit尺寸大于block尺寸时Map Task并不能实现完全数据本地性,也就是说,总有一部分数据需要从远程节点上读取,因而可以得出以下结论~:

当使用基于FileInputFormat实现InputFormat时,为了提高Map Task的数据本地性,应尽量使InputSplit大小与block大小相同。

TextInputFormat类

TextInputFormat继承自FileInputFormat类,间接继承自InputFormat类。TextInputFormat类中包含两个方法:

  • isSplitable()作用是判断文件是否可以被切分成输入片
  • createRecordReader()作用是读取文件的内容,返回一个LineRecordReader类的对象

LineRecordReader类中有一个initialize()方法,它用于对InputSplit进行初始化。类中的其他方法则是将其解析成一个个键值对输出。

输出格式化类OutPutFormat

OutputFormat是一个抽象类,主要用于描述输出数据的格式,将用户提供的key/value对写入特定格式的文件中。

  • getRecordWriter()方法返回一个RecordWriter类对象。该类中的write()方法接收一个key/value对,并将之写入文件。在Task执行过程中,MapReduce框架会将map()或者reduce()函数产生的结果传入write()方法。
  • checkOutputSpecs()方法在用户作业被提交到RM之前,由JobClient自动调用,以检查输出目录是否合法。
  • getOutputCommitter()方法返回一个OutputCommitter类的对象。该类是输出MR结果的提交器。

TextOutputFormat

FileOutputFormat类也是一个抽象类,具体的实现类在于TextOutputFormat类,其中包含一个LineRecordWriter的静态内部类,该类负责输出一行MR结果。

  • 第 48 行可以看出文本输出的时候使用 UTF-8 编码
  • 第 52 行表示换分行的符号是“\n”
  • 第 71 行的构造方法可以看出,输出键值对的默认分隔符是制表符“\t”.通过代码conf.set("mapreduce.output.textoutputformat.separator", "******");自定义输出的分隔符。

时间: 2024-11-05 14:59:33

解读:标准输入/输出格式的相关文章

C的日记-标准输入输出格式和控制

[标准输入函数格式] 基本格式字符:%d:有符号十进制整数:%u无符号十进制整数:%c单个字符:%s字符串(字符存放到数组+结束位):%e实数:.--------------------------------------------------------------------------------------------------------------------1.scanf("%d%d%d",&a,&b,&c);    格式化符[无间隔/有空格隔

『Go基础』第6节 注释

在上一节中, 我们学会了怎样写一个 Hello Go . 但是, 大家有可能还没有明白为什么那么写, 下面我们通过注释来了解一下. 注释的重要性不再过多赘述, 一段不写注释的代码读起来实在难受. 那么Go语言的注释应该怎么写呢? 1. 单行注释 单行注释就是对代码中的一行进行注释. 用 // 表示 单行注释: // 注释的内容 2. 多行注释 多行注释就是对代码中两行及以上的代码进行注释. 用 /* */ 表示 多行注释: /* 注释 的 内容*/ 了解了注释的内容之后, 我们通过注释对上一节代

快速解读GC日志(转)

本文是 Plumbr 发行的 Java垃圾收集手册 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM使用串行垃圾收集器, 并使用下面的启动参数让 JVM 打印出详细的GC日志: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps 这样配置以后,发生GC时输出的日志就类似于下面这种格式(为了显示方便,已手工折行): 20

Jsoup代码解读之三-Document的输出

Jsoup代码解读之三-Document的输出 Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前,我们不妨先想想,“tidy HTML"到底包括哪些东西: 换行,块级标签习惯上都会独占一行 缩进,根据HTML标签嵌套层数,行首缩进会不同 严格的标签闭合,如果是可以自闭合的标签并且没有内容,则进行自闭合 HTML实体的转义 这里要补充一下HTML标签的知识.HTML Tag可以分为block和inl

Linux crontab的解读和使用

linux 定时执行crontab  crontab -e 进入一个vi 编辑界面 在最后一行加上 */30 * * * * netstat > /tmp/net.log 表示每隔30分就执行netstat命令,并把执行结果存入net.log中. Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序 使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务

Log4j配置文件解读和模板页收藏

最近对log4j的日志配置小有兴趣,仔细研究了下,终于有了清晰的认识,顺便做了个日志文件的模板,方便以后查看和使用,顺便也为那些跟我当初一样,看日志文件看得云里雾里的朋友提供点详细的简单的资料. #配置总的日志级别和输出目的:注意总的日志级别会覆盖掉下面输出目的地各自的日志级别,本人设置为空及日志级别由各子项自己控制 #A1 A2分别是输出目的地的名字:本人A1设置为控制台打印 A2设置为记录日志到文件 log4j.rootLogger= ,A1, A2 #A1输出的详细配置ConsoleApp

solr源码解读(转)

solr源码解读(转)原文地址:http://blog.csdn.net/duck_genuine/article/details/6962624 配置 solr 对一个搜索请求的的流程 在solrconfig.xml会配置一个handler.配置了前置处理组件preParams,还有后置处理组件filterResult,当然还有默认的组件 [html] view plaincopy <requestHandler name="standard" class="solr

dumpsys命令的使用及telephony.registry解读

adb shell dumpsys,默认打印出当前系统所有的service信息,通常情况下我们并不想看那么多信息,可以在后面加上具体的服务名,比如想获取关于设备电池的信息,就可以使用以下命令: >adb shell dumpsys battery Current Battery Service state: AC powered: false USB powered: true Wireless powered: false Max charging current: 0 status: 5 h

C:输入输出格式

1.输出 printf 控制输入的精度(小数点前几位,小数点后几位) ①printf("%9.2f\n", 123.0); 输出:   123.00    解读:输出占总字符数9的格式,并且小数点后保留两位小数 ②printf("%*d\n", 6, 123); 输出:   123 解读:输出占总字符数6的格式,也可以将6改为len,这样就可以控制输出格式 ③printf("%-d\n", 123); 输出:123.00 解读:强制靠左输出,不带