读书笔记2:Hadoop组件-(3)读与写

本文深入探讨了 MapReduce 的数据处理机制,重点介绍了如何使用 Hadoop 处理大型文件数据,包括文件分片策略、输入输出格式的选择及自定义方式。详细解释了不同 InputFormat 如 TextInputFormat、KeyValueText、SequenceFile 等的实现及使用场景,同时阐述了 OutputFormat 类如 TextOutputFormat、SequenceFileOutputFormat 的作用和配置方法。

 

4,读和写

MapReduce读取输入数据以及写入数据支持多种数据格式。输入数据通常驻留在较大的文件中(通常是几十或者几百 GB 甚至更大), MapReduce 处理数据的原理是将其分割成为块,这些块可以在多个计算机上并行处理,在 hadoop 中这样的操作被称为“分片”。每个分片足够小以实现更细粒度的并行,但是也不能太小,否则启动和停止各个分片处理所需的时间开销比较大。

Hadoop读取文件使用 FSDataInputStream 而不是用 DataInputStream 是因为 FSDataInputStreamDataInputStream 进行了改进, FSDataInputStream 可以实现随机读取,这就更加符合 hadoop 处理数据的“分块”策略了。

Hadoop默认将每一行作为一条记录,而键值分别为改行的字节偏移和内容。也许不会所有的数据都如此记录,所以 hadoop 支持多种数据格式,也支持自定义数据格式。

<1>InputFormat

Hadoop分割和读取文件的方式被定义在 InputFormat 接口的一个实现中。 TextInputFormatInputFormat 的一个默认的实现。

常用的InputFormat 的实现类:

TextInputFormat

在文本文件中的每一行为一个记录,键为一行的字节偏移,值为一行的内容

Key: LongWritable

Value: Text

KeyValueText InputFormat

在文本文件中的每一行为一个记录,以每行的第一个分隔符为界,分隔符之前的是键,之后的是值,分离器在属性key,value.separator.in.input.line 中设定,默认为制表符 (\t)

Key:Text

Value:Text

SequenceFile InputFormat<K,V>

用于读取序列文件的InputFormat 。键和值由用户定义。序列文件为 Hadoop 专用的压缩二进制文件格式,他专用于一个 MapReduce 作业和其他 MapReduce 作业之间传递数据。

Key, Value :用户自定义

NLine InputFormat

TextInputFormat 相同,但每个分片一定有 N 行, N 在属性 mapred.line.input.format.linespermap 中设定,默认是 1

Key: LongWritable

Value:Text

Hadoop 分割和读取文件的格式是 KeyValueText InputFormat时,那么 Mapper 中的 map 方法就必须得有新的实现来符合这个新的键的类型。(因为当分割读取格式为 T ext InputFormat时, key 的类型是 LongWirtable ,而分割读取格式为 KeyValueText InputFormat时, key 的类型是 Text ,所以 map 方法的实现要改)

注意:对于MapReduce 的输入的数据不一定都来自于外部,可能这个 MapReduce 的输入数据是其他 MapReduce 的输出数据。并且你还可以按照自己的要求去定义自定义的 InputFormat

<2>OutputFormat

MapReduce 输出数据到文件时,用到的是 OutputFormat 类,输出无需分片,输出文件放在一个公用目录中,通常被命名为 part-nnnnn( 这里的 nnnnnreducer 的分区 ID)

RecordWirter将输出结果进行格式化,为 RecoreReader 对输入格式进行解析。

所有的OutputFormat 都是从 FileOutputFormat 继承来的

所有的InputFormat 都是从 FileInputFormat 继承来的

 

你可以通过调用JobConf 对象的 setOutputFormat 方法来定制 OutputFormat

以下是常用的OutputFormat 的实现类:

TextOutputFormat<K,V>

将每个记录写为一行文本,键和值已字符串形式写入,已制表符分割。这个分隔符可以在属性mapred.textoutputformat.sqparator 中修改

SequeneceFileOutputFormat<K,V>

Hadoop 专有序列文件格式写入键值对,与 SequenceFileInputFormat 配合使用

NullOutputFormat<K,V>

无输出

SequenceFileOutputFormat是以 序列文件格式输出数据,使其可以通过 SequenceFileInputFormat来读取,有助于通过中间数据结果将 MapReduce 作业串起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值