MapReduce——数据切片与MapTask并行度决定机制

发布于:2024-04-24 ⋅ 阅读:(26) ⋅ 点赞:(0)

MapReduce——数据切片与MapTask并行度决定机制


MapReduce 数据切片和 Map 任务的并行度决定机制是 MapReduce 框架中两个重要的概念,它们直接影响作业的执行效率和性能。

1.数据切片(Data Splits

  • 数据切片是指将输入数据拆分成更小的块或片段,以便并行处理。

  • 在 MapReduce 中,数据切片是由 InputFormat 定义的,InputFormat 是负责将输入数据逻辑上分成独立的块并交给 Map 任务处理的组件。

  • 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

  • 数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储

  • 数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask

  • 数据切片的大小取决于多个因素,包括文件的大小、输入格式以及 Hadoop 配置中的一些参数。

  • 通常情况下,数据切片的大小会被设置为 HDFS 块大小的整数倍,以便尽可能地利用 Hadoop 分布式文件系统的数据复制和数据本地性特性。


2.并行度问题

MapTask 的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。

思考:

  • 1G的数据,启动8个MapTask,可以提高集群的并发处理能力。
  • 那么1K的数据,也启动8个MapTask,会提高集群性能吗?
  • MapTask并行任务是否越多越好呢?
  • 哪些因素影响了MapTask并行度?

3.Map 任务的并行度决定机制

  • Map 任务的并行度取决于数据切片的数量和集群的可用资源。

  • 在运行时,MapReduce 框架会为每个数据切片启动一个 Map 任务,这些任务可以并行执行。

  • 但是,并不是每个数据切片都会有一个独立的 Map 任务,因为有时候数据切片的数量可能会超过集群中可用的 Map 任务槽(slots)数量

  • 在 Hadoop 中,默认情况下,一个数据切片会有一个 Map 任务来处理,但是这个规则并不是绝对的。

  • 有时候,框架可能会选择将多个数据切片分配给一个 Map 任务,以减少任务启动和管理的开销。这种情况下,一个 Map 任务会处理多个数据切片,但是任务的处理时间可能会更长。

  • Map 任务的并行度也受到集群资源的限制,包括可用的计算节点数量、每个节点的 CPU 和内存资源等。

  • 如果集群资源有限,那么可能无法同时启动足够数量的 Map 任务,这样就会影响作业的并行度和执行效率。


4.TextInputFormat

FileInputFormat 实现类

  • 思考:在运行MapReduce 程序时,输入的文件格式包括:基于行的日志文件、二进制格式文件、数据库表等。
  • 那么,针对不同的数据类型,MapReduce是如何读取这些数据的呢?
  • FileInputFormat 常见的接口实现类包括TextInputFormatKeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等。

TextInputFormat 是 Hadoop 中的一种输入格式类,用于处理文本文件。它将文本文件视为一系列的行(即文本文件中的每一行都作为一个记录),并将每行作为一个键值对的键,其中键是文件中的偏移量(即行在文件中的位置),值是文本行内容。

工作原理

TextInputFormat 的工作原理如下:

  1. 切片: 切片是输入数据在 MapReduce 作业中的基本处理单元。TextInputFormat 默认按文件进行切片,每个文件作为一个切片。(大量小文件则处理效率很低)因此,如果输入目录包含多个文件,每个文件将会被视为一个独立的切片。

  2. 记录读取: 在每个切片内部,TextInputFormat 会将文本文件按行进行读取。它将每一行文本作为一个记录,并将文件中的偏移量作为记录的键。因此,每个键值对的键是一个长整型数值,表示文本行在文件中的位置;值是一个字符串,表示文本行的内容。

  3. 生成键值对: TextInputFormat 将每一行文本转换为一个键值对,其中键是文件中的偏移量,值是文本行内容。

  4. 传递给 Mapper: 生成的键值对将会作为 Mapper 的输入。Mapper 将会按照用户定义的逻辑对每个键值对进行处理,并生成中间结果。

示例

假设有一个文本文件包含以下内容:

Hello, world!
This is a sample text file.

使用 TextInputFormat 作为输入格式,该文件将被切分为两个记录(即两行文本),每个记录将被表示为一个键值对:

  • 键:0,值:“Hello, world!”
  • 键:15,值:“This is a sample text file.”

这些键值对将作为 Mapper 的输入,并根据用户定义的逻辑进行处理。例如,可以编写一个 Mapper,计算每个单词出现的次数,然后将结果传递给 Reducer 进行进一步处理。


5.CombineTextInputFormat 切片机制

框架默认的TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。

CombineTextInputFormat 是 Hadoop 中的一个输入格式类,用于处理文本文件。CombineTextInputFormat 用于小文件过多的场景,它的主要特点是将小文件进行合并,并生成更大的数据块,从而减少作业的 Map 任务数量,提高作业的执行效率。

与普通的 TextInputFormat 不同,CombineTextInputFormat 旨在减少由于小文件过多而导致的 Map 任务数量过多、任务启动慢、作业执行效率低下等问题。

切片机制详解

CombineTextInputFormat 的切片机制主要有以下特点:

  1. 按文件大小切片: 与普通的 TextInputFormat 类似,CombineTextInputFormat 也是按文件为单位进行切片的。每个输入文件都被视为一个独立的切片。

  2. 按行切片: 在文件内部,CombineTextInputFormat 将文件按行进行切片,与 TextInputFormat 相同。每行文本将被视为一个记录,并生成一个键值对。

  3. 合并小文件: CombineTextInputFormat 的一个关键特性是它会尝试合并小文件生成更大的切片。这样可以减少作业中 Map 任务的数量,提高作业的执行效率。合并小文件的具体方式取决于两个参数的配置:

    • mapreduce.input.fileinputformat.split.minsize:指定切片的最小大小。如果一个小文件的大小小于该阈值,它将会被合并到其他切片中。
    • mapreduce.input.fileinputformat.split.maxsize:指定切片的最大大小。如果一个文件过大,超过了该阈值,它将被拆分成更小的切片。
  4. 根据输入目录中文件的大小动态调整切片: CombineTextInputFormat 会根据输入目录中文件的大小动态调整切片的大小和数量,以尽可能地合并小文件。

示例

假设有一个输入目录包含了多个小文件,每个文件都是几百 KB 大小。如果使用 CombineTextInputFormat 作为输入格式,并设置了合适的参数,那么它会将这些小文件合并成更大的切片,并将其作为一个整体交给 Map 任务进行处理。这样做可以大大减少作业中 Map 任务的数量,提高作业的执行效率。

总之,CombineTextInputFormat 的切片机制通过合并小文件,生成更大的切片,从而减少作业的 Map 任务数量,提高作业的执行效率,特别适用于处理大量小文件的场景。

通过合并小文件并生成更大的切片,CombineTextInputFormat 可以减少作业中 Map 任务的数量,从而提高作业的执行效率。同时,它也能够更好地利用 Hadoop 分布式文件系统的数据本地性特性,减少数据传输的开销。