Hadoop RecordReader

1. Hadoop RecordReader

在本章中,我们将讨论Hadoop MapReduce的重要概念,即RecordReader。 Hadoop中的MapReduce RecordReader采用面向字节的文件作为输入,由InputSplit提供,并为Mapper的提供记录。它使用由InputSplit创建的边界内的数据并创建Key-value对。

本章讨论什么是Hadoop中的RecordReader,Hadoop RecordReader如何工作以及Hadoop RecordReader的类型 – SequenceFileRecordReader和Line RecordReader,Hadoop中记录的最大大小。

2.什么是Hadoop RecordReader?

为了理解Hadoop中的RecordReader,我们需要了解Hadoop数据流。那么,让我们看看Hadoop中的数据流如何?

MapReduce有一个简单的数据处理模型。 map和reduce函数的输入和输出是键值对。 Hadoop MapReduce中的map和reduce函数具有以下一般形式:

Map:(K1,V1)→列表(K2,V2)

Reduce:(K2,列表(V2))→列表(K3,V3)

在处理之前,它需要知道要处理哪些数据,这是通过InputFormat类实现的。 InputFormat是从HDFS中选择应该输入到map函数的文件的类。 InputFormat还负责创建InputSplits并将它们划分为记录。数据分为HDFS中的数据分割(通常大小为64 / 128mb)。这称为inputsplit,它是由单个mapper处理的输入。

InputFormat类调用getSplits()函数并计算每个文件的拆分,然后将它们发送到JobTracker,JobTracker使用它们的存储位置来安排mapper任务以在TaskTracker上处理它们。然后,Map任务将inputsplit传递给task track中InputFormat的createRecordReader()方法,以获取该split的RecordReader。 RecordReader从源数据装载数据并将其转换成适合Mapper读取的键值对。

Hadoop RecordReader使用由inputsplit创建的边界内的数据,并为映射器创建Key-value对。 “start”是RecordReader应该开始生成键/值对的文件中的字节位置,“end”是它应该停止读取记录的位置。在Hadoop RecordReader中,数据从其源中加载,然后数据转换为适合Mapper读取的键值对。它与inputsplit进行通信,直到文件读取未完成。

3. Hadoop RecordReader如何工作?

现在让我们看看Hadoop中RecordReader的工作。

RecordReader不仅仅是对记录的迭代器,map任务使用一条记录来生成传递给map函数的键值对。 我们可以通过使用映射器的run函数来看到这一点:

public?void?run(Context?context)?throws?IOException,InterruptedException{
??setup(context);
??while(context.nextKeyValue()){
??map(context.setCurrentKey(),context.getCurrentValue(),context)
??}
??cleanup(context);
}

运行setup()后,nextKeyValue()将在context上重复,以填充mapper的键和值对象。 键和值通过上下文从RecordReader中检索并传递给map()方法以完成其工作。 mapper的输入是键值对(K,V),按照mapper代码中提到的逻辑进行处理。 当记录到达记录末尾时,nextKeyValue()方法返回false。

RecordReader通常停留在inputsplit创建的边界之内以生成键值对,但这不是强制性的。 自定义实现甚至可以在输入分割之外读取更多数据,但不鼓励这样做。

4. MapReduce中Hadoop RecordReader的类型

RecordReader实例由InputFormat定义。默认情况下,它使用TextInputFormat将数据转换为键值对。 TextInputFormat提供了两种类型的RecordReader:

4.1 ?LineRecordReader

Hadoop中的Line RecordReader是textInputFormat提供的默认RecordReader,它将输入文件的每一行视为新值,关联的键为字节偏移量。

4.2 ?SequenceFileRecordReader

它读取由序列文件头部指定的数据。

5.单个记录的最大大小

单个记录的最大尺寸允许处理。该值可以使用下面的参数进行设置。

conf.setInt("mapred.linerecordreader.maxlength",Integer.MAX_VALUE);

尺寸大于此值的record(默认值为2,147,483,647)将被忽略。

Hadoop RecordReader

发表评论

邮箱地址不会被公开。 必填项已用*标注

三 × = 六

滚动到顶部