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
的工作原理如下:
-
切片: 切片是输入数据在 MapReduce 作业中的基本处理单元。
TextInputFormat
默认按文件进行切片,每个文件作为一个切片。(大量小文件则处理效率很低
)因此,如果输入目录包含多个文件,每个文件将会被视为一个独立的切片。 -
记录读取: 在每个切片内部,
TextInputFormat
会将文本文件按行进行读取。它将每一行文本作为一个记录,并将文件中的偏移量作为记录的键。因此,每个键值对的键是一个长整型数值,表示文本行在文件中的位置;值是一个字符串,表示文本行的内容。 -
生成键值对:
TextInputFormat
将每一行文本转换为一个键值对,其中键是文件中的偏移量,值是文本行内容。 -
传递给 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
的切片机制主要有以下特点:
-
按文件大小切片: 与普通的
TextInputFormat
类似,CombineTextInputFormat
也是按文件为单位进行切片的。每个输入文件都被视为一个独立的切片。 -
按行切片: 在文件内部,
CombineTextInputFormat
将文件按行进行切片,与TextInputFormat
相同。每行文本将被视为一个记录,并生成一个键值对。 -
合并小文件:
CombineTextInputFormat
的一个关键特性是它会尝试合并小文件,生成更大的切片。这样可以减少作业中 Map 任务的数量,提高作业的执行效率。合并小文件的具体方式取决于两个参数的配置:-
mapreduce.input.fileinputformat.split.minsize
:指定切片的最小大小。如果一个小文件的大小小于该阈值,它将会被合并到其他切片中。 -
mapreduce.input.fileinputformat.split.maxsize
:指定切片的最大大小。如果一个文件过大,超过了该阈值,它将被拆分成更小的切片。
-
-
根据输入目录中文件的大小动态调整切片:
CombineTextInputFormat
会根据输入目录中文件的大小动态调整切片的大小和数量,以尽可能地合并小文件。
示例
假设有一个输入目录包含了多个小文件,每个文件都是几百 KB 大小。如果使用 CombineTextInputFormat
作为输入格式,并设置了合适的参数,那么它会将这些小文件合并成更大的切片,并将其作为一个整体交给 Map 任务进行处理。这样做可以大大减少作业中 Map 任务的数量,提高作业的执行效率。
总之,CombineTextInputFormat
的切片机制通过合并小文件,生成更大的切片,从而减少作业的 Map 任务数量,提高作业的执行效率,特别适用于处理大量小文件的场景。
通过合并小文件并生成更大的切片,CombineTextInputFormat
可以减少作业中 Map 任务的数量,从而提高作业的执行效率。同时,它也能够更好地利用 Hadoop 分布式文件系统的数据本地性特性,减少数据传输的开销。