📜  Hadoop – MapReduce 中的映射器

📅  最后修改于: 2021-10-27 06:39:23             🧑  作者: Mango

Map-Reduce是一种编程模型,主要分为Map PhaseReduce Phase两个阶段。它旨在并行处理分布在各种机器(节点)上的数据。 Hadoop Java程序由Mapper 类和Reducer 类以及驱动程序类组成。 Hadoop Mapper 是一个函数或任务,用于处理来自文件的所有输入记录并生成作为 Reducer 输入的输出。它通过返回新的键值对来产生输出。输入数据必须转换为键值对,因为 Mapper 无法处理原始输入记录或元组(键值对)。在将输入记录作为键值对处理时,映射器还会生成一些小数据块。我们将讨论 Mapper 中发生的各种过程,有关键特性以及如何在 Mapper 中生成键值对。

我们来了解一下 Map-Reduce 中的 Mapper:

Hadoop Map-Reduce 中的映射器

Mapper 是一个简单的用户定义程序,它按照设计对输入拆分执行一些操作。 Mapper 是一个基类,需要开发者或程序员根据组织的要求在他的代码行中进行扩展。需要在 Mapper 类参数下提及输入和输出类型,需要由开发人员修改。

例如:

Class MyMappper extends Mapper

Mapper 是最初与输入数据集交互的初始代码行。假设,如果我们正在分析的数据集有 100 个数据块,那么在这种情况下,将有 100 个 Mapper 程序或进程在机器(节点)上并行运行并产生自己的输出,称为中间输出,然后将其存储在本地磁盘,而不是 HDFS。映射器的输出作为 Reducer 的输入,它对数据执行一些排序和聚合操作并产生最终输出。

Mapper主要由5个组件组成:Input、Input Splits、Record Reader、Map和Intermediate output disk。地图任务在所有这些可用组件的贡献下完成。

  1. 输入:输入是用于分析目的的记录或数据集。这个 Input 数据是在InputFormat的帮助下设置的。它有助于识别存储在 HDFS(Hadoop 分布式文件系统)中的输入数据的位置。
  2. Input-Splits:它们负责将物理输入数据转换为某种逻辑形式,以便 Hadoop Mapper 可以轻松处理它。 Input-Splits 是在InputFormat的帮助下生成的。一个大数据集被分成许多输入分割,这取决于输入数据集的大小。将为每个输入拆分分配一个单独的映射器。 Input-Splits 仅引用输入数据,这些不是实际数据。数据块都不是决定一个地图,减少输入分割数的唯一因素。我们可以在作业执行时在mapred.max.split.size属性中手动配置输入拆分的大小。每个数据块都使用所有这些输入拆分。输入拆分的大小以字节为单位。每个输入拆分都存储在某个内存位置(主机名字符串)。 Map-Reduce 将地图任务尽可能靠近拆分的位置。首先执行较大尺寸的输入拆分,以便可以最小化作业运行时间。
  3. Record-Reader: Record-Reader 是处理从输入拆分中获得的输出并生成它自己的输出作为键值对直到文件结束的过程。在 Record-Reader 的帮助下,文件中的每一行都将被分配字节偏移量。默认情况下,Record-Reader 使用TextInputFormat将从 input-splits 获得的数据转换为键值对,因为 Mapper 只能处理键值对。
  4. Map:从 Record-Reader 获得的键值对然后被提供给 Map,它生成一组中间键值对对。
  5. 中间输出盘:最后,中间键值对输出会作为中间输出存储在本地磁盘上。无需将数据存储在 HDFS 上,因为它是中间输出。如果我们将这些数据存储到 HDFS 上,那么由于它的复制功能,写入成本会更高。它还增加了它的执行时间。如果以某种方式终止了正在执行的作业,那么在这种情况下,清理 HDFS 上可用的这个中间输出也很困难。中间输出始终存储在本地磁盘上,一旦作业完成执行,该磁盘将被清除。在本地磁盘上,此 Mapper 输出首先存储在默认大小为 100MB 的缓冲区中,该缓冲区可以使用io.sort.mb 属性进行配置。当且仅当作业仅是 Map 作业时,映射器的输出可以写入 HDFS,在这种情况下,将没有 Reducer 任务,因此中间输出是我们可以写入 HDFS 的最终输出。可以使用 job.setNumReduceTasks(0) 手动将 Reducer 任务的数量设为零。此 Mapper 输出对最终用户没有用,因为它是仅对 Reducer 有用的临时输出。

如何计算Hadoop中Mapper的数量:

例如:对于大小为 10TB(数据大小)的文件,其中每个数据块的大小为 128 MB(输入拆分大小),Mapper 的数量约为 81920。